Commit 6e3aa8a7524781e50d60093d165310bff509bab3

Authored by YunaiV
1 parent 1ed6656b

完善 PayClientFactoryImpl 的实现,增加创建 PayClient 的方法

Showing 14 changed files with 217 additions and 100 deletions
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayChannelDO.java
1 package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant; 1 package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant;
2 2
3 -import cn.iocoder.yudao.framework.sms.core.enums.PayChannelCodeEnum; 3 +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 import lombok.Data; 6 import lombok.Data;
@@ -23,7 +23,7 @@ public class PayChannelDO extends BaseDO { @@ -23,7 +23,7 @@ public class PayChannelDO extends BaseDO {
23 /** 23 /**
24 * 渠道编码 24 * 渠道编码
25 * 25 *
26 - * 枚举 {@link PayChannelCodeEnum} 26 + * 枚举 {@link PayChannelEnum}
27 */ 27 */
28 private String code; 28 private String code;
29 /** 29 /**
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderDO.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order;
3 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; 3 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO;
4 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; 4 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO;
5 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; 5 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
6 -import cn.iocoder.yudao.framework.sms.core.enums.PayChannelCodeEnum; 6 +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
7 import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum; 7 import cn.iocoder.yudao.coreservice.modules.pay.enums.order.PayOrderStatusEnum;
8 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 8 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
9 import com.baomidou.mybatisplus.annotation.TableName; 9 import com.baomidou.mybatisplus.annotation.TableName;
@@ -49,7 +49,7 @@ public class PayOrderDO extends BaseDO { @@ -49,7 +49,7 @@ public class PayOrderDO extends BaseDO {
49 /** 49 /**
50 * 渠道编码 50 * 渠道编码
51 * 51 *
52 - * 枚举 {@link PayChannelCodeEnum} 52 + * 枚举 {@link PayChannelEnum}
53 */ 53 */
54 private String channelCode; 54 private String channelCode;
55 55
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayRefundDO.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order;
3 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO; 3 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayAppDO;
4 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO; 4 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO;
5 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO; 5 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
6 -import cn.iocoder.yudao.framework.sms.core.enums.PayChannelCodeEnum; 6 +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
7 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 7 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
8 import lombok.Data; 8 import lombok.Data;
9 9
@@ -51,7 +51,7 @@ public class PayRefundDO extends BaseDO { @@ -51,7 +51,7 @@ public class PayRefundDO extends BaseDO {
51 /** 51 /**
52 * 商户编码 52 * 商户编码
53 * 53 *
54 - * 枚举 {@link PayChannelCodeEnum} 54 + * 枚举 {@link PayChannelEnum}
55 */ 55 */
56 private String channelCode; 56 private String channelCode;
57 /** 57 /**
yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml
@@ -68,5 +68,12 @@ @@ -68,5 +68,12 @@
68 <version>4.1.9.B</version> 68 <version>4.1.9.B</version>
69 </dependency> 69 </dependency>
70 <!-- TODO 芋艿:清理 --> 70 <!-- TODO 芋艿:清理 -->
  71 +
  72 + <!-- Test 测试相关 -->
  73 + <dependency>
  74 + <groupId>cn.iocoder.boot</groupId>
  75 + <artifactId>yudao-spring-boot-starter-test</artifactId>
  76 + <scope>test</scope>
  77 + </dependency>
71 </dependencies> 78 </dependencies>
72 </project> 79 </project>
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/PayClientFactory.java
@@ -22,6 +22,7 @@ public interface PayClientFactory { @@ -22,6 +22,7 @@ public interface PayClientFactory {
22 * @param channelCode 渠道编码 22 * @param channelCode 渠道编码
23 * @param config 支付配置 23 * @param config 支付配置
24 */ 24 */
25 - void createOrUpdatePayClient(Long channelId, String channelCode, PayClientConfig config); 25 + <Config extends PayClientConfig> void createOrUpdatePayClient(Long channelId, String channelCode,
  26 + Config config);
26 27
27 } 28 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/PayClientFactoryImpl.java
1 package cn.iocoder.yudao.framework.pay.core.client.impl; 1 package cn.iocoder.yudao.framework.pay.core.client.impl;
2 2
  3 +import cn.hutool.core.lang.Assert;
3 import cn.iocoder.yudao.framework.pay.core.client.PayClient; 4 import cn.iocoder.yudao.framework.pay.core.client.PayClient;
4 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig; 5 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
5 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; 6 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
  7 +import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
  8 +import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayQrPayClient;
  9 +import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayWapPayClient;
  10 +import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig;
  11 +import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPubPayClient;
  12 +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
  13 +import lombok.extern.slf4j.Slf4j;
6 14
7 import java.util.concurrent.ConcurrentHashMap; 15 import java.util.concurrent.ConcurrentHashMap;
8 import java.util.concurrent.ConcurrentMap; 16 import java.util.concurrent.ConcurrentMap;
@@ -12,22 +20,52 @@ import java.util.concurrent.ConcurrentMap; @@ -12,22 +20,52 @@ import java.util.concurrent.ConcurrentMap;
12 * 20 *
13 * @author 芋道源码 21 * @author 芋道源码
14 */ 22 */
  23 +@Slf4j
15 public class PayClientFactoryImpl implements PayClientFactory { 24 public class PayClientFactoryImpl implements PayClientFactory {
16 25
17 /** 26 /**
18 * 支付客户端 Map 27 * 支付客户端 Map
19 * key:渠道编号 28 * key:渠道编号
20 */ 29 */
21 - private final ConcurrentMap<Long, AbstractPayClient> channelIdClients = new ConcurrentHashMap<>(); 30 + private final ConcurrentMap<Long, AbstractPayClient<?>> channelIdClients = new ConcurrentHashMap<>();
22 31
23 @Override 32 @Override
24 public PayClient getPayClient(Long channelId) { 33 public PayClient getPayClient(Long channelId) {
25 - return null; 34 + AbstractPayClient<?> client = channelIdClients.get(channelId);
  35 + if (client == null) {
  36 + log.error("[getPayClient][渠道编号({}) 找不到客户端]", channelId);
  37 + }
  38 + return client;
26 } 39 }
27 40
28 @Override 41 @Override
29 - public void createOrUpdatePayClient(Long channelId, String channelCode, PayClientConfig config) { 42 + @SuppressWarnings("unchecked")
  43 + public <Config extends PayClientConfig> void createOrUpdatePayClient(Long channelId, String channelCode,
  44 + Config config) {
  45 + AbstractPayClient<Config> client = (AbstractPayClient<Config>) channelIdClients.get(channelId);
  46 + if (client == null) {
  47 + client = this.createPayClient(channelId, channelCode, config);
  48 + client.init();
  49 + channelIdClients.put(client.getId(), client);
  50 + } else {
  51 + client.refresh(config);
  52 + }
  53 + }
30 54
  55 + @SuppressWarnings("unchecked")
  56 + private <Config extends PayClientConfig> AbstractPayClient<Config> createPayClient(
  57 + Long channelId, String channelCode, Config config) {
  58 + PayChannelEnum channelEnum = PayChannelEnum.getByCode(channelCode);
  59 + Assert.notNull(channelEnum, String.format("支付渠道(%s) 为空", channelEnum));
  60 + // 创建客户端
  61 + switch (channelEnum) {
  62 + case WX_PUB: return (AbstractPayClient<Config>) new WXPubPayClient(channelId, (WXPayClientConfig) config);
  63 + case ALIPAY_WAP: return (AbstractPayClient<Config>) new AlipayWapPayClient(channelId, (AlipayPayClientConfig) config);
  64 + case ALIPAY_QR: return (AbstractPayClient<Config>) new AlipayQrPayClient(channelId, (AlipayPayClientConfig) config);
  65 + }
  66 + // 创建失败,错误日志 + 抛出异常
  67 + log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", config);
  68 + throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", config));
31 } 69 }
32 70
33 } 71 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.java
1 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; 1 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
2 2
3 import cn.iocoder.yudao.framework.common.exception.ErrorCode; 3 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  4 +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
4 import cn.iocoder.yudao.framework.pay.core.client.AbstractPayCodeMapping; 5 import cn.iocoder.yudao.framework.pay.core.client.AbstractPayCodeMapping;
5 6
  7 +import java.util.Objects;
  8 +
6 /** 9 /**
7 * 支付宝的 PayCodeMapping 实现类 10 * 支付宝的 PayCodeMapping 实现类
8 * 11 *
@@ -12,6 +15,9 @@ public class AlipayPayCodeMapping extends AbstractPayCodeMapping { @@ -12,6 +15,9 @@ public class AlipayPayCodeMapping extends AbstractPayCodeMapping {
12 15
13 @Override 16 @Override
14 protected ErrorCode apply0(String apiCode, String apiMsg) { 17 protected ErrorCode apply0(String apiCode, String apiMsg) {
  18 + if (Objects.equals(apiCode, "10000")) {
  19 + return GlobalErrorCodeConstants.SUCCESS;
  20 + }
15 return null; 21 return null;
16 } 22 }
17 23
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; 5 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
6 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; 6 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
7 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; 7 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
  8 +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
8 import com.alipay.api.AlipayApiException; 9 import com.alipay.api.AlipayApiException;
9 import com.alipay.api.AlipayConfig; 10 import com.alipay.api.AlipayConfig;
10 import com.alipay.api.DefaultAlipayClient; 11 import com.alipay.api.DefaultAlipayClient;
@@ -27,8 +28,8 @@ public class AlipayQrPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt; @@ -27,8 +28,8 @@ public class AlipayQrPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt;
27 28
28 private DefaultAlipayClient client; 29 private DefaultAlipayClient client;
29 30
30 - public AlipayQrPayClient(Long channelId, String channelCode, AlipayPayClientConfig config) {  
31 - super(channelId, channelCode, config, new AlipayPayCodeMapping()); 31 + public AlipayQrPayClient(Long channelId, AlipayPayClientConfig config) {
  32 + super(channelId, PayChannelEnum.ALIPAY_QR.getCode(), config, new AlipayPayCodeMapping());
32 } 33 }
33 34
34 @Override 35 @Override
@@ -61,29 +62,8 @@ public class AlipayQrPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt; @@ -61,29 +62,8 @@ public class AlipayQrPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt;
61 log.error("[unifiedOrder][request({}) 发起支付失败]", toJsonString(reqDTO), e); 62 log.error("[unifiedOrder][request({}) 发起支付失败]", toJsonString(reqDTO), e);
62 return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); 63 return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping);
63 } 64 }
64 -  
65 - System.out.println(response.getBody());  
66 - System.out.println(response.getQrCode());  
67 -  
68 - // TODO 芋艿:sub Code 65 + // TODO 芋艿:sub Code 需要测试下各种失败的情况
69 return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); 66 return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);
70 } 67 }
71 68
72 - public static void main(String[] args) {  
73 - AlipayPayClientConfig config = new AlipayPayClientConfig();  
74 - config.setAppId("2021000118634035");  
75 - config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX);  
76 - config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);  
77 - config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");  
78 - config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");  
79 - AlipayQrPayClient client = new AlipayQrPayClient(1L, "biu", config);  
80 - client.init();  
81 -  
82 - PayOrderUnifiedReqDTO reqDTO = new PayOrderUnifiedReqDTO();  
83 - reqDTO.setAmount(123);  
84 - reqDTO.setSubject("IPhone 13");  
85 - reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis()));  
86 - client.unifiedOrder(reqDTO);  
87 - }  
88 -  
89 } 69 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; 5 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
6 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; 6 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
7 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; 7 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
  8 +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
8 import com.alipay.api.AlipayApiException; 9 import com.alipay.api.AlipayApiException;
9 import com.alipay.api.AlipayConfig; 10 import com.alipay.api.AlipayConfig;
10 import com.alipay.api.DefaultAlipayClient; 11 import com.alipay.api.DefaultAlipayClient;
@@ -23,8 +24,8 @@ public class AlipayWapPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt; @@ -23,8 +24,8 @@ public class AlipayWapPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt;
23 24
24 private DefaultAlipayClient client; 25 private DefaultAlipayClient client;
25 26
26 - public AlipayWapPayClient(Long channelId, String channelCode, AlipayPayClientConfig config) {  
27 - super(channelId, channelCode, config, new AlipayPayCodeMapping()); 27 + public AlipayWapPayClient(Long channelId, AlipayPayClientConfig config) {
  28 + super(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config, new AlipayPayCodeMapping());
28 } 29 }
29 30
30 @Override 31 @Override
@@ -57,29 +58,8 @@ public class AlipayWapPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt; @@ -57,29 +58,8 @@ public class AlipayWapPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt;
57 } catch (AlipayApiException e) { 58 } catch (AlipayApiException e) {
58 return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); 59 return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping);
59 } 60 }
60 -  
61 - System.out.println(response.getBody());  
62 -  
63 // TODO 芋艿:sub Code 61 // TODO 芋艿:sub Code
64 return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); 62 return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);
65 } 63 }
66 64
67 - public static void main(String[] args) {  
68 - AlipayPayClientConfig config = new AlipayPayClientConfig();  
69 - config.setAppId("2021000118634035");  
70 - config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX);  
71 - config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);  
72 - config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");  
73 - config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");  
74 - AlipayWapPayClient client = new AlipayWapPayClient(1L, "biubiubiu", config);  
75 - client.init();  
76 -  
77 - PayOrderUnifiedReqDTO reqDTO = new PayOrderUnifiedReqDTO();  
78 - reqDTO.setAmount(123);  
79 - reqDTO.setSubject("IPhone 13");  
80 - reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis()));  
81 - client.unifiedOrder(reqDTO);  
82 - }  
83 -  
84 -  
85 } 65 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/index.html deleted
1 -<form name="punchout_form" method="post" action="https://openapi.alipaydev.com/gateway.do?charset=UTF8&sign=IxJaAZYjlzTHeogqr2dXsHPhHtjawFe7nTHq8Qbu3JvxWGEcvbVLJiO17LHfR4F45dVGnw74gEUnjQGHm%2FQanmANCIpUnrFTY7yXZmWRJQSRgNdLj3xA%2BaGm2RAprwZEj3wy3P2BAXfzTkgqclxo9BLLgMT%2FUiMQbRXUSRBFV5F5OC222oPOUzGNRM88jJwbMdWIuhpusbwya5BPPZUl%2BDdnipBLUlv3iX6yLxFWmxM%2FSzhrKURmThvBNw5FMwuUWPgfBYPb5Z%2FaJL68g8koGByxaJ%2FZmQcT66XFXJXfxmEUNNZKqeanvFca5M4auBqa7%2BOcoSOMA%2FHnsJOCJRAJ3g%3D%3D&app_id=2021000118634035&sign_type=RSA2&timestamp=2021-10-20+08%3A44%3A51&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json"> <input type="hidden" name="biz_content" value="{&quot;out_trade_no&quot;:&quot;70501111111S001111119&quot;,&quot;total_amount&quot;:&quot;9.00&quot;,&quot;quit_url&quot;:&quot;http://www.taobao.com/product/113714.html&quot;,&quot;subject&quot;:&quot;大乐透&quot;,&quot;product_code&quot;:&quot;QUICK_WAP_PAY&quot;,&quot;seller_id&quot;:&quot;2088102147948060&quot;}"> <input type="submit" value="立即支付" style="display:none" > </form> <script>document.forms[0].submit();</script>  
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/wx/WXPubPayClient.java
@@ -2,13 +2,13 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.wx; @@ -2,13 +2,13 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.wx;
2 2
3 import cn.hutool.core.bean.BeanUtil; 3 import cn.hutool.core.bean.BeanUtil;
4 import cn.hutool.core.date.DateUtil; 4 import cn.hutool.core.date.DateUtil;
5 -import cn.hutool.core.io.IoUtil;  
6 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
7 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 6 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
8 import cn.iocoder.yudao.framework.common.util.io.FileUtils; 7 import cn.iocoder.yudao.framework.common.util.io.FileUtils;
9 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; 8 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
10 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; 9 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
11 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; 10 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
  11 +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
12 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; 12 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
13 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; 13 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
14 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; 14 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
@@ -21,9 +21,6 @@ import com.github.binarywang.wxpay.service.WxPayService; @@ -21,9 +21,6 @@ import com.github.binarywang.wxpay.service.WxPayService;
21 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; 21 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
22 import lombok.extern.slf4j.Slf4j; 22 import lombok.extern.slf4j.Slf4j;
23 23
24 -import java.io.FileInputStream;  
25 -import java.io.FileNotFoundException;  
26 -  
27 import static cn.hutool.core.util.ObjectUtil.defaultIfNull; 24 import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
28 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; 25 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
29 import static cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXCodeMapping.CODE_SUCCESS; 26 import static cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXCodeMapping.CODE_SUCCESS;
@@ -39,8 +36,8 @@ public class WXPubPayClient extends AbstractPayClient&lt;WXPayClientConfig&gt; { @@ -39,8 +36,8 @@ public class WXPubPayClient extends AbstractPayClient&lt;WXPayClientConfig&gt; {
39 36
40 private WxPayService client; 37 private WxPayService client;
41 38
42 - public WXPubPayClient(Long channelId, String channelCode, WXPayClientConfig config) {  
43 - super(channelId, channelCode, config, new WXCodeMapping()); 39 + public WXPubPayClient(Long channelId, WXPayClientConfig config) {
  40 + super(channelId, PayChannelEnum.WX_PUB.getCode(), config, new WXCodeMapping());
44 } 41 }
45 42
46 @Override 43 @Override
@@ -120,29 +117,4 @@ public class WXPubPayClient extends AbstractPayClient&lt;WXPayClientConfig&gt; { @@ -120,29 +117,4 @@ public class WXPubPayClient extends AbstractPayClient&lt;WXPayClientConfig&gt; {
120 return client.createOrderV3(TradeTypeEnum.JSAPI, request); 117 return client.createOrderV3(TradeTypeEnum.JSAPI, request);
121 } 118 }
122 119
123 - public static void main(String[] args) throws FileNotFoundException {  
124 - WXPayClientConfig config = new WXPayClientConfig();  
125 - config.setAppId("wx041349c6f39b268b");  
126 - config.setMchId("1545083881");  
127 - config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p");  
128 - config.setApiVersion(WXPayClientConfig.API_VERSION_V3);  
129 -// config.setKeyContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_cert.p12")));  
130 - config.setPrivateKeyContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_key.pem")));  
131 - config.setPrivateCertContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem")));  
132 - config.setApiV3Key("joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase");  
133 -  
134 - WXPubPayClient client = new WXPubPayClient(1L, "biu", config);  
135 - client.init();  
136 -  
137 - PayOrderUnifiedReqDTO reqDTO = new PayOrderUnifiedReqDTO();  
138 - reqDTO.setAmount(123);  
139 - reqDTO.setSubject("IPhone 13");  
140 - reqDTO.setBody("biubiubiu");  
141 - reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis()));  
142 - reqDTO.setClientIp("127.0.0.1");  
143 - reqDTO.setNotifyUrl("http://127.0.0.1:8080");  
144 - CommonResult<WxPayMpOrderResult> result = client.unifiedOrder(reqDTO);  
145 - System.out.println(result);  
146 - }  
147 -  
148 } 120 }
yudao-core-service/src/main/java/cn/iocoder/yudao/framework/sms/core/enums/PayChannelCodeEnum.java renamed to yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/PayChannelEnum.java
1 -package cn.iocoder.yudao.framework.sms.core.enums; 1 +package cn.iocoder.yudao.framework.pay.core.enums;
2 2
  3 +import cn.hutool.core.util.ArrayUtil;
3 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
4 import lombok.Getter; 5 import lombok.Getter;
5 6
6 /** 7 /**
7 * 支付渠道的编码的枚举 8 * 支付渠道的编码的枚举
  9 + * 枚举值
8 * 10 *
9 * @author 芋道源码 11 * @author 芋道源码
10 */ 12 */
11 @Getter 13 @Getter
12 @AllArgsConstructor 14 @AllArgsConstructor
13 -public enum PayChannelCodeEnum { 15 +public enum PayChannelEnum {
14 16
15 - wx_pub("wx_pub", "微信 JSAPI 支付"); 17 + WX_PUB("wx_pub", "微信 JSAPI 支付"), // 公众号的网页
  18 + WX_LITE("wx_lit","微信小程序支付"),
  19 + WX_APP("wx_app", "微信 App 支付"),
  20 +
  21 + ALIPAY_PC("alipay_pc", "支付宝 PC 网站支付"),
  22 + ALIPAY_WAP("alipay_wap", "支付宝 Wap 网站支付"),
  23 + ALIPAY_APP("alipay_app", "支付宝App 支付"),
  24 + ALIPAY_QR("alipay_qr", "支付宝扫码支付");
16 25
17 /** 26 /**
18 * 编码 27 * 编码
@@ -25,4 +34,8 @@ public enum PayChannelCodeEnum { @@ -25,4 +34,8 @@ public enum PayChannelCodeEnum {
25 */ 34 */
26 private String name; 35 private String name;
27 36
  37 + public static PayChannelEnum getByCode(String code) {
  38 + return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values());
  39 + }
  40 +
28 } 41 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/package-info.java deleted
1 -/**  
2 - * @description  
3 - * @author Qingchen  
4 - * @version 1.0.0  
5 - * @date 2021-09-29 14:33  
6 - * @class cn.iocoder.yudao.framework.pay.package-info.java  
7 - */  
8 -package cn.iocoder.yudao.framework.pay;  
9 \ No newline at end of file 0 \ No newline at end of file
yudao-framework/yudao-spring-boot-starter-biz-pay/src/test-integration/java/cn/iocoder/yudao/framework/core/client/impl/PayClientFactoryImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.core.client.impl;
  2 +
  3 +import cn.hutool.core.io.IoUtil;
  4 +import cn.hutool.core.util.RandomUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  6 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  7 +import cn.iocoder.yudao.framework.pay.core.client.PayClient;
  8 +import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
  9 +import cn.iocoder.yudao.framework.pay.core.client.impl.PayClientFactoryImpl;
  10 +import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
  11 +import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayQrPayClient;
  12 +import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayWapPayClient;
  13 +import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig;
  14 +import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPubPayClient;
  15 +import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
  16 +import org.junit.jupiter.api.Test;
  17 +
  18 +import java.io.FileInputStream;
  19 +import java.io.FileNotFoundException;
  20 +
  21 +/**
  22 + * {@link PayClientFactoryImpl} 的集成测试
  23 + *
  24 + * @author 芋道源码
  25 + */
  26 +public class PayClientFactoryImplTest {
  27 +
  28 + private final PayClientFactoryImpl payClientFactory = new PayClientFactoryImpl();
  29 +
  30 + /**
  31 + * {@link WXPubPayClient} 的 V2 版本
  32 + */
  33 + @Test
  34 + public void testCreatePayClient_WX_PUB_V2() {
  35 + // 创建配置
  36 + WXPayClientConfig config = new WXPayClientConfig();
  37 + config.setAppId("wx041349c6f39b268b");
  38 + config.setMchId("1545083881");
  39 + config.setApiVersion(WXPayClientConfig.API_VERSION_V2);
  40 + config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p");
  41 + // 创建客户端
  42 + Long channelId = RandomUtil.randomLong();
  43 + payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.WX_PUB.getCode(), config);
  44 + PayClient client = payClientFactory.getPayClient(channelId);
  45 + // 发起支付
  46 + PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO();
  47 + CommonResult<?> result = client.unifiedOrder(reqDTO);
  48 + System.out.println(result);
  49 + }
  50 +
  51 + /**
  52 + * {@link WXPubPayClient} 的 V3 版本
  53 + */
  54 + @Test
  55 + public void testCreatePayClient_WX_PUB_V3() throws FileNotFoundException {
  56 + // 创建配置
  57 + WXPayClientConfig config = new WXPayClientConfig();
  58 + config.setAppId("wx041349c6f39b268b");
  59 + config.setMchId("1545083881");
  60 + config.setApiVersion(WXPayClientConfig.API_VERSION_V3);
  61 + config.setPrivateKeyContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_key.pem")));
  62 + config.setPrivateCertContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem")));
  63 + config.setApiV3Key("joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase");
  64 + // 创建客户端
  65 + Long channelId = RandomUtil.randomLong();
  66 + payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.WX_PUB.getCode(), config);
  67 + PayClient client = payClientFactory.getPayClient(channelId);
  68 + // 发起支付
  69 + PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO();
  70 + CommonResult<?> result = client.unifiedOrder(reqDTO);
  71 + System.out.println(result);
  72 + }
  73 +
  74 + /**
  75 + * {@link AlipayQrPayClient}
  76 + */
  77 + @Test
  78 + public void testCreatePayClient_ALIPAY_QR() {
  79 + // 创建配置
  80 + AlipayPayClientConfig config = new AlipayPayClientConfig();
  81 + config.setAppId("2021000118634035");
  82 + config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX);
  83 + config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
  84 + config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");
  85 + config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
  86 + // 创建客户端
  87 + Long channelId = RandomUtil.randomLong();
  88 + payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.ALIPAY_QR.getCode(), config);
  89 + PayClient client = payClientFactory.getPayClient(channelId);
  90 + // 发起支付
  91 + PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO();
  92 + CommonResult<?> result = client.unifiedOrder(reqDTO);
  93 + System.out.println(JsonUtils.toJsonString(result));
  94 + }
  95 +
  96 + /**
  97 + * {@link AlipayWapPayClient}
  98 + */
  99 + @Test
  100 + public void testCreatePayClient_ALIPAY_WAP() {
  101 + // 创建配置
  102 + AlipayPayClientConfig config = new AlipayPayClientConfig();
  103 + config.setAppId("2021000118634035");
  104 + config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX);
  105 + config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
  106 + config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");
  107 + config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
  108 + // 创建客户端
  109 + Long channelId = RandomUtil.randomLong();
  110 + payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config);
  111 + PayClient client = payClientFactory.getPayClient(channelId);
  112 + // 发起支付
  113 + PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO();
  114 + CommonResult<?> result = client.unifiedOrder(reqDTO);
  115 + System.out.println(JsonUtils.toJsonString(result));
  116 + }
  117 +
  118 + private static PayOrderUnifiedReqDTO buildPayOrderUnifiedReqDTO() {
  119 + PayOrderUnifiedReqDTO reqDTO = new PayOrderUnifiedReqDTO();
  120 + reqDTO.setAmount(123);
  121 + reqDTO.setSubject("IPhone 13");
  122 + reqDTO.setBody("biubiubiu");
  123 + reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis()));
  124 + reqDTO.setClientIp("127.0.0.1");
  125 + reqDTO.setNotifyUrl("http://127.0.0.1:8080");
  126 + return reqDTO;
  127 + }
  128 +
  129 +}