Commit 6e3aa8a7524781e50d60093d165310bff509bab3
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<AlipayPayClientConfig> | @@ -27,8 +28,8 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||
| 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<AlipayPayClientConfig> | @@ -61,29 +62,8 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||
| 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<AlipayPayClientConfig> | @@ -23,8 +24,8 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||
| 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<AlipayPayClientConfig> | @@ -57,29 +58,8 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||
| 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×tamp=2021-10-20+08%3A44%3A51&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json"> <input type="hidden" name="biz_content" value="{"out_trade_no":"70501111111S001111119","total_amount":"9.00","quit_url":"http://www.taobao.com/product/113714.html","subject":"大乐透","product_code":"QUICK_WAP_PAY","seller_id":"2088102147948060"}"> <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<WXPayClientConfig> { | @@ -39,8 +36,8 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> { | ||
| 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<WXPayClientConfig> { | @@ -120,29 +117,4 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> { | ||
| 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
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 | +} |