JAVA 支付宝支付系统实战项目超详解

结合支付宝官网实现的 支付宝当面支付功能,非常详细看我一篇就够了

  • 1. 目的
  • 2. 说明
  • 3. 申请支付宝的账号(每个人都有做,不要用我的)
    • 3.1. 扫码登陆
    • 3.2. 账号的申请
    • 3.3. 记录你的账号
    • 3.4. 下载支付宝的测试应用(仅仅支持安卓)
    • 3.5. 使用你的测试账号登录测试版本的支付宝
      • 3.5.1. 帐号查询
      • 3.5.2. 帐号登陆
      • 3.5.3. 登陆成功之后
    • 3.6. 充钱
  • 4. 生成自己公钥和私钥并设置
    • 4.1. 下载软件
    • 4.2. 安装软件
    • 4.3. 生成公钥和密钥
    • 4.4. 设置公钥和私钥
      • 4.4.1. 找到公钥
      • 4.4.2. 设置地点
      • 4.4.3. 保存设置
      • 4.4.4. 存在疑问【私钥用在哪里】
    • 4.5. 设置完成之后的效果
    • 4.6. 保存好后面要使用
  • 5. 集成支付宝扫码的支付功能
    • 5.1. 创建项目alipay-demo
    • 5.2. 下载官方demo模拟
    • 5.3. 导入jar包和依赖
      • 5.3.1. 准备两个支付宝的核心jar包
      • 5.3.2. pom.xml
    • 5.4. 复制并修改配置文件zfbinfo.properties
    • 5.5. 创建PayService
    • 5.6. 测试支付
    • 5.7. 创建PayController回调支付成功的方法
      • 5.7.1. 下载
      • 5.7.2. 配置花生壳内网穿透
      • 5.7.1 的下载花生壳的补充
      • 5.7.3. 修改pom.xml
      • 5.7.4. 编写PayController
      • 5.7.5. 修改TestPay
      • 5.7.6. 测试结果
    • 5.8. 验证是否为支付宝调用
      • 5.8.1. 创建支付相关的常量类
    • 5.9. 测试退费
      • 5.9.1. 修改PayService
      • 5.9.2. 添加TestRefund
      • 5.9.3. 测试方式
    • 5.10. 修改PayController回调处理支付和退费逻辑
      • 5.10.1. 问题分析
      • 5.10.2. 解决方案【回调同一个接口的问题】
      • 5.10.3. 解决方案【回调多次问题】
      • 5.10.4. 修改pom.xml
      • 5.10.5. 最终PayController

1. 目的

就是为用户提供一些支付的手段,提供类似银联支付,微信支付,支付宝支付等等的手段!

2. 说明

本人概述 支付宝支付
因为支付的流程非常相似,我们会一个,别的类似的支付方式别的道理差不多

3. 申请支付宝的账号(每个人都有做,不要用我的)

https://open.alipay.com/platform/home.htm

在这里插入图片描述

3.1. 扫码登陆

在这里插入图片描述

放心填!

3.2. 账号的申请

在这里插入图片描述

3.3. 记录你的账号

在这里插入图片描述

3.4. 下载支付宝的测试应用(仅仅支持安卓)

在这里插入图片描述

安装好后的效果

在这里插入图片描述

3.5. 使用你的测试账号登录测试版本的支付宝

3.5.1. 帐号查询

在这里插入图片描述

3.5.2. 帐号登陆

3.5.3. 登陆成功之后

在这里插入图片描述

3.6. 充钱

在这里插入图片描述

4. 生成自己公钥和私钥并设置

4.1. 下载软件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2. 安装软件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.3. 生成公钥和密钥

在这里插入图片描述

4.4. 设置公钥和私钥

4.4.1. 找到公钥

在这里插入图片描述

4.4.2. 设置地点

在这里插入图片描述

在这里插入图片描述

4.4.3. 保存设置

4.4.4. 存在疑问【私钥用在哪里】

这个私钥是要配置到我们应用程序里面的,私钥很重要,不要泄露

4.5. 设置完成之后的效果

在这里插入图片描述

4.6. 保存好后面要使用

5. 集成支付宝扫码的支付功能

5.1. 创建项目alipay-demo

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.2. 下载官方demo模拟

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解压

在这里插入图片描述

5.3. 导入jar包和依赖

5.3.1. 准备两个支付宝的核心jar包

在这里插入图片描述

5.3.2. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>open-his</artifactId><groupId>com.bjsxt</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>alipay-demo</artifactId><dependencies><!--引入支付宝相关的jar包--><dependency><groupId>com.alibaba</groupId><artifactId>alipay-sdk-java</artifactId><version>3.3.0</version><scope>system</scope><systemPath>${project.basedir}/lib/alipay-sdk-java-3.3.0.jar</systemPath></dependency><dependency><groupId>com.alibaba</groupId><artifactId>alipay-trade-sdk-java</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/alipay-trade-sdk-1.0.jar</systemPath></dependency><dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version></dependency></dependencies>
</project>

5.4. 复制并修改配置文件zfbinfo.properties

在这里插入图片描述


# 支付宝网关名、partnerId和appId  注意测试和正式环境
#open_api_domain = https://openapi.alipay.com/gateway.do
open_api_domain = https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
pid = 此处请填写你的PID
appid = 2016102200737101# RSA私钥、公钥和支付宝公钥
private_key = 写你自己的私钥
public_key = 写你自己先成的公钥匙#SHA1withRsa对应支付宝公钥
#alipay_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB#SHA256withRsa对应支付宝公钥
alipay_public_key = 写支付宝的应用公钥# 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2
# 当面付最大查询次数和查询间隔(毫秒)
max_query_retry = 5
query_duration = 5000# 当面付最大撤销次数和撤销间隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000# 交易保障线程第一次调度延迟和调度间隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900

5.5. 创建PayService

package com.bjsxt.pay;import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;
import com.alipay.demo.trade.model.builder.AlipayTradeRefundRequestBuilder;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
import com.alipay.demo.trade.service.AlipayTradeService;
import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.util.HashMap;
import java.util.Map;/*** @Author: 老张* @Date: 2020/10/19 17:11* 支付类*/
public class PayService {static Log log = LogFactory.getLog("trade_precreate");static AlipayTradeService tradeService;//初始化static {// 一定要在创建AlipayTradeService之前设置参数Configs.init("zfbinfo.properties");tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();}/*** 商户操作员编号,添加此参数可以为商户操作员做销售统计*/static String operatorId = "test_operator_id";/*** (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持*/static String storeId = "test_store_id";/*** 支付超时,定义为120分钟*/static String timeoutExpress = "60m";/*** 支付的方法* @param outTradeNo  (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线, 需保证商户系统端不能重复,建议通过数据库sequence生成,* @param subject (必填) 订单标题,粗略描述用户的支付目的。如“喜士多(浦东店)消费”* @param totalAmount (必填) 订单总金额,单位为元,不能超过1亿元* @param undiscountableAmount (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段* @param body 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"* @param notifyUrl /支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置* @return*/public static Map<String,Object> pay(String outTradeNo,String subject,String totalAmount,String undiscountableAmount,String body,String notifyUrl){System.out.println(notifyUrl);AlipayTradePrecreateRequestBuilder builder =new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setTimeoutExpress(timeoutExpress).setNotifyUrl(notifyUrl);//.setNotifyUrl("http://www.test-notify-url.com");//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置//发起支付AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);Map<String,Object> map=new HashMap<>();String msg;Integer code;switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝预下单成功: )");AlipayTradePrecreateResponse res = result.getResponse();//得到支付码,本质就是一个URLString qrCode=res.getQrCode();map.put("qrCode",qrCode);msg="下单成功";code=200;break;case FAILED:log.error("支付宝预下单失败!!!");msg="下单失败";code=500;break;case UNKNOWN:log.error("系统异常,预下单状态未知!!!");msg="系统异常";code=404;break;default:log.error("不支持的交易状态,交易返回异常!!!");msg="不支持的交易状态";code=404;break;}map.put("msg",msg);map.put("code",code);return map;}/*** 退费* @param outTradeNo  外部应该交易ID* @param tradeNo  平台在支付成之后返回的平台【属于支付宝平台的ID】* @param refundAmount  退款金额* @param refundReason 退款原因* @param outRequestNo  是否支持部分退款*/public static Map<String,Object>  payBack(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String outRequestNo){AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder()//outTradeNo  tradeNo只需要有一个就行.setOutTradeNo(outTradeNo).setTradeNo(tradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason).setOutRequestNo(outRequestNo)//.setNotifyUrl(notifyUrl)//没有用 因为这个回调地址就是收费时的回调地址.setStoreId(storeId);//退费请求AlipayF2FRefundResult result = tradeService.tradeRefund(builder);Map<String,Object> map=new HashMap<>();Integer code=null;String msg="";switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝退款成功: )");code=200;msg=result.getResponse().getSubMsg();break;case FAILED:log.error("支付宝退款失败!!!");code=500;msg=result.getResponse().getSubMsg();break;case UNKNOWN:log.error("系统异常,订单退款状态未知!!!");code=500;msg=result.getResponse().getSubMsg();break;default:log.error("不支持的交易状态,交易返回异常!!!");code=500;msg=result.getResponse().getSubMsg();break;}map.put("code",code);map.put("msg",msg);return map;}
}

5.6. 测试支付

package com.bjsxt.pay;import java.util.Map;/*** @Author: 老张* @Date: 2020/10/19 17:32*/
public class TestPay {public static void main(String[] args) {String outTradeNo="OD123445571212545";String subject="医疗管理系统支付平台";String totalAmount="19";String undiscountableAmount=null;String body="买药用的";String notifyUrl="http://azxw.utools.club/pay/callback/"+outTradeNo;Map<String, Object> pay = PayService.pay(outTradeNo,subject,totalAmount,undiscountableAmount,body,notifyUrl);System.out.println(pay);}
}

5.7. 创建PayController回调支付成功的方法

5.7.1. 下载

花生壳

在这里插入图片描述

5.7.2. 配置花生壳内网穿透

在这里插入图片描述

5.7.1 的下载花生壳的补充

如果下载花生壳需要收费6元,可以选择 uTools

使用也是非常方便

在这里插入图片描述
下载成功后傻瓜式安装即可

在这里插入图片描述
在这里插入图片描述

安装好插件,ALT+空格 搜索内网穿透配置即可

在这里插入图片描述

5.7.3. 修改pom.xml


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

5.7.4. 编写PayController

package com.bjsxt.controller;import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.bjsxt.pay.AliPayConfig;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;/*** @Author: 老张* @Date: 2020/10/19 18:00*/
@RestController
@RequestMapping("pay")
public class PayController {static Log log = LogFactory.getLog("PayController");@RequestMapping("callback/{orderId}")public void callback(@PathVariable String orderId, HttpServletRequest request){Map<String, String> parameterMap = this.getParameterMap(request);String trade_status = parameterMap.get("trade_status");if ("TRADE_SUCCESS".equals(trade_status)) {try {//验证是否为支付宝发来的信息boolean singVerified = AlipaySignature.rsaCheckV1(parameterMap, AliPayConfig.alipay_public_key, AliPayConfig.charset, AliPayConfig.sign_type);//只有支付宝调用我们系统的接口才能去更新系统订单状态System.out.println(singVerified);log.info("验证签名结果{}:" + singVerified);String refund_fee = parameterMap.get("refund_fee");if (StringUtils.isNotBlank(refund_fee)) {//说明是退费System.out.println("退费成功:退费的子订单ID为:" + parameterMap.get("out_biz_no"));//更新订单状态} else {//说明支付System.out.println("收费成功,平台ID" + parameterMap.get("trade_no"));}} catch (AlipayApiException e) {e.printStackTrace();log.error(orderId + "验证签名出现异常");}}else if("WAIT_BUYER_PAY".equals(trade_status)){System.out.println("二维码已扫描,等待支付");}}/*** 获取request中的参数集合转Map* Map<String,String> parameterMap = RequestUtil.getParameterMap(request)* @param request* @return*/public Map<String, String> getParameterMap(HttpServletRequest request) {Map<String, String> map = new HashMap<>();Enumeration<String> paramNames = request.getParameterNames();while (paramNames.hasMoreElements()) {String paramName = paramNames.nextElement();String[] paramValues = request.getParameterValues(paramName);if (paramValues.length == 1) {String paramValue = paramValues[0];if (paramValue.length() != 0) {map.put(paramName, paramValue);}}}return map;}
}

5.7.5. 修改TestPay

在这里插入图片描述

5.7.6. 测试结果

当用户扫码之后会回调一次,支付成功之后会回调一次

5.8. 验证是否为支付宝调用

5.8.1. 创建支付相关的常量类

package com.bjsxt.pay;/*** @Author: 老张* @Date: 2020/10/28 11:06*/
public class AliPayConfig {//应用的ID,申请时的APPIDpublic static String appid = "应用的ID,申请时的APPID";/*** SHA256withRsa对应支付宝公钥*/public static String alipay_public_key = "注意使用自己的支付宝公钥";/*** 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa*/public static String sign_type = "RSA2";/*** 字码编码格式*/public static String charset = "utf-8";
}

5.9. 测试退费

5.9.1. 修改PayService

 /*** 退费* @param outTradeNo  外部应该交易ID* @param tradeNo  平台在支付成之后返回的平台【属于支付宝平台的ID】* @param refundAmount  退款金额* @param refundReason 退款原因* @param outRequestNo  是否支持部分退款*/public static void  payBack(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String outRequestNo){AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder().setOutTradeNo(outTradeNo)//outTradeNo  tradeNo只需要有一个就行.setTradeNo(tradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason).setOutRequestNo(outRequestNo)
//                .setNotifyUrl(notifyUrl)//没有用 因为这个回调地址就是收费时的回调地址.setStoreId(storeId);//退费请求AlipayF2FRefundResult result = tradeService.tradeRefund(builder);switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝退款成功: )");break;case FAILED:log.error("支付宝退款失败!!!");break;case UNKNOWN:log.error("系统异常,订单退款状态未知!!!");break;default:log.error("不支持的交易状态,交易返回异常!!!");break;}}

5.9.2. 添加TestRefund

package com.bjsxt.pay;import java.util.Map;/*** @Author: 老张* @Date: 2020/10/28 15:09*/
public class TestRefund {public static void main(String[] args) {String outTradeNo="OD123445571212545";String tradeNo="2020102822001463360501043581";String subject="医疗管理系统支付平台";String refudAmount="10";String refudReason="不想要了";Map<String, Object> map = PayService.payBack(outTradeNo, tradeNo, refudAmount, refudReason, "BK12345678");System.out.println(map);}
}

5.9.3. 测试方式

先收费,再使用之前的交易ID进行退费
注意退费时的回调地址默认的是支付时的回调地址,在退费时如果设置了是没有用的

5.10. 修改PayController回调处理支付和退费逻辑

5.10.1. 问题分析

  1. 支付和退费回调的是同一个接口,如何区分
  2. 回调的方法可能有多次,如:扫描二不支付会回调,支付成功会回调,退费成功会回调

5.10.2. 解决方案【回调同一个接口的问题】

收费和退费回调的传给接口的数据不一样

收费里面没有 refund_fee
退费里面有 refund_fee
解决方案是判断返回的数据里面有 refund_fee 说明是退费,否则就收费

5.10.3. 解决方案【回调多次问题】

回调多次每次的状态是不一样


String trade_status = parameterMap.get("trade_status");

可以根据状态去判断处理

5.10.4. 修改pom.xml

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>

5.10.5. 最终PayController

package com.bjsxt.pay;import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;
import com.alipay.demo.trade.model.builder.AlipayTradeRefundRequestBuilder;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
import com.alipay.demo.trade.service.AlipayTradeService;
import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.util.HashMap;
import java.util.Map;/*** @Author: 老张* @Date: 2020/10/19 17:11* 支付类*/
public class PayService {static Log log = LogFactory.getLog("trade_precreate");static AlipayTradeService tradeService;//初始化static {// 一定要在创建AlipayTradeService之前设置参数Configs.init("zfbinfo.properties");tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();}/*** 商户操作员编号,添加此参数可以为商户操作员做销售统计*/static String operatorId = "test_operator_id";/*** (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持*/static String storeId = "test_store_id";/*** 支付超时,定义为120分钟*/static String timeoutExpress = "60m";/*** 支付的方法* @param outTradeNo  (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线, 需保证商户系统端不能重复,建议通过数据库sequence生成,* @param subject (必填) 订单标题,粗略描述用户的支付目的。如“喜士多(浦东店)消费”* @param totalAmount (必填) 订单总金额,单位为元,不能超过1亿元* @param undiscountableAmount (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段* @param body 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"* @param notifyUrl /支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置* @return*/public static Map<String,Object> pay(String outTradeNo,String subject,String totalAmount,String undiscountableAmount,String body,String notifyUrl){System.out.println(notifyUrl);AlipayTradePrecreateRequestBuilder builder =new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setTimeoutExpress(timeoutExpress).setNotifyUrl(notifyUrl);//.setNotifyUrl("http://www.test-notify-url.com");//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置//发起支付AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);Map<String,Object> map=new HashMap<>();String msg;Integer code;switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝预下单成功: )");AlipayTradePrecreateResponse res = result.getResponse();//得到支付码,本质就是一个URLString qrCode=res.getQrCode();map.put("qrCode",qrCode);msg="下单成功";code=200;break;case FAILED:log.error("支付宝预下单失败!!!");msg="下单失败";code=500;break;case UNKNOWN:log.error("系统异常,预下单状态未知!!!");msg="系统异常";code=404;break;default:log.error("不支持的交易状态,交易返回异常!!!");msg="不支持的交易状态";code=404;break;}map.put("msg",msg);map.put("code",code);return map;}/*** 退费* @param outTradeNo  外部应该交易ID* @param tradeNo  平台在支付成之后返回的平台【属于支付宝平台的ID】* @param refundAmount  退款金额* @param refundReason 退款原因* @param outRequestNo  是否支持部分退款*/public static Map<String,Object>  payBack(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String outRequestNo){AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder()//outTradeNo  tradeNo只需要有一个就行.setOutTradeNo(outTradeNo).setTradeNo(tradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason).setOutRequestNo(outRequestNo)//.setNotifyUrl(notifyUrl)//没有用 因为这个回调地址就是收费时的回调地址.setStoreId(storeId);//退费请求AlipayF2FRefundResult result = tradeService.tradeRefund(builder);Map<String,Object> map=new HashMap<>();Integer code=null;String msg="";switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝退款成功: )");code=200;msg=result.getResponse().getSubMsg();break;case FAILED:log.error("支付宝退款失败!!!");code=500;msg=result.getResponse().getSubMsg();break;case UNKNOWN:log.error("系统异常,订单退款状态未知!!!");code=500;msg=result.getResponse().getSubMsg();break;default:log.error("不支持的交易状态,交易返回异常!!!");code=500;msg=result.getResponse().getSubMsg();break;}map.put("code",code);map.put("msg",msg);return map;}
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平