/*** 二次验签*/public boolean checkSign(HttpServletRequest request, String alipayPublicCertPath) throws AlipayApiException {Map<String, String> params = new HashMap<String, String>();Map requestParams = request.getParameterMap();for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");params.put(name, valueStr);}/**公钥模式验证签名* boolean verify_result = AlipaySignature.rsaCheckV1(params, "publicKey", "UTF-8", "RSA2");* **//**证书模式验签方法**/boolean verify_result = AlipaySignature.rsaCertCheckV1(params, rechargeCommon.downloadCert(alipayPublicCertPath), "UTF-8", "RSA2");return verify_result;}/*** 证书模式*/public AlipayClient certAlipayClient(PaySetVO paySetVO) {/** 初始化 **/CertAlipayRequest certAlipayRequest = new CertAlipayRequest();/** 支付宝网关 **/certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");/** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/certAlipayRequest.setAppId(paySetVO.getAliAppId());/** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/certAlipayRequest.setPrivateKey(paySetVO.getPrivateKey());/** 应用公钥证书路径,下载后保存位置的绝对路径 **/certAlipayRequest.setCertPath(rechargeCommon.downloadCert(paySetVO.getAliCertPath()));/** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/certAlipayRequest.setAlipayPublicCertPath(rechargeCommon.downloadCert(paySetVO.getAliPublicCertPath()));/** 支付宝根证书路径,下载后保存位置的绝对路径 **/certAlipayRequest.setRootCertPath(rechargeCommon.downloadCert(paySetVO.getAliRootCertPath()));/** 设置签名类型 **/certAlipayRequest.setSignType("RSA2");/** 设置请求格式,固定值json **/certAlipayRequest.setFormat("json");/** 设置编码格式 **/certAlipayRequest.setCharset("UTF-8");AlipayClient alipayClient = null;try {alipayClient = new DefaultAlipayClient(certAlipayRequest);} catch (AlipayApiException e1) {e1.printStackTrace();}return alipayClient;}/*** 公钥模式*/public AlipayClient alipayClient(PaySetVO paySetVO) {AlipayClient alipayClient = newDefaultAlipayClient("https://openapi.alipay.com/gateway.do", paySetVO.getAliAppId().trim(), paySetVO.getPrivateKey().trim(), "json", "UTF-8",paySetVO.getPublicKey().trim(), "RSA2");return alipayClient;}/*** 支付宝小程序统一下单* 1、在服务端调用  alipay.trade.create (统一收单交易创建接口),获得支付宝交易号 tradeNO* 2、 在小程序端使用 tradeNO,调用 my.tradePay 接口唤起支付宝收银台,引导用户完成支付。* 3、服务端处理回调信息* 详见文档:https://opendocs.alipay.com/mini/00arkf*/public AlipayTradeCreateResponse miniAliPay(PaySetVO paySetVO, String notifyUrl, AlipayTradeCreateModel model) {AlipayClient alipayClient = certAlipayClient(paySetVO);AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();/** 后台异步回调地址**/request.setNotifyUrl(notifyUrl);/** 设置业务参数 **/AlipayTradeCreateModel alipayTradeCreateModel = new AlipayTradeCreateModel();/** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/alipayTradeCreateModel.setOutTradeNo(model.getOutTradeNo());/** 订单金额,精确到小数点后两位 **/alipayTradeCreateModel.setTotalAmount(model.getTotalAmount());/** 订单标题 **/alipayTradeCreateModel.setSubject(model.getSubject());/** 买家唯一id **/alipayTradeCreateModel.setBuyerId(model.getBuyerId());/** 将业务参数传至request中 **/request.setBizModel(alipayTradeCreateModel);AlipayTradeCreateResponse response = null;try {response = alipayClient.certificateExecute(request);/**String trade_no = response.getTradeNo();获取返回的tradeNO。**/} catch (AlipayApiException e) {e.printStackTrace();}return response;}/*** 统一下单 h5* 1、支付信息提交到服务端,服务端生成支付表单 返回到客户端* 2、客户端拿到服务端返回from 表单 发起表单提交* 3、服务端接收处理回调信息* 详见文档 https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay?scene=common*/public AlipayTradeWapPayResponse doAliPay(PaySetVO paySetVO, AlipayTradeWapPayModel alipayTradeWapPayModel, AlipayTradeWapPayRequest alipayTradeWapPayRequest){AlipayClient alipayClient = certAlipayClient(paySetVO);/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.wap.pay(手机网站支付接口) **/AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的requestalipayRequest.setReturnUrl(alipayTradeWapPayRequest.getReturnUrl());alipayRequest.setNotifyUrl(alipayTradeWapPayRequest.getNotifyUrl());/** 设置业务参数 **/AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();/** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/model.setOutTradeNo(alipayTradeWapPayModel.getOutTradeNo());/** 销售产品码,固定值:QUICK_WAP_WAY **/model.setProductCode("QUICK_WAP_WAY");/** 订单标题 **/model.setSubject(alipayTradeWapPayModel.getSubject());/** 订单金额,精确到小数点后两位 **/model.setTotalAmount(alipayTradeWapPayModel.getTotalAmount());/** 订单描述 **/model.setBody(alipayTradeWapPayModel.getBody());/** 业务扩展参数 **///ExtendParams extendParams = new ExtendParams();/** 系统商编号,填写服务商的PID,返佣参数传值前提:传值账号需要签约返佣协议,用于isv商户。 **///extendParams.setSysServiceProviderId("2088511****07846");/** 花呗参数,传值前提:必须有该接口花呗收款准入条件,且需签约花呗分期 **//** 指定可选期数,只支持3/6/12期,还款期数越长手续费越高 **/// extendParams.setHbFqNum("3");/** 指定手续费承担方式,手续费可以由用户全承担(该值为0),也可以商户全承担(该值为100),但不可以共同承担,即不可取0和100外的其他值。 **///extendParams.setHbFqSellerPercent("0");//model.setExtendParams(extendParams);/** 将业务参数传至request中 **/alipayRequest.setBizModel(model);AlipayTradeWapPayResponse wapPayResponse = null;try {wapPayResponse = alipayClient.pageExecute(alipayRequest);/**获取需提交的form表单 客户端拿到submitFormData做表单提交   String submitFormData = response.getBody();**/} catch (AlipayApiException e) {e.printStackTrace();}return wapPayResponse;// String form = "";// try {//     //调用SDK生成表单//     form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单// } catch (AlipayApiException e) {//     e.printStackTrace();// }// //直接将完整的表单html输出到页面// response.setContentType("text/html;charset=UTF-8");// response.getWriter().write(form);//直接将完整的表单html输出到页面// response.getWriter().flush();// response.getWriter().close();}- List item/*** 订单查询`加粗样式`*/public AlipayTradeQueryResponse queryOrder(PaySetVO paySetVO, AlipayTradeQueryModel alipayTradeQueryModel) {AlipayClient alipayClient = certAlipayClient(paySetVO);/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.query(统一收单线下交易查询)**/AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();/** 设置业务参数 **/AlipayTradeQueryModel model = new AlipayTradeQueryModel();/** 注:交易号(TradeNo)与订单号(OutTradeNo)二选一传入即可,如果2个同时传入,则以交易号为准 **//** 支付接口传入的商户订单号。如:2020061601290011200000140004 **/model.setOutTradeNo(alipayTradeQueryModel.getOutTradeNo());/** 异步通知/查询接口返回的支付宝交易号,如:2020061622001473951448314322 **/model.setTradeNo(alipayTradeQueryModel.getTradeNo());/** 将业务参数传至request中 **/request.setBizModel(model);/**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **///request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");AlipayTradeQueryResponse response = null;try {/** 通过alipayClient调用API,获得对应的response类 **//** 证书模式 **/response = alipayClient.certificateExecute(request);/** 公钥模式 **///response = alipayClient.execute(request);} catch (AlipayApiException e) {e.printStackTrace();}return response;/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/}/*** 单笔退款*/public AlipayTradeRefundResponse toRefund(PaySetVO paySetVO, AlipayTradeRefundModel alipayTradeRefundModel) {AlipayClient alipayClient = certAlipayClient(paySetVO);/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.refund(统一收单交易退款接口) **/AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();/** 设置业务参数 **/AlipayTradeRefundModel model = new AlipayTradeRefundModel();/** 支付接口传入的商户订单号。如:2020061601290011200000140004  交易号二选一 **/model.setOutTradeNo(alipayTradeRefundModel.getOutTradeNo());/** 退款金额,退款总金额不能大于该笔订单支付最大金额 **/model.setRefundAmount(alipayTradeRefundModel.getRefundAmount());/** 异步通知/查询接口返回的支付宝交易号,如:2020061622001473951448314322 商户订单号二选一 **/model.setTradeNo(alipayTradeRefundModel.getTradeNo());/** 如需部分退款,则此参数必传,且每次请求不能重复,如:202006230001 **/model.setOutRequestNo(WxCommonUtil.getSerialNumber());/** 将业务参数传至request中 **/request.setBizModel(model);/**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **///request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");AlipayTradeRefundResponse response = null;try {/** 通过alipayClient调用API,获得对应的response类 **//** 证书模式 **/response = alipayClient.certificateExecute(request);/** 公钥模式 **///response = alipayClient.execute(request);} catch (AlipayApiException e) {e.printStackTrace();}/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/return response;}/*** 退款查询*/public AlipayTradeFastpayRefundQueryResponse queryRefund(PaySetVO paySetVO, AlipayTradeFastpayRefundQueryModel alipayTradeFastpayRefundQueryModel) throws AlipayApiException {AlipayClient alipayClient = certAlipayClient(paySetVO);AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();/** 交易单号 和商户单号二选一**/model.setTradeNo(alipayTradeFastpayRefundQueryModel.getTradeNo());/*** 退款时的流水号* 请求退款接口时,传入的退款请求号,* 如果在退款请求时未传入,则该值为创建交易时的外部交易号* **/model.setOutRequestNo(alipayTradeFastpayRefundQueryModel.getOutRequestNo());/** 商户单号 和交易单号二选一**/model.setOutTradeNo(alipayTradeFastpayRefundQueryModel.getOutTradeNo());/** 将业务参数传至request中 **/request.setBizModel(model);AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);try {/** 证书模式 **/response = alipayClient.certificateExecute(request);/** 公钥模式 **///response = alipayClient.execute(request);} catch (AlipayApiException e) {e.printStackTrace();}/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/return response;}/*** 单笔转账*/public AlipayFundTransUniTransferResponse transfer(PaySetVO paySetVO, AlipayFundTransUniTransferModel alipayFundTransUniTransferModel, Participant payee) {AlipayClient alipayClient = certAlipayClient(paySetVO);/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.uni.transfer(单笔转账接口) **/AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();/** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/ **/AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();/** 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一 **/model.setOutBizNo(alipayFundTransUniTransferModel.getOutBizNo());/** 转账金额,TRANS_ACCOUNT_NO_PWD产品取值最低0.1 **/model.setTransAmount(alipayFundTransUniTransferModel.getTransAmount());/** 产品码,单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD **/model.setProductCode("TRANS_ACCOUNT_NO_PWD");/** 场景码,单笔无密转账到支付宝账户固定为:DIRECT_TRANSFER **/model.setBizScene("DIRECT_TRANSFER");/**备注**/model.setRemark(alipayFundTransUniTransferModel.getRemark());/** 转账业务的标题,用于在支付宝用户的账单里显示 **/model.setOrderTitle(alipayFundTransUniTransferModel.getOrderTitle());Participant participant = new Participant();/** 参与方的唯一标识,收款支付宝账号或者支付宝吧账号唯一会员ID **/participant.setIdentity(payee.getIdentity());/** 参与方的标识类型:ALIPAY_USER_ID 支付宝的会员ID **/participant.setIdentityType(payee.getIdentityType());/** 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填 **/participant.setName(payee.getName());model.setPayeeInfo(participant);/** 业务备注 **/model.setRemark("单笔转账");/** 将业务参数传至request中 **/request.setBizModel(model);AlipayFundTransUniTransferResponse response = null;try {/** 证书模式 **/response = alipayClient.certificateExecute(request);/** 公钥模式 **///response = alipayClient.execute(request);} catch (AlipayApiException e) {e.printStackTrace();}/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/return response;}/*** 转账查询*/public AlipayFundTransCommonQueryResponse queryTransfer(PaySetVO paySetVO, AlipayFundTransCommonQueryModel alipayFundTransCommonQueryModel) throws AlipayApiException {AlipayClient alipayClient = certAlipayClient(paySetVO);/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.common.query(转账业务单据查询接口) **/AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest();/** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.common.query/ **/AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel();/** 固定值:TRANS_ACCOUNT_NO_PWD:单笔无密转账到支付宝账户 **/model.setProductCode("TRANS_ACCOUNT_NO_PWD");/** 支付宝转账单据号,单笔转账接口返回 **/model.setOrderId(alipayFundTransCommonQueryModel.getOrderId());/** 描述特定的业务场景,如果传递了out_biz_no则该字段为必传,固定值:DIRECT_TRANSFER:B2C 现金红包、单笔无密转账 **/model.setBizScene("DIRECT_TRANSFER");/** 商户转账唯一订单号,单笔转账接口的入参 **/model.setOutBizNo(alipayFundTransCommonQueryModel.getOutBizNo());request.setBizModel(model);AlipayFundTransCommonQueryResponse response = null;try {/** 证书模式 **/response = alipayClient.certificateExecute(request);/** 公钥模式 **///response = alipayClient.execute(request);} catch (AlipayApiException e) {e.printStackTrace();}/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/return response;}/*** 查询用户是否已经关注生活号,支持生活号、内容号、财富号* {* "alipay_open_public_user_follow_query_response": {* "code": "10000",* "msg": "Success",* "is_follow": "T"* },* "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"* }* 用户是否关注,T代表已关注,F代表未关注*/public AlipayOpenPublicUserFollowQueryResponse queryFollowByOne(PaySetVO paySetVO, String aliUserId) {AlipayClient alipayClient = certAlipayClient(paySetVO);AlipayOpenPublicUserFollowQueryRequest request = new AlipayOpenPublicUserFollowQueryRequest();AlipayOpenPublicUserFollowQueryModel model = new AlipayOpenPublicUserFollowQueryModel();model.setUserId(aliUserId);request.setBizModel(model);AlipayOpenPublicUserFollowQueryResponse response = null;try {response = alipayClient.certificateExecute(request);} catch (AlipayApiException e) {e.printStackTrace();}return response;}-----------------------------------调用demo-----------------------------------------/*** 支付宝支付** @param httpResponse,sellerId* @return*/@GetMapping("/pay")@ApiOperation("统一下单")public void getPagePay(HttpServletResponse httpResponse, Integer sellerId) throws Exception {PaySetVO paySetVO = paySetService.findAll(sellerId);AlipayTradeWapPayModel wapPayModel = new AlipayTradeWapPayModel();AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的requestalipayRequest.setReturnUrl(wxApiConfig.getInterfacePath() + "alipay/callbackWeb");alipayRequest.setNotifyUrl(wxApiConfig.getInterfacePath() + "alipay/callback");String orderNum = WxCommonUtil.getTimeOrderNum();wapPayModel.setOutTradeNo(orderNum);wapPayModel.setBody("商品名称");wapPayModel.setSubject("//商品标题/交易标题/订单标题/订单关键字等");wapPayModel.setTotalAmount("0.01");AlipayTradeWapPayResponse response= alipayApi.doAliPay(paySetVO, wapPayModel, alipayRequest);response.getBody(); //返回到前端提交表单即可}/*** 支付宝后台回调** @param* @return*/@PostMapping(value = "/callback")public void alipayNotify(HttpServletRequest request, HttpServletResponse respons) throws Exception {//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");log.info("-------out_trade_no-------" + out_trade_no);log.info("-------trade_no-------" + trade_no);PaySetVO paySetVO = paySetService.findAll(2);if (alipayApi.checkSign(request, paySetVO.getAliPublicCertPath())) {//验证成功//请在这里加上商户的业务逻辑程序代码if (trade_status.equals("TRADE_FINISHED")) {log.info("-------支付宝回调成功-------");//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序//注意://如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知//如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。} else if (trade_status.equals("TRADE_SUCCESS")) {log.info("-------支付宝回调成功-------");//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序//注意://如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。}respons.getWriter().println("success");} else {//验证失败respons.getWriter().println("failure");}}/*** 支付宝前台回调 也可以直接在retrun_url 配置成功页面地址** @param request* @return*/@GetMapping(value = "/callbackWeb")public String callbackWeb(HttpServletRequest request) throws Exception {//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");PaySetVO paySetVO = paySetService.findAll(2);if (alipayApi.checkSign(request, paySetVO.getAliPublicCertPath())) {//验证成功//请在这里加上商户的业务逻辑程序代码//该页面可做页面美工编辑// out.clear();// out.println("验证成功<br />");log.info("-------支付宝前台回调成功-------");return "交易成功";} else {//该页面可做页面美工编辑// out.clear();// out.println("验证失败");log.info("-------支付宝前台回调失败-------");return "交易失败";}}/*** 交易查询* 商家可调用 alipay.trade.query(统一收单线下交易查询)接口,通过商户网站唯一订单号* out_trade_no 或支付宝交易号 trade_no 查询对应订单支付情况** @param out_trade_no or trade_no (二选一)*/@GetMapping("/queryOrder")@ApiOperation("交易查询")public AlipayTradeQueryResponse queryOrder(Integer sellerId, String out_trade_no) {PaySetVO paySetVO = paySetService.findAll(sellerId);AlipayTradeQueryModel alipayTradeQueryModel = new AlipayTradeQueryModel();alipayTradeQueryModel.setOutTradeNo(out_trade_no);//订单号AlipayTradeQueryResponse response = alipayApi.queryOrder(paySetVO, alipayTradeQueryModel);if (response.isSuccess()) {log.info("---查询成功----");response.getTotalAmount();//交易的订单金额,单位为元,两位小数。该参数的值为支付时传入的total_amountresponse.getOutTradeNo();//商家订单号response.getTradeNo();//支付宝交易号//  交易状态:WAIT_BUYER_PAY// (交易创建,等待买家付款)、TRADE_CLOSED//  (未付款交易超时关闭,或支付完成后全额退款)//  、TRADE_SUCCESS(交易支付成功)//  、TRADE_FINISHED(交易结束,不可退款)String trade_status = response.getTradeStatus();} else {String sub_code = response.getSubCode();//错误码String sub_msg = response.getSubMsg();//错误码描述}return response;}/*** 退款的途径按照支付途径原路返回;* 支付渠道为花呗、余额等退款即时到账;* 银行卡的退款时间以银行退款时间为准,一般情况下 2 小时内可到账;* 开发者也可以在商家中心(b.alipay.com)中退款;* 退款是否成功可以根据同步响应的 fund_change 参数来判断,返回值为 Y 则表示退款成功;* 退款接口会根据外部请求号 out_request_no 幂等返回,因此同一笔交易需要多次部分退款时,必须使用不同的 out_request_no* aphttps://opendocs.alipay.com/apis/api_1/alipay.trade.refund** @param out_trade_no or trade_no (二选一)*                     out_request_no,refund_amount*/@GetMapping("/refund")@ApiOperation("订单退款")public AlipayTradeRefundResponse refund(Integer sellerId, String out_trade_no, String refund_amount) throws AlipayApiException {PaySetVO paySetVO = paySetService.findAll(sellerId);AlipayTradeRefundModel alipayTradeRefundModel = new AlipayTradeRefundModel();alipayTradeRefundModel.setRefundAmount(refund_amount);//退款金额alipayTradeRefundModel.setOutTradeNo(out_trade_no);//订单号AlipayTradeRefundResponse response = alipayApi.toRefund(paySetVO, alipayTradeRefundModel);if (response.isSuccess() && response.getFundChange().equals("Y")) {log.info("---退款成功----" + response);//退款成功response.getOutTradeNo();//退款商户单号response.getTradeNo();//退款交易单号response.getRefundFee();//退款总金额response.getGmtRefundPay();//退款时间 Date类型} else {//退款异常String sub_code = response.getSubCode();//错误码String sub_msg = response.getSubMsg();//错误描述}return response;}/*** 退款订单查询** @param sellerId alipayTradeFastpayRefundQueryModel* @return*/@GetMapping("/queryRefund")@ApiOperation("订单退款查询")public AlipayTradeFastpayRefundQueryResponse queryRefund(Integer sellerId, AlipayTradeFastpayRefundQueryModel alipayTradeFastpayRefundQueryModel) throws AlipayApiException {PaySetVO paySetVO = paySetService.findAll(sellerId);AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();/** 交易单号 和商户单号二选一**/model.setTradeNo(alipayTradeFastpayRefundQueryModel.getTradeNo());/*** 退款时的流水号* 请求退款接口时,传入的退款请求号,* 如果在退款请求时未传入,则该值为创建交易时的外部交易号* **/model.setOutRequestNo(alipayTradeFastpayRefundQueryModel.getOutRequestNo());/** 商户单号 和交易单号二选一**/model.setOutTradeNo(alipayTradeFastpayRefundQueryModel.getOutTradeNo());AlipayTradeFastpayRefundQueryResponse response = alipayApi.queryRefund(paySetVO, model);if (response.isSuccess()) {response.getTotalAmount();//该笔退款所对应的交易的订单金额response.getRefundAmount();//本次退款请求,对应的退款金额response.getOutTradeNo();//创建交易传入的商户订单号response.getTradeNo();//支付宝交易号response.getRefundReason();//退款原因log.info("---退款成功---" + response);} else {//查询失败response.getSubCode();//错误码码response.getSubMsg();//错误描述}log.info("----订单退款查询结果---" + response);return response;}/*** 转账到余额** @param sellerId* @retrun*/@GetMapping("/transfer")@ApiOperation("转账到余额")public void transfer(Integer sellerId) throws AlipayApiException {PaySetVO paySetVO = paySetService.findAll(sellerId);AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();//商户自定义的唯一订单号model.setOutBizNo(WxCommonUtil.getTimeOrderNum());//订单总金额,单位为元,精确到小数点后两位model.setTransAmount("0.01");//转账业务的标题,用于在支付宝用户的账单里显示 (选填)model.setOrderTitle("测试转账");//业务备注 (选填)model.setRemark("测试转账");//收款方账户(必填)Participant payee = new Participant();//参与方的标识类型,目前支持如下枚举:1、ALIPAY_USER_ID 支付宝的会员ID// 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式 (必填)payee.setIdentityType("ALIPAY_USER_ID");//参与方的标识ID,比如支付宝用户UID。 (必填)payee.setIdentity("2088612545861215");AlipayFundTransUniTransferResponse response = alipayApi.transfer(paySetVO, model, payee);if (response.isSuccess() && response.getStatus().equals("SUCCESS")) {log.info("----测试转账成功------");} else {log.info("----测试转账失败 重新查单------");String outBizNo = response.getOutBizNo();//商户订单号String orderId = response.getOrder
Id();//支付宝转账订单号//调用查询接口查询数据AlipayFundTransCommonQueryModel queryModel = new AlipayFundTransCommonQueryModel();queryModel.setOutBizNo(outBizNo); //商户订单号queryModel.setOrderId(orderId);AlipayFundTransCommonQueryResponse queryResponse = alipayApi.queryTransfer(paySetVO, queryModel);if (response.isSuccess() && response.getStatus().equals("SUCCESS")) {log.info("----查询转账订单---转账成功" + queryResponse);} else {log.info("----查询转账订单---转账失败" + queryResponse);}}}

支付宝手机网站支付、支付查询、退款、退款查询、转账接口整合相关推荐

  1. 【支付宝支付】Java实现支付宝手机网站支付流程

    前言 微信登录网页授权与APP授权 微信JSAPI支付 微信APP支付 微信APP和JSAPI退款 支付宝手机网站支付 支付宝APP支付 支付宝退款 以上我都放到个人公众号,搜一搜:JAVA大贼船,文 ...

  2. Laravel 集成支付宝手机网站支付

    前期准备: 1.下载SDK,里面还有Demo,可以参照Demo里面的内容快速接入 支付宝 手机网站支付SDK&Demo 2.把下载的zip文件解压,放到项目目录里,这里作者放在app文件夹里, ...

  3. 支付宝手机网站支付实战踩坑

    准备 需求 需求就是最简单的对接支付宝支付接口 方案心路历程 简单用http对接一下,不过想了一下觉得第三方提供的SDK总是不用,所以打算尝试一下 支付宝新版SDK,从文档到git再安装到使用,然后放 ...

  4. 4 支付宝手机网站支付demo讲解

    目录 1 引言 2 业务流程 3 用户下单 4 商户系统处理订单信息 5 支付宝向用户展示支付信息 6 用户付款 7 同步通知与异步通知 1 引言 前面三小节我们已经学过如何使用支付宝手机网站支付的功 ...

  5. 支付--支付宝手机网站支付(WAP)

    介绍: 这是放在微信供公众号内的一个项目,支付模块设计到微信公众号支付和支付宝手机网站支付,这次把支付宝手机网站支付整理下来. 文档: 支付宝手机网站支付的开发文档: https://docs.ope ...

  6. PHP接入支付宝手机网站支付、移动支付接口

    payment 项目2.0版本 前面已经说完了 PHP接入支付宝 即时到帐接口 回调接口也已经完成.这篇主要讲 手机网站支付 . 移动支付 接口的调用.调用方式与即时到帐 基本一样. 关于代码部分的详 ...

  7. php手机网站支付宝_PHP实现支付宝手机网站支付功能

    PHP实现支付宝手机网站支付功能的方法:首先开通支付宝商家中心里面的手机网站支付:然后进入开发者中心,获取到APPID:接着去文档中心下载"DEMO":最后将"demo& ...

  8. 支付宝手机网站支付出现系统繁忙,请稍后再试

    今日在做一个文件搞定支付宝系列时,其中在做支付宝手机网站兼容微信浏览器时,遇到了不少坑,这里详细记录一下. 1.验签出错 按照支付宝提供的demo(alipay_in_weixin_demo),里面只 ...

  9. 支付宝手机网站支付补全信息提示 系统综合评估签约条件不满足解决

    申请支付宝 手机网站支付 成功后需补全经营信息,但是补全提交时提示  "系统综合评估签约条件不满足解决",需要检查下自己的支付宝账号是否满足以下申请条件: 1.申请前必须拥有经过实 ...

  10. 对接支付宝手机网站支付接口,alin10071

    最近项目要增加支付宝扫二维码实现h5支付的功能,我们采用了调用支付宝手机网站支付接口:alipay.trade.wap.pay 但是每次调起返回都是 无可用支付方式 测了一天才发现是因为我的支付宝余额 ...

最新文章

  1. ORM学员管理系统单表查询示例
  2. python做logistic回归_用Python做Logistic回归
  3. 算法一:求两个数的和
  4. 做excel的时候要快速按照纬度的角度来分析构建:一个词语“纬度”
  5. python函数编程实战_(转)函数式编程实战教程(Python版)
  6. python版本差异_python的版本的差别 2,3
  7. OpenCV 像素的读取与操作
  8. Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)
  9. 【华为云技术分享】五个Taurus垃圾回收compactor优化方案,减少系统资源占用
  10. php 序列化 java_JAVA之序列化
  11. filter过滤器_不了解布隆过滤器?一文给你整的明明白白
  12. ubuntu-12.04.5-desktop-amd64.iso:ubuntu-12.04.5-desktop-amd64:安装Oracle11gR2
  13. 判断滚动条到底部的JS代码
  14. 2021年皓丽新品- 86KD1 86寸纳米智慧黑板(电容屏)-产品说明
  15. selected和checked区别
  16. HDU-6357Hills And Valleys(用最长可重复公共子序列求最长非递减子序列)
  17. 使用HC05蓝牙模块实现数据无线传输,看完包会
  18. MySQL组件和数据结构
  19. android图片加载过程,教你写Android ImageLoader框架之图片加载与加载策略
  20. 怎么把html图片改成jpg格式吗,怎样把照片变成JPG格式?

热门文章

  1. 电子邮件格式怎么填写,创建一个标准的电子邮箱邮件格式怎么注册
  2. java-简易计算器设计
  3. php删除头尾空,分享php中去除头尾空格的2种方法
  4. 基于Python-OpenCV的图片覆盖技术——即把一个图片P到另一个图片上
  5. linux arm小主机,超级迷你!采用ARM处理器的电脑主板
  6. 磷酸铁锂电池充电过压保护
  7. 2022支付宝集五福 生肖卡添福红包活动攻略
  8. 房租分期业务系统-抓住新的市场机遇
  9. nodejs01——安装及使用、服务端及客户端、commonjs规范、fs模块的使用(文件操作及目录操作)、stream、buffer、WebServer、端口、动态资源及静态资源、头信息、请求方式
  10. 苹果手机显示无法与服务器建立安全连接,苹果手机那个safari浏览器无法与访问器建立安全链接是什么意思...