Skip to content

Commit 1e4293a

Browse files
author
yangzhao
committed
新增payment包 后期将继续维护支付相关功能封装,并废弃支付模块下pay包的使用
1 parent 0ec4272 commit 1e4293a

35 files changed

+2497
-12
lines changed

README.md

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,22 @@ JSON类(JsonUtil)
3636

3737
②基于redis实现分布式锁(RedisLockUtil)
3838

39-
## 5.微信、支付宝支付(common-pay)
40-
41-
使用PayFactory工厂类统一管理
42-
43-
①创建订单(createOrder)
44-
45-
②退款(refund)
46-
47-
③生成移动端调起微信和支付宝时所需要的参数(createPayParams)
48-
49-
④订单查询(queryOrder)
50-
39+
## 5.支付模块(common-pay)
40+
41+
①使用简单工厂模式实现预支付订单生成(位于com.yz.common.payment.trade.pay包下)
42+
43+
![image.png](https://upload-images.jianshu.io/upload_images/3057341-77da3dce07ca5e42.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
44+
45+
②使用建造者模式对预支付订单参数进行动态构建(位于com.yz.common.payment.trade.pay.builder包下)
46+
47+
![image.png](https://upload-images.jianshu.io/upload_images/3057341-b31a5e2f5428a365.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
48+
49+
③通过ThirdPayFactory工厂类获取PayService
50+
51+
![image.png](https://upload-images.jianshu.io/upload_images/3057341-240fecbbe6264c28.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
52+
53+
④发起预支付订单、退款、订单查询调用
54+
5155
## 6.common-web
5256

5357
①请求参数转换(非Form表单或get+参数方式):
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.yz.common.payment;
2+
3+
import com.alipay.api.AlipayApiException;
4+
import com.alipay.api.AlipayClient;
5+
import com.alipay.api.DefaultAlipayClient;
6+
import com.alipay.api.request.AlipayTradeQueryRequest;
7+
import com.alipay.api.request.AlipayTradeRefundRequest;
8+
import com.alipay.api.response.AlipayTradeQueryResponse;
9+
import com.alipay.api.response.AlipayTradeRefundResponse;
10+
import com.yz.common.payment.config.AliPayConfig;
11+
import com.yz.common.payment.config.PayConfig;
12+
import com.yz.common.payment.order.query.OrderQueryResponse;
13+
import com.yz.common.payment.trade.pay.TradePay;
14+
import com.yz.common.payment.trade.pay.bo.AliTradePayResponse;
15+
import com.yz.common.payment.trade.pay.bo.TradePayResponse;
16+
import com.yz.common.payment.trade.pay.bo.UserOrder;
17+
import com.yz.common.payment.trade.pay.builder.AliTradePayBuilder;
18+
import com.yz.common.payment.trade.pay.builder.AliTradePayParamsBuilder;
19+
import com.yz.common.payment.trade.pay.params.TradePayParams;
20+
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
24+
/**
25+
* @author: yangzhao
26+
* @Date: 2019/7/10 19:18
27+
* @Description:
28+
*/
29+
public class AliPayServiceImpl implements PayService {
30+
31+
32+
@Override
33+
public PayConfig getPayConfig(Integer orderFrom) {
34+
return null;
35+
}
36+
37+
@Override
38+
public TradePayResponse tradePayOrder(UserOrder userOrder, String notifyUrl, String returnUrl) throws Exception {
39+
AliPayConfig aliPayConfig= (AliPayConfig) getPayConfig(userOrder.getOrderFrom());
40+
TradePay tradePay = AliTradePayBuilder.builder().aliPayConfig(aliPayConfig).payType(userOrder.getPayType()).build();
41+
TradePayParams tradePayParams = AliTradePayParamsBuilder.builder().userOrder(userOrder).notifyUrl(notifyUrl).returnUrl(returnUrl).build();
42+
AliTradePayResponse tradePayResponse = (AliTradePayResponse) tradePay.createTradePay(tradePayParams);
43+
return tradePayResponse;
44+
}
45+
46+
@Override
47+
public boolean refund(String orderNum) {
48+
//TODO 根据实际业务参数填写
49+
Integer orderFrom=0;
50+
AliPayConfig aliPayConfig= (AliPayConfig) getPayConfig(orderFrom);
51+
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",aliPayConfig.getAppId(),aliPayConfig.getAppPrivateKey(),"json",aliPayConfig.getCharset(),aliPayConfig.getAliPayPublicKey(),"RSA2");
52+
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
53+
Map<String,String> bizContent = new HashMap<>();
54+
bizContent.put("out_trade_no",orderNum);
55+
String refundAmount="";
56+
bizContent.put("refund_amount",refundAmount);
57+
AlipayTradeRefundResponse response = null;
58+
try {
59+
response = alipayClient.execute(request);
60+
if(!response.isSuccess()){
61+
return false;
62+
}
63+
} catch (AlipayApiException e) {
64+
logger.error("调用支付宝退款失败 ====> "+e.getErrMsg());
65+
}
66+
return true;
67+
}
68+
69+
@Override
70+
public OrderQueryResponse orderQuery(String orderNum) throws AlipayApiException {
71+
//TODO 根据实际业务参数填写
72+
Integer orderFrom=0;
73+
AliPayConfig aliPayConfig= (AliPayConfig) getPayConfig(orderFrom);
74+
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",aliPayConfig.getAppId(),aliPayConfig.getAppPrivateKey(),"json",aliPayConfig.getCharset(),aliPayConfig.getAliPayPublicKey(),"RSA2");
75+
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
76+
request.setBizContent("{\"out_trade_no\":\""+orderNum+"\"}");
77+
AlipayTradeQueryResponse response = alipayClient.execute(request);
78+
if(!response.isSuccess()){
79+
return null;
80+
}
81+
return null;
82+
}
83+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.yz.common.payment;
2+
3+
import com.alipay.api.AlipayApiException;
4+
import com.yz.common.core.exception.HandlerException;
5+
import com.yz.common.payment.config.PayConfig;
6+
import com.yz.common.payment.order.query.OrderQueryResponse;
7+
import com.yz.common.payment.trade.pay.bo.TradePayResponse;
8+
import com.yz.common.payment.trade.pay.bo.UserOrder;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
/**
13+
*
14+
* @author: yangzhao
15+
* @Date: 2019/7/10 11:01
16+
* @Description:
17+
*/
18+
public interface PayService {
19+
20+
public static final Logger logger = LoggerFactory.getLogger(PayService.class);
21+
22+
/**
23+
* 通过订单来源获取支付配置信息
24+
* @param orderFrom
25+
* @return
26+
*/
27+
public PayConfig getPayConfig(Integer orderFrom);
28+
29+
/**
30+
* 统一支付下单
31+
* @param userOrder
32+
* @param notifyUrl 回调url
33+
* @param returnUrl 返回页面url
34+
* @return
35+
* @throws Exception
36+
*/
37+
public TradePayResponse tradePayOrder(UserOrder userOrder, String notifyUrl, String returnUrl) throws Exception;
38+
39+
/**
40+
* 通过订单号退款
41+
* @param orderNum
42+
*/
43+
public boolean refund(String orderNum) throws HandlerException;
44+
45+
/**
46+
* 订单查询
47+
* @param orderNum
48+
* @return
49+
*/
50+
public OrderQueryResponse orderQuery(String orderNum) throws AlipayApiException, HandlerException;
51+
52+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.yz.common.payment;
2+
3+
4+
import com.yz.common.payment.enums.PayChannelEnum;
5+
6+
/**
7+
* @author: yangzhao
8+
* @Date: 2019/7/15 15:47
9+
* @Description:
10+
*/
11+
public class ThirdPayFactory {
12+
13+
private static WXPayServiceImpl wxPayService;
14+
15+
private static AliPayServiceImpl aliPayService;
16+
17+
public void setWxPayServiceImpl(WXPayServiceImpl wxPayServiceImpl) {
18+
ThirdPayFactory.wxPayService = wxPayServiceImpl;
19+
}
20+
public void setAliPayService(AliPayServiceImpl aliPayServiceImpl) {
21+
ThirdPayFactory.aliPayService = aliPayService;
22+
}
23+
24+
public static PayService getPayService(int payChannel){
25+
if (payChannel== PayChannelEnum.WX_PAY.getCode()){
26+
return wxPayService;
27+
}else if (payChannel==PayChannelEnum.ALI_PAY.getCode()){
28+
return aliPayService;
29+
}
30+
return null;
31+
}
32+
33+
}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package com.yz.common.payment;
2+
3+
import com.yz.common.core.exception.HandlerException;
4+
import com.yz.common.core.utils.HttpUtil;
5+
import com.yz.common.payment.config.PayConfig;
6+
import com.yz.common.payment.config.WXPayConfig;
7+
import com.yz.common.payment.constants.WXPayConstant;
8+
import com.yz.common.payment.enums.PayTypeEnum;
9+
import com.yz.common.payment.order.query.OrderQueryResponse;
10+
import com.yz.common.payment.order.query.WxOrderQueryResponse;
11+
import com.yz.common.payment.trade.pay.TradePay;
12+
import com.yz.common.payment.trade.pay.bo.TradePayResponse;
13+
import com.yz.common.payment.trade.pay.bo.UserOrder;
14+
import com.yz.common.payment.trade.pay.bo.WXTradePayResponse;
15+
import com.yz.common.payment.trade.pay.builder.WXTradePayBuilder;
16+
import com.yz.common.payment.trade.pay.builder.WXTradePayParamsBuilder;
17+
import com.yz.common.payment.trade.pay.params.TradePayParams;
18+
import com.yz.common.payment.utils.WXPayUtil;
19+
20+
import java.util.HashMap;
21+
import java.util.Map;
22+
import java.util.UUID;
23+
24+
/**
25+
* 微信支付实现
26+
* @author: yangzhao
27+
* @Date: 2019/7/10 19:20
28+
* @Description:
29+
*/
30+
public class WXPayServiceImpl implements PayService {
31+
32+
33+
@Override
34+
public PayConfig getPayConfig(Integer orderFrom) {
35+
return null;
36+
}
37+
38+
@Override
39+
public TradePayResponse tradePayOrder(UserOrder userOrder, String notifyUrl, String returnUrl) throws Exception {
40+
Integer orderFrom = userOrder.getOrderFrom();
41+
42+
WXPayConfig wxPayConfig = (WXPayConfig) getPayConfig(orderFrom);
43+
TradePay tradePay = WXTradePayBuilder.newInstance().payType(userOrder.getPayType()).wxPayConfig(wxPayConfig).build();
44+
WXTradePayParamsBuilder wxTradePayParamsBuilder = WXTradePayParamsBuilder.newInstance().notifyUrl(notifyUrl).userOrder(userOrder);
45+
46+
if (PayTypeEnum.JS.getCode()==userOrder.getPayType().intValue()){
47+
//TODO 根据实际业务参数填写用户open_id
48+
String openId="";
49+
wxTradePayParamsBuilder.openId(openId);
50+
}
51+
TradePayParams tradePayParams = wxTradePayParamsBuilder.build();
52+
WXTradePayResponse wxTradePayResponse = (WXTradePayResponse) tradePay.createTradePay(tradePayParams);
53+
return wxTradePayResponse;
54+
}
55+
56+
@Override
57+
public boolean refund(String orderNum) throws HandlerException {
58+
//TODO 根据实际业务参数填写
59+
Integer orderFrom=0;
60+
WXPayConfig wxPayConfig = (WXPayConfig) getPayConfig(orderFrom);
61+
Map<String,String> requestParams = new HashMap<>();
62+
requestParams.put("appid",wxPayConfig.getAppId());
63+
requestParams.put("mch_id",wxPayConfig.getMchId());
64+
requestParams.put("nonce_str", UUID.randomUUID().toString().replace("-",""));
65+
requestParams.put("out_trade_no",orderNum);
66+
//TODO 自行计算填写
67+
Double totalFee=0.0;
68+
//TODO 自行计算填写
69+
Double refundFee=0.0;
70+
requestParams.put("total_fee",totalFee.toString());
71+
requestParams.put("refund_fee",refundFee.toString());
72+
Map<String, String> resultMap = null;
73+
try {
74+
String sign = WXPayUtil.generateSignature(requestParams, wxPayConfig.getMchKey());
75+
requestParams.put("sign",sign);
76+
String xml = WXPayUtil.mapToXml(requestParams);
77+
String resultXml = HttpUtil.sendPost(WXPayConstant.DOMAIN_API + WXPayConstant.REFUND_URL_SUFFIX, xml);
78+
resultMap = WXPayUtil.xmlToMap(resultXml);
79+
} catch (Exception e) {
80+
logger.error(e.getMessage());
81+
return false;
82+
}
83+
84+
if (resultMap.get("return_code").toString().equals("SUCCESS")&&resultMap.get("result_code").toString().equals("SUCCESS")){
85+
return true;
86+
}
87+
return false;
88+
}
89+
90+
@Override
91+
public OrderQueryResponse orderQuery(String orderNum) throws HandlerException {
92+
//TODO 根据实际业务参数填写
93+
Integer orderFrom=0;
94+
WXPayConfig wxPayConfig = (WXPayConfig) getPayConfig(orderFrom);
95+
Map<String,String> requestParams = new HashMap<>();
96+
requestParams.put("appid",wxPayConfig.getAppId());
97+
requestParams.put("mch_id",wxPayConfig.getMchId());
98+
requestParams.put("nonce_str", UUID.randomUUID().toString().replace("-",""));
99+
requestParams.put("out_trade_no",orderNum);
100+
Map<String, String> resultMap = null;
101+
try {
102+
String sign = WXPayUtil.generateSignature(requestParams, wxPayConfig.getMchKey());
103+
requestParams.put("sign",sign);
104+
String xml = WXPayUtil.mapToXml(requestParams);
105+
String resultXml = HttpUtil.sendPost(WXPayConstant.DOMAIN_API + WXPayConstant.ORDERQUERY_URL_SUFFIX, xml);
106+
resultMap = WXPayUtil.xmlToMap(resultXml);
107+
} catch (Exception e) {
108+
logger.error(e.getMessage());
109+
return null;
110+
}
111+
if (resultMap.get("return_code").toString().equals("SUCCESS")&&resultMap.get("result_code").toString().equals("SUCCESS")){
112+
WxOrderQueryResponse response = new WxOrderQueryResponse();
113+
response.setTradeType(resultMap.get("trade_type"));
114+
response.setTradeState(resultMap.get("trade_state"));
115+
response.setTotalFee(resultMap.get("total_fee"));
116+
response.setCashFee(resultMap.get("cash_fee"));
117+
response.setTransactionId(resultMap.get("transaction_id"));
118+
response.setOutTradeNo(resultMap.get("out_trade_no"));
119+
response.setTimeEnd(resultMap.get("time_end"));
120+
response.setTradeStateDesc(resultMap.get("trade_state_desc"));
121+
return response;
122+
}
123+
return null;
124+
}
125+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.yz.common.payment.config;
2+
3+
/**
4+
* @author: yangzhao
5+
* @Date: 2019/7/10 14:24
6+
* @Description:
7+
*/
8+
public class AliPayConfig extends PayConfig {
9+
10+
/**
11+
* 支付宝分配给开发者的应用ID
12+
*/
13+
private String appId;
14+
/**
15+
* 请求使用的编码格式
16+
*/
17+
private String charset="utf-8";
18+
/**
19+
* 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
20+
*/
21+
private String signType="RSA2";
22+
23+
private String appPrivateKey;
24+
25+
private String aliPayPublicKey;
26+
27+
public String getAppId() {
28+
return appId;
29+
}
30+
31+
public void setAppId(String appId) {
32+
this.appId = appId;
33+
}
34+
35+
public String getCharset() {
36+
return charset;
37+
}
38+
39+
public void setCharset(String charset) {
40+
this.charset = charset;
41+
}
42+
43+
public String getSignType() {
44+
return signType;
45+
}
46+
47+
public void setSignType(String signType) {
48+
this.signType = signType;
49+
}
50+
51+
public String getAppPrivateKey() {
52+
return appPrivateKey;
53+
}
54+
55+
public void setAppPrivateKey(String appPrivateKey) {
56+
this.appPrivateKey = appPrivateKey;
57+
}
58+
59+
public String getAliPayPublicKey() {
60+
return aliPayPublicKey;
61+
}
62+
63+
public void setAliPayPublicKey(String aliPayPublicKey) {
64+
this.aliPayPublicKey = aliPayPublicKey;
65+
}
66+
}

0 commit comments

Comments
 (0)