Commit d123ce1abbe54447bc64028d37a2a325efea33a1
1 parent
c09450ac
upgrade after testing
Showing
4 changed files
with
82 additions
and
38 deletions
cashier-pipeline/src/main/java/com/diligrp/cashier/pipeline/client/CardPaymentHttpClient.java
| @@ -69,12 +69,18 @@ public class CardPaymentHttpClient extends ServiceEndpointSupport { | @@ -69,12 +69,18 @@ public class CardPaymentHttpClient extends ServiceEndpointSupport { | ||
| 69 | HttpResult result = send(uri, payload); | 69 | HttpResult result = send(uri, payload); |
| 70 | if (result.statusCode == 200) { | 70 | if (result.statusCode == 200) { |
| 71 | LOG.debug("Received from card payment pipeline: {}", result.responseText); | 71 | LOG.debug("Received from card payment pipeline: {}", result.responseText); |
| 72 | - Map<String, Object> response = JsonUtils.fromJsonString(result.responseText, new TypeReference<>() {}); | 72 | + Map<String, Object> response = JsonUtils.fromJsonString(result.responseText, new TypeReference<>() { |
| 73 | + }); | ||
| 73 | if ("200".equals(response.get("code"))) { | 74 | if ("200".equals(response.get("code"))) { |
| 74 | - String outTradeNo = (String) response.get("data"); | ||
| 75 | - return new CardPaymentResponse(request.getPaymentId(), outTradeNo, | ||
| 76 | - OutPaymentType.DILICARD, String.valueOf(request.getAccountId()), now, | ||
| 77 | - PaymentState.SUCCESS, "园区卡支付成功"); | 75 | + Map<String, Object> data = (Map<String, Object>) response.get("data"); |
| 76 | + String outTradeNo = (String) data.get("outTradeNo"); | ||
| 77 | + Map<String, Object> payerId = new LinkedHashMap<>(); | ||
| 78 | + payerId.put("customerId", convertLong(data.get("customerId"))); | ||
| 79 | + payerId.put("accountId", convertLong(data.get("accountId"))); | ||
| 80 | + payerId.put("cardNo", data.get("cardNo")); | ||
| 81 | + payerId.put("name", data.get("name")); | ||
| 82 | + return new CardPaymentResponse(request.getPaymentId(), outTradeNo, OutPaymentType.DILICARD, | ||
| 83 | + JsonUtils.toJsonString(payerId), now, PaymentState.SUCCESS, "园区卡支付成功"); | ||
| 78 | } else { | 84 | } else { |
| 79 | throw new PaymentPipelineException(ErrorCode.SERVICE_ACCESS_ERROR, "园区卡支付失败: " + response.get("message")); | 85 | throw new PaymentPipelineException(ErrorCode.SERVICE_ACCESS_ERROR, "园区卡支付失败: " + response.get("message")); |
| 80 | } | 86 | } |
| @@ -95,10 +101,11 @@ public class CardPaymentHttpClient extends ServiceEndpointSupport { | @@ -95,10 +101,11 @@ public class CardPaymentHttpClient extends ServiceEndpointSupport { | ||
| 95 | HttpResult result = send(uri, payload); | 101 | HttpResult result = send(uri, payload); |
| 96 | if (result.statusCode == 200) { | 102 | if (result.statusCode == 200) { |
| 97 | LOG.debug("Received from card payment pipeline: {}", result.responseText); | 103 | LOG.debug("Received from card payment pipeline: {}", result.responseText); |
| 98 | - Map<String, Object> response = JsonUtils.fromJsonString(result.responseText, new TypeReference<>() {}); | 104 | + Map<String, Object> response = JsonUtils.fromJsonString(result.responseText, new TypeReference<>() { |
| 105 | + }); | ||
| 99 | if ("200".equals(response.get("code"))) { | 106 | if ("200".equals(response.get("code"))) { |
| 100 | return new OnlineRefundResponse(request.getRefundId(), null, now, | 107 | return new OnlineRefundResponse(request.getRefundId(), null, now, |
| 101 | - PaymentState.SUCCESS, "园区卡退款成功"); | 108 | + PaymentState.SUCCESS, "园区卡退款成功"); |
| 102 | } else { | 109 | } else { |
| 103 | throw new PaymentPipelineException(ErrorCode.SERVICE_ACCESS_ERROR, "园区卡支付退款失败: " + response.get("message")); | 110 | throw new PaymentPipelineException(ErrorCode.SERVICE_ACCESS_ERROR, "园区卡支付退款失败: " + response.get("message")); |
| 104 | } | 111 | } |
| @@ -117,16 +124,18 @@ public class CardPaymentHttpClient extends ServiceEndpointSupport { | @@ -117,16 +124,18 @@ public class CardPaymentHttpClient extends ServiceEndpointSupport { | ||
| 117 | HttpResult result = send(uri, payload); | 124 | HttpResult result = send(uri, payload); |
| 118 | if (result.statusCode == 200) { | 125 | if (result.statusCode == 200) { |
| 119 | LOG.debug("Received from card payment pipeline: {}", result.responseText); | 126 | LOG.debug("Received from card payment pipeline: {}", result.responseText); |
| 120 | - Map<String, Object> response = JsonUtils.fromJsonString(result.responseText, new TypeReference<>() {}); | 127 | + Map<String, Object> response = JsonUtils.fromJsonString(result.responseText, new TypeReference<>() { |
| 128 | + }); | ||
| 121 | if ("200".equals(response.get("code"))) { | 129 | if ("200".equals(response.get("code"))) { |
| 122 | List<UserCardDTO> userCards = new ArrayList<>(); | 130 | List<UserCardDTO> userCards = new ArrayList<>(); |
| 123 | Object data = response.get("data"); | 131 | Object data = response.get("data"); |
| 124 | if (data != null) { | 132 | if (data != null) { |
| 125 | - List<Map<String, Object>> cardList = JsonUtils.convertValue(data, new TypeReference<>() {}); | 133 | + List<Map<String, Object>> cardList = JsonUtils.convertValue(data, new TypeReference<>() { |
| 134 | + }); | ||
| 126 | for (Map<String, Object> card : cardList) { | 135 | for (Map<String, Object> card : cardList) { |
| 127 | UserCardDTO userCard = new UserCardDTO(convertLong(card.get("customerId")), | 136 | UserCardDTO userCard = new UserCardDTO(convertLong(card.get("customerId")), |
| 128 | - convertLong(card.get("accountId")), (String) card.get("cardNo"), | ||
| 129 | - (String) card.get("customerName"), convertLong(card.get("amount"))); | 137 | + convertLong(card.get("accountId")), (String) card.get("cardNo"), |
| 138 | + (String) card.get("customerName"), convertLong(card.get("amount"))); | ||
| 130 | userCards.add(userCard); | 139 | userCards.add(userCard); |
| 131 | } | 140 | } |
| 132 | } | 141 | } |
| @@ -142,4 +151,4 @@ public class CardPaymentHttpClient extends ServiceEndpointSupport { | @@ -142,4 +151,4 @@ public class CardPaymentHttpClient extends ServiceEndpointSupport { | ||
| 142 | private Long convertLong(Object value) { | 151 | private Long convertLong(Object value) { |
| 143 | return value != null ? ((Number) value).longValue() : null; | 152 | return value != null ? ((Number) value).longValue() : null; |
| 144 | } | 153 | } |
| 145 | -} | 154 | -} |
| 155 | +} | ||
| 146 | \ No newline at end of file | 156 | \ No newline at end of file |
cashier-pipeline/src/main/java/com/diligrp/cashier/pipeline/core/WechatDirectPipeline.java
| @@ -4,7 +4,14 @@ import com.diligrp.cashier.pipeline.Constants; | @@ -4,7 +4,14 @@ import com.diligrp.cashier.pipeline.Constants; | ||
| 4 | import com.diligrp.cashier.pipeline.client.WechatDirectHttpClient; | 4 | import com.diligrp.cashier.pipeline.client.WechatDirectHttpClient; |
| 5 | import com.diligrp.cashier.pipeline.client.WechatHttpClient; | 5 | import com.diligrp.cashier.pipeline.client.WechatHttpClient; |
| 6 | import com.diligrp.cashier.pipeline.domain.*; | 6 | import com.diligrp.cashier.pipeline.domain.*; |
| 7 | +import com.diligrp.cashier.pipeline.exception.PaymentPipelineException; | ||
| 8 | +import com.diligrp.cashier.pipeline.util.WechatConstants; | ||
| 9 | +import com.diligrp.cashier.pipeline.util.WechatSignatureUtils; | ||
| 10 | +import com.diligrp.cashier.shared.ErrorCode; | ||
| 7 | import com.diligrp.cashier.shared.util.AssertUtils; | 11 | import com.diligrp.cashier.shared.util.AssertUtils; |
| 12 | +import com.diligrp.cashier.shared.util.RandomUtils; | ||
| 13 | +import org.slf4j.Logger; | ||
| 14 | +import org.slf4j.LoggerFactory; | ||
| 8 | 15 | ||
| 9 | /** | 16 | /** |
| 10 | * 微信支付通道抽象模型-直联模式 | 17 | * 微信支付通道抽象模型-直联模式 |
| @@ -13,6 +20,9 @@ import com.diligrp.cashier.shared.util.AssertUtils; | @@ -13,6 +20,9 @@ import com.diligrp.cashier.shared.util.AssertUtils; | ||
| 13 | * upay_wechat_param需配置商户API接口所需配置信息 | 20 | * upay_wechat_param需配置商户API接口所需配置信息 |
| 14 | */ | 21 | */ |
| 15 | public class WechatDirectPipeline extends WechatPipeline<WechatDirectPipeline.DirectWechatParams> { | 22 | public class WechatDirectPipeline extends WechatPipeline<WechatDirectPipeline.DirectWechatParams> { |
| 23 | + | ||
| 24 | + private static final Logger LOG = LoggerFactory.getLogger(WechatDirectPipeline.class); | ||
| 25 | + | ||
| 16 | private final ScanTimeStrategy strategy; | 26 | private final ScanTimeStrategy strategy; |
| 17 | 27 | ||
| 18 | // 直联模式下的微信客户端 | 28 | // 直联模式下的微信客户端 |
| @@ -41,11 +51,27 @@ public class WechatDirectPipeline extends WechatPipeline<WechatDirectPipeline.Di | @@ -41,11 +51,27 @@ public class WechatDirectPipeline extends WechatPipeline<WechatDirectPipeline.Di | ||
| 41 | return super.sendNativePrepayRequest(request); | 51 | return super.sendNativePrepayRequest(request); |
| 42 | } | 52 | } |
| 43 | 53 | ||
| 44 | - @Override | ||
| 45 | public MiniProPrepayResponse sendMiniProPrepayRequest(MiniProPrepayRequest request) { | 54 | public MiniProPrepayResponse sendMiniProPrepayRequest(MiniProPrepayRequest request) { |
| 46 | - // 直连模式下,外部商户号设置为微信商户号 | ||
| 47 | - request.put(Constants.PARAM_MCH_ID, wechatConfig.getMchId()); | ||
| 48 | - return super.sendMiniProPrepayRequest(request); | 55 | + try { |
| 56 | + // 直连模式下,外部商户号设置为微信商户号 | ||
| 57 | + request.put(Constants.PARAM_MCH_ID, wechatConfig.getMchId()); | ||
| 58 | + String notifyUri = String.format(Constants.WECHAT_PAYMENT_NOTIFY_URI, params().getNotifyUrl(), request.getPaymentId()); | ||
| 59 | + String prepayId = getClient().sendMiniProPrepayRequest(request, notifyUri); | ||
| 60 | + | ||
| 61 | + String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); | ||
| 62 | + String nonceStr = RandomUtils.randomString(32); | ||
| 63 | + String packet = "prepay_id=" + prepayId; | ||
| 64 | + String appId = getClient().getWechatConfig().getAppId(); | ||
| 65 | + String message = String.format("%s\n%s\n%s\n%s\n", appId, timeStamp, nonceStr, packet); | ||
| 66 | + String paySign = WechatSignatureUtils.signature(message, getClient().getWechatConfig().getPrivateKey()); | ||
| 67 | + String signType = WechatConstants.RSA_ALGORITHM; | ||
| 68 | + return MiniProPrepayResponse.of(request.getPaymentId(), prepayId, prepayId, timeStamp, nonceStr, signType, paySign); | ||
| 69 | + } catch (PaymentPipelineException | IllegalArgumentException pse) { | ||
| 70 | + throw pse; | ||
| 71 | + } catch (Exception ex) { | ||
| 72 | + LOG.error("Send wechat mini pro prepay request exception", ex); | ||
| 73 | + throw new PaymentPipelineException(ErrorCode.SYSTEM_UNKNOWN_ERROR, "发起微信预支付失败"); | ||
| 74 | + } | ||
| 49 | } | 75 | } |
| 50 | 76 | ||
| 51 | @Override | 77 | @Override |
cashier-pipeline/src/main/java/com/diligrp/cashier/pipeline/core/WechatPartnerPipeline.java
| @@ -4,7 +4,14 @@ import com.diligrp.cashier.pipeline.Constants; | @@ -4,7 +4,14 @@ import com.diligrp.cashier.pipeline.Constants; | ||
| 4 | import com.diligrp.cashier.pipeline.client.WechatHttpClient; | 4 | import com.diligrp.cashier.pipeline.client.WechatHttpClient; |
| 5 | import com.diligrp.cashier.pipeline.client.WechatPartnerHttpClient; | 5 | import com.diligrp.cashier.pipeline.client.WechatPartnerHttpClient; |
| 6 | import com.diligrp.cashier.pipeline.domain.*; | 6 | import com.diligrp.cashier.pipeline.domain.*; |
| 7 | +import com.diligrp.cashier.pipeline.exception.PaymentPipelineException; | ||
| 8 | +import com.diligrp.cashier.pipeline.util.WechatConstants; | ||
| 9 | +import com.diligrp.cashier.pipeline.util.WechatSignatureUtils; | ||
| 10 | +import com.diligrp.cashier.shared.ErrorCode; | ||
| 7 | import com.diligrp.cashier.shared.util.AssertUtils; | 11 | import com.diligrp.cashier.shared.util.AssertUtils; |
| 12 | +import com.diligrp.cashier.shared.util.RandomUtils; | ||
| 13 | +import org.slf4j.Logger; | ||
| 14 | +import org.slf4j.LoggerFactory; | ||
| 8 | 15 | ||
| 9 | /** | 16 | /** |
| 10 | * 微信支付通道抽象模型-服务商模式 | 17 | * 微信支付通道抽象模型-服务商模式 |
| @@ -15,6 +22,8 @@ import com.diligrp.cashier.shared.util.AssertUtils; | @@ -15,6 +22,8 @@ import com.diligrp.cashier.shared.util.AssertUtils; | ||
| 15 | */ | 22 | */ |
| 16 | public class WechatPartnerPipeline extends WechatPipeline<WechatPartnerPipeline.PartnerWechatParams> { | 23 | public class WechatPartnerPipeline extends WechatPipeline<WechatPartnerPipeline.PartnerWechatParams> { |
| 17 | 24 | ||
| 25 | + private static final Logger LOG = LoggerFactory.getLogger(WechatPartnerPipeline.class); | ||
| 26 | + | ||
| 18 | private final ScanTimeStrategy strategy; | 27 | private final ScanTimeStrategy strategy; |
| 19 | 28 | ||
| 20 | // 服务商模式下的微信客户端 | 29 | // 服务商模式下的微信客户端 |
| @@ -49,9 +58,27 @@ public class WechatPartnerPipeline extends WechatPipeline<WechatPartnerPipeline. | @@ -49,9 +58,27 @@ public class WechatPartnerPipeline extends WechatPipeline<WechatPartnerPipeline. | ||
| 49 | 58 | ||
| 50 | @Override | 59 | @Override |
| 51 | public MiniProPrepayResponse sendMiniProPrepayRequest(MiniProPrepayRequest request) { | 60 | public MiniProPrepayResponse sendMiniProPrepayRequest(MiniProPrepayRequest request) { |
| 52 | - // 服务商模式下,外部商户号默认设置为特约子商户 | ||
| 53 | - request.put(Constants.PARAM_MCH_ID, params().getSubMchId()); | ||
| 54 | - return super.sendMiniProPrepayRequest(request); | 61 | + try { |
| 62 | + // 服务商模式下,外部商户号默认设置为特约子商户 | ||
| 63 | + PartnerWechatParams params = params(); | ||
| 64 | + request.put(Constants.PARAM_MCH_ID, params.getSubMchId()); | ||
| 65 | + String notifyUri = String.format(Constants.WECHAT_PAYMENT_NOTIFY_URI, params.getNotifyUrl(), request.getPaymentId()); | ||
| 66 | + String prepayId = getClient().sendMiniProPrepayRequest(request, notifyUri); | ||
| 67 | + | ||
| 68 | + String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); | ||
| 69 | + String nonceStr = RandomUtils.randomString(32); | ||
| 70 | + String packet = "prepay_id=" + prepayId; | ||
| 71 | + String message = String.format("%s\n%s\n%s\n%s\n", params.getSubAppId(), timeStamp, nonceStr, packet); | ||
| 72 | + // 签名时需要使用配置的subAppId | ||
| 73 | + String paySign = WechatSignatureUtils.signature(message, getClient().getWechatConfig().getPrivateKey()); | ||
| 74 | + String signType = WechatConstants.RSA_ALGORITHM; | ||
| 75 | + return MiniProPrepayResponse.of(request.getPaymentId(), prepayId, prepayId, timeStamp, nonceStr, signType, paySign); | ||
| 76 | + } catch (PaymentPipelineException | IllegalArgumentException pse) { | ||
| 77 | + throw pse; | ||
| 78 | + } catch (Exception ex) { | ||
| 79 | + LOG.error("Send wechat mini pro prepay request exception", ex); | ||
| 80 | + throw new PaymentPipelineException(ErrorCode.SYSTEM_UNKNOWN_ERROR, "发起微信预支付失败"); | ||
| 81 | + } | ||
| 55 | } | 82 | } |
| 56 | 83 | ||
| 57 | @Override | 84 | @Override |
cashier-pipeline/src/main/java/com/diligrp/cashier/pipeline/core/WechatPipeline.java
| @@ -8,11 +8,9 @@ import com.diligrp.cashier.pipeline.domain.wechat.WechatConfig; | @@ -8,11 +8,9 @@ import com.diligrp.cashier.pipeline.domain.wechat.WechatConfig; | ||
| 8 | import com.diligrp.cashier.pipeline.exception.PaymentPipelineException; | 8 | import com.diligrp.cashier.pipeline.exception.PaymentPipelineException; |
| 9 | import com.diligrp.cashier.pipeline.type.ChannelType; | 9 | import com.diligrp.cashier.pipeline.type.ChannelType; |
| 10 | import com.diligrp.cashier.pipeline.util.WechatConstants; | 10 | import com.diligrp.cashier.pipeline.util.WechatConstants; |
| 11 | -import com.diligrp.cashier.pipeline.util.WechatSignatureUtils; | ||
| 12 | import com.diligrp.cashier.shared.ErrorCode; | 11 | import com.diligrp.cashier.shared.ErrorCode; |
| 13 | import com.diligrp.cashier.shared.security.RsaCipher; | 12 | import com.diligrp.cashier.shared.security.RsaCipher; |
| 14 | import com.diligrp.cashier.shared.util.AssertUtils; | 13 | import com.diligrp.cashier.shared.util.AssertUtils; |
| 15 | -import com.diligrp.cashier.shared.util.RandomUtils; | ||
| 16 | import org.slf4j.Logger; | 14 | import org.slf4j.Logger; |
| 17 | import org.slf4j.LoggerFactory; | 15 | import org.slf4j.LoggerFactory; |
| 18 | 16 | ||
| @@ -100,24 +98,7 @@ public abstract class WechatPipeline<T extends WechatPipeline.WechatParams> exte | @@ -100,24 +98,7 @@ public abstract class WechatPipeline<T extends WechatPipeline.WechatParams> exte | ||
| 100 | * 小程序预支付下单 | 98 | * 小程序预支付下单 |
| 101 | */ | 99 | */ |
| 102 | public MiniProPrepayResponse sendMiniProPrepayRequest(MiniProPrepayRequest request) { | 100 | public MiniProPrepayResponse sendMiniProPrepayRequest(MiniProPrepayRequest request) { |
| 103 | - try { | ||
| 104 | - String notifyUri = String.format(Constants.WECHAT_PAYMENT_NOTIFY_URI, params().getNotifyUrl(), request.getPaymentId()); | ||
| 105 | - String prepayId = getClient().sendMiniProPrepayRequest(request, notifyUri); | ||
| 106 | - | ||
| 107 | - String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); | ||
| 108 | - String nonceStr = RandomUtils.randomString(32); | ||
| 109 | - String packet = "prepay_id=" + prepayId; | ||
| 110 | - String appId = getClient().getWechatConfig().getAppId(); | ||
| 111 | - String message = String.format("%s\n%s\n%s\n%s\n", appId, timeStamp, nonceStr, packet); | ||
| 112 | - String paySign = WechatSignatureUtils.signature(message, getClient().getWechatConfig().getPrivateKey()); | ||
| 113 | - String signType = WechatConstants.RSA_ALGORITHM; | ||
| 114 | - return MiniProPrepayResponse.of(request.getPaymentId(), prepayId, prepayId, timeStamp, nonceStr, signType, paySign); | ||
| 115 | - } catch (PaymentPipelineException | IllegalArgumentException pse) { | ||
| 116 | - throw pse; | ||
| 117 | - } catch (Exception ex) { | ||
| 118 | - LOG.error("Send wechat mini pro prepay request exception", ex); | ||
| 119 | - throw new PaymentPipelineException(ErrorCode.SYSTEM_UNKNOWN_ERROR, "发起微信预支付失败"); | ||
| 120 | - } | 101 | + return super.sendMiniProPrepayRequest(request); |
| 121 | } | 102 | } |
| 122 | 103 | ||
| 123 | /** | 104 | /** |