From 9e3b549b342929a6f3268b1672cfbe05bbcfb1c6 Mon Sep 17 00:00:00 2001 From: xhxu Date: Wed, 13 Sep 2023 10:45:33 +0800 Subject: [PATCH] //.. --- .../controller/CallbackPayController.java | 19 +++++-- .../service/impl/ProductOrderServiceImpl.java | 55 +++++++++++++------ 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java b/suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java index 1e92961..3d2b629 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java @@ -3,12 +3,16 @@ package com.iformall.controller; import com.alibaba.fastjson.JSONObject; import com.github.binarywang.wxpay.v3.util.AesUtils; import com.iformall.annotation.AuthIgnore; +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.ProductOrder; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxPayAccount; import com.iformall.enums.EnumAppPlat; import com.iformall.service.ProductOrderService; import com.iformall.service.WxAppinfoService; import com.iformall.service.WxPayAccountService; +import com.iformall.service.pay.PayServiceFactory; +import com.iformall.service.pay.service.pay.PayAdapterService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.jdom2.JDOMException; @@ -39,6 +43,9 @@ public class CallbackPayController extends BaseController { @Autowired private ProductOrderService productOrderService; + @Autowired + private PayServiceFactory payServiceFactory; + @AuthIgnore @ApiOperation("支付回调") @PostMapping(value = "{projectType}/pay/v3") @@ -58,17 +65,21 @@ public class CallbackPayController extends BaseController { String nonce = resource.get("nonce"); String ciphertext = resource.get("ciphertext"); - //todo 解密回调数据 String decryptString = AesUtils.decryptToString(associatedData, nonce, ciphertext, payAccount.getMerchantApiv3Key()); logger.info("微信支付回调解密数据{}"+decryptString); JSONObject jsonObject = JSONObject.parseObject(decryptString); String out_order_no = jsonObject.getString("out_trade_no"); - //todo 处理支付数据 - }catch(Exception e){ + ProductOrder productOrder = productOrderService.getById(Long.parseLong(out_order_no)); + PayAdapterService payAdapterService = payServiceFactory.getPayAdapterService(productOrder.getPayVendor()); + productOrderService.handleProductOrderByQuery(appInfo,payAccount,productOrder,payAdapterService); + response.setStatus(200); + }catch(Exception e){ + logger.error("微信支付回调处理异常"+e); + response.setStatus(ErrorCode.SYS_SERVER_ERROR.getCode()); } - response.setStatus(200); + } @AuthIgnore diff --git a/suimangService/src/main/java/com/iformall/service/impl/ProductOrderServiceImpl.java b/suimangService/src/main/java/com/iformall/service/impl/ProductOrderServiceImpl.java index 978cd18..ddd2bfc 100644 --- a/suimangService/src/main/java/com/iformall/service/impl/ProductOrderServiceImpl.java +++ b/suimangService/src/main/java/com/iformall/service/impl/ProductOrderServiceImpl.java @@ -21,6 +21,7 @@ import com.iformall.service.pay.service.pay.entity.PayAdapterResult; import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; import com.iformall.service.pay.service.share.PayShareAdapterService; import com.iformall.utils.DateUtils; +import com.iformall.utils.RedisLock; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,6 +61,9 @@ public class ProductOrderServiceImpl implements ProductOrderService { @Autowired PayServiceFactory payServiceFactory; + @Autowired + RedisLock redisLock; + @Override public PageInfo listAsPage(ProductOrder record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> productOrderMapper.findList(record)); @@ -155,7 +159,7 @@ public class ProductOrderServiceImpl implements ProductOrderService { productOrder.setPaymentTime(result.getPayTime()); productOrder.setPayWay(result.getWay()); productOrder.setOrderStatus(productOrderStatus); - productOrder.setIsOrderStatus(EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); +// productOrder.setIsOrderStatus(EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); productOrder.setUpdateDate(new Date()); int num = productOrderMapper.orderPayUpdStatus(productOrder); @@ -174,25 +178,40 @@ public class ProductOrderServiceImpl implements ProductOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public void handleProductOrderSuccess(ProductOrder productOrder, PayQueryAdapterResult result) { - if(!EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode().equals(productOrder.getOrderStatus())){ - return; - } + String lockKey = "productOrder:success:"+productOrder.getId(); + long time = System.currentTimeMillis() + 30000; + String timeStr = String.valueOf(time); + try{ + while (!redisLock.lock2(lockKey, timeStr)){ + Thread.sleep(1000); + } + ProductOrder order = this.getById(productOrder.getId()); - productOrder.setOpenId(result.getOpenId()); - productOrder.setTransactionId(result.getTransactionId()); - productOrder.setPaymentTime(result.getPayTime()); - productOrder.setPayWay(result.getWay()); - productOrder.setOrderStatus(result.getCode()); - productOrder.setUpdateDate(new Date()); - int num = productOrderMapper.orderPayUpdStatus(productOrder); - if(num == 0){ - return; - }else if(num > 1){ + if(!EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode().equals(order.getOrderStatus())){ + return; + } + + order.setOpenId(result.getOpenId()); + order.setTransactionId(result.getTransactionId()); + order.setPaymentTime(result.getPayTime()); + order.setPayWay(result.getWay()); + order.setOrderStatus(result.getCode()); + order.setUpdateDate(new Date()); + order.setIsOrderStatus(EnumProductOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + int num = productOrderMapper.orderPayUpdStatus(order); + if(num == 0){ + return; + }else if(num > 1){ + throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); + } + Product product = productMapper.selectById(order.getProductId()); + if(EnumProductType.product_1.getCode().equals(product.getType())){ + userBasicPropertyService.addRechargeGlod(order.getUserId(),product.getProjectType(),order.getId(),product.getGlod()); + } + }catch(Exception e){ throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); - } - Product product = productMapper.selectById(productOrder.getProductId()); - if(EnumProductType.product_1.getCode().equals(product.getType())){ - userBasicPropertyService.addRechargeGlod(productOrder.getUserId(),product.getProjectType(),productOrder.getId(),product.getGlod()); + }finally { + redisLock.unlock(lockKey, timeStr); } }