|
@@ -1,6 +1,8 @@
|
|
|
package com.ym.mec.biz.service.impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.security.PrivateKey;
|
|
|
+import java.security.PublicKey;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
@@ -12,6 +14,10 @@ import java.util.function.Consumer;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.huifu.adapay.core.AdapayCore;
|
|
|
import com.huifu.adapay.core.util.AdapaySign;
|
|
|
+import com.yeepay.g3.sdk.yop.encrypt.DigitalEnvelopeDTO;
|
|
|
+import com.yeepay.g3.sdk.yop.utils.DigitalEnvelopeUtils;
|
|
|
+import com.yeepay.g3.sdk.yop.utils.RSAKeyUtils;
|
|
|
+
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.joda.time.LocalDateTime;
|
|
@@ -460,59 +466,127 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public String callback(HttpServletRequest request) {
|
|
|
- // 验签请参data
|
|
|
- String data = request.getParameter("data");
|
|
|
- // 验签请参sign
|
|
|
- String sign = request.getParameter("sign");
|
|
|
- log.info("tenant callback request param:{}", data);
|
|
|
- try {
|
|
|
- // 验签
|
|
|
- if (AdapaySign.verifySign(data, sign, AdapayCore.PUBLIC_KEY)) {
|
|
|
- JSONObject dataObj = JSON.parseObject(data);
|
|
|
- String transType = request.getParameter("type");
|
|
|
- String orderNo = dataObj.getString("order_no");
|
|
|
- TenantOrderRecord record = this.getOne(Wrappers.<TenantOrderRecord>lambdaQuery()
|
|
|
- .eq(TenantOrderRecord::getOrderNo, orderNo));
|
|
|
- if(Objects.isNull(record)){
|
|
|
- log.error("error tenant callback request orderNo is null param:{}", data);
|
|
|
- return "failed";
|
|
|
- }
|
|
|
- record = tenantOrderRecordDao.getLockedById(record.getId());
|
|
|
- //只处理未支付状态的订单
|
|
|
- if(!record.getOrderState().equals(0)){
|
|
|
- return "succeeded";
|
|
|
- }
|
|
|
- switch (transType) {
|
|
|
- case "payment.succeeded":// 支付成功
|
|
|
- Consumer<TenantOrderRecord> consumer = checkOrder.get(record.getOrderType());
|
|
|
- if (Objects.nonNull(consumer)) {
|
|
|
- consumer.accept(record);
|
|
|
- }
|
|
|
- LocalDateTime now = LocalDateTime.now();
|
|
|
- record.setPayDate(now.toLocalDate().toDate());
|
|
|
- record.setPayTime(now.toDate());
|
|
|
- //修改流水
|
|
|
- record.setOrderState(1);
|
|
|
- baseMapper.updateById(record);
|
|
|
- break;
|
|
|
- case "payment.failed":// 支付失败
|
|
|
- //修改流水
|
|
|
- record.setOrderState(2);
|
|
|
- baseMapper.updateById(record);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- } else {
|
|
|
- return "验签失败";
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("error tenant callback request param:{}", data);
|
|
|
- return e.getMessage();
|
|
|
- }
|
|
|
- return "succeeded";
|
|
|
- }
|
|
|
+ public String callback(String orderNo, HttpServletRequest request) {
|
|
|
+
|
|
|
+ TenantOrderRecord record = this.getOne(Wrappers.<TenantOrderRecord> lambdaQuery().eq(TenantOrderRecord::getOrderNo, orderNo));
|
|
|
+ if (Objects.isNull(record)) {
|
|
|
+ return "failed";
|
|
|
+ }
|
|
|
+ record = tenantOrderRecordDao.getLockedById(record.getId());
|
|
|
+ // 只处理未支付状态的订单
|
|
|
+ if (!record.getOrderState().equals(0)) {
|
|
|
+ return "succeeded";
|
|
|
+ }
|
|
|
+
|
|
|
+ PaymentChannelEnum paymentChannel = PaymentChannelEnum.codeOf(record.getPaymentChannel());
|
|
|
+
|
|
|
+ try {
|
|
|
+
|
|
|
+ switch (paymentChannel) {
|
|
|
+ case ADAPAY:
|
|
|
+ // 验签请参data
|
|
|
+ String data = request.getParameter("data");
|
|
|
+ // 验签请参sign
|
|
|
+ String sign = request.getParameter("sign");
|
|
|
+
|
|
|
+ String transType = request.getParameter("type");
|
|
|
+
|
|
|
+ log.info("callback response param:[data]{} [sign]{} [type]{}", data, sign, transType);
|
|
|
+
|
|
|
+ // 验签
|
|
|
+ if (AdapaySign.verifySign(data, sign, AdapayCore.PUBLIC_KEY)) {
|
|
|
+ JSONObject dataObj = JSON.parseObject(data);
|
|
|
+ // String orderNo = dataObj.getString("order_no");
|
|
|
+ switch (transType) {
|
|
|
+ case "payment.succeeded":// 支付成功
|
|
|
+ Consumer<TenantOrderRecord> consumer = checkOrder.get(record.getOrderType());
|
|
|
+ if (Objects.nonNull(consumer)) {
|
|
|
+ consumer.accept(record);
|
|
|
+ }
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ record.setPayDate(now.toLocalDate().toDate());
|
|
|
+ record.setPayTime(now.toDate());
|
|
|
+ // 修改流水
|
|
|
+ record.setOrderState(1);
|
|
|
+ baseMapper.updateById(record);
|
|
|
+ break;
|
|
|
+ case "payment.failed":// 支付失败
|
|
|
+ // 修改流水
|
|
|
+ record.setOrderState(2);
|
|
|
+ baseMapper.updateById(record);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return "验签失败";
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ case YEEPAY:
|
|
|
+
|
|
|
+ String content = request.getParameter("response");
|
|
|
+
|
|
|
+ HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(record.getTenantId(), record.getPaymentChannel());
|
|
|
+ if (hfMerchantConfig == null) {
|
|
|
+ throw new BizException("机构[{}][{}]商户信息找不到", record.getTenantId(), record.getPaymentChannel());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构造结果通知请求对象
|
|
|
+ DigitalEnvelopeDTO dto = new DigitalEnvelopeDTO();
|
|
|
+ dto.setCipherText(content);
|
|
|
+ PrivateKey privateKey = RSAKeyUtils.string2PrivateKey(hfMerchantConfig.getRsaPrivateKey());
|
|
|
+ PublicKey publicKey = RSAKeyUtils.string2PublicKey(hfMerchantConfig.getRsaPublicKey());
|
|
|
+
|
|
|
+ dto = DigitalEnvelopeUtils.decrypt(dto, privateKey, publicKey);
|
|
|
+
|
|
|
+ log.info("易宝支付回调信息:response:{} plaintText:{}", content, dto.getPlainText());
|
|
|
+
|
|
|
+ JSONObject dataObj = JSON.parseObject(dto.getPlainText());
|
|
|
+
|
|
|
+ Map<String, String> notifyMap = new HashMap<>();
|
|
|
+ notifyMap.put("channelType", dataObj.getString("channel"));
|
|
|
+
|
|
|
+ if ("SUCCESS".equals(dataObj.getString("status"))) {
|
|
|
+ Consumer<TenantOrderRecord> consumer = checkOrder.get(record.getOrderType());
|
|
|
+ if (Objects.nonNull(consumer)) {
|
|
|
+ consumer.accept(record);
|
|
|
+ }
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ record.setPayDate(now.toLocalDate().toDate());
|
|
|
+ record.setPayTime(now.toDate());
|
|
|
+ // 修改流水
|
|
|
+ record.setOrderState(1);
|
|
|
+ baseMapper.updateById(record);
|
|
|
+ } else {
|
|
|
+ // 修改流水
|
|
|
+ record.setOrderState(2);
|
|
|
+ baseMapper.updateById(record);
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ return e.getMessage();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验签请参data
|
|
|
+ String data = request.getParameter("data");
|
|
|
+ // 验签请参sign
|
|
|
+ String sign = request.getParameter("sign");
|
|
|
+ log.info("tenant callback request param:{}", data);
|
|
|
+ try {
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("error tenant callback request param:{}", data);
|
|
|
+ return e.getMessage();
|
|
|
+ }
|
|
|
+ return "succeeded";
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|