Browse Source

//..

private_deployment
xhxu 1 year ago
parent
commit
9e3b549b34
2 changed files with 52 additions and 22 deletions
  1. +15
    -4
      suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java
  2. +37
    -18
      suimangService/src/main/java/com/iformall/service/impl/ProductOrderServiceImpl.java

+ 15
- 4
suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java View File

@@ -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


+ 37
- 18
suimangService/src/main/java/com/iformall/service/impl/ProductOrderServiceImpl.java View File

@@ -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<ProductOrder> 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);
}

}


Loading…
Cancel
Save