From 9ca0ee18bb6d57a9b1c59a2d40afae42d323d7f8 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Thu, 11 Jun 2020 11:56:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/iformall/CApplication.java | 5 +- .../controller/WxPayOrderController.java | 2 +- .../helper/WxPayOrderServiceHelper.java | 24 +++++-- .../service/impl/WxPayOrderServiceImpl.java | 72 ++++++++++++++++--- 4 files changed, 85 insertions(+), 18 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/CApplication.java b/mallinkCApi/src/main/java/com/iformall/CApplication.java index c401d5678..4e5aeb268 100644 --- a/mallinkCApi/src/main/java/com/iformall/CApplication.java +++ b/mallinkCApi/src/main/java/com/iformall/CApplication.java @@ -1,12 +1,14 @@ package com.iformall; -import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import org.mybatis.spring.annotation.MapperScan; import org.rocketmq.starter.annotation.EnableRocketMQ; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; /** * @author chenkx @@ -16,6 +18,7 @@ import org.springframework.context.annotation.Bean; @MapperScan(basePackages = {"com.iformall.mapper"}) @EnableEncryptableProperties @EnableRocketMQ +@EnableAspectJAutoProxy(exposeProxy = true) public class CApplication { @Value("${fm.exception}") diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index 160dc1428..71d2fb400 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -133,7 +133,7 @@ public class WxPayOrderController extends BaseController { // 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态 // 有价券不走update, callback更新 if (payOrderId<=0) { - logger.info("payOrderId不能为空: " + paramMap.toString()); + logger.error("/api/pay/updatePayOrder error : payOrderId不能为空: " + paramMap.toString()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId非法"+payOrderId+"[payOrderIdStr:"+payOrderIdStr+"]"); } payOrder = wxPayOrderService.getById(payOrderId); diff --git a/mallinkService/src/main/java/com/iformall/service/helper/WxPayOrderServiceHelper.java b/mallinkService/src/main/java/com/iformall/service/helper/WxPayOrderServiceHelper.java index 827a8f52a..9c3d5c908 100644 --- a/mallinkService/src/main/java/com/iformall/service/helper/WxPayOrderServiceHelper.java +++ b/mallinkService/src/main/java/com/iformall/service/helper/WxPayOrderServiceHelper.java @@ -33,7 +33,7 @@ public class WxPayOrderServiceHelper { /** * 微信订单是否可以支付 */ - public static int wxOrderPayStatus(WxPayOrder record,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount) { + public static Map wxOrderPayStatusMap(WxPayOrder record,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount) { if (record == null) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "wxPayOrder is null."); } @@ -47,8 +47,17 @@ public class WxPayOrderServiceHelper { String response = wechatPayOrderQuery(appInfo, record,payAccount); logger.info("pay order query, " + record.toString() + ", response: " + response); - Map returnMap = WxPayment.xmlToMap(response); - String return_code = returnMap.get("return_code"); + try { + Map returnMap = WxPayment.xmlToMap(response); + return returnMap; + }catch(Exception e) { + logger.error("wx payQuery xmlToMap error:response:["+response+"]",e); + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "wx payQuery xmlToMap error"); + } + } + + public static int getPayStatusFromMap(Map returnMap,String payOrderNo) { + String return_code = returnMap.get("return_code"); if ("SUCCESS".equalsIgnoreCase(return_code)) { String result_code = returnMap.get("result_code"); @@ -71,17 +80,22 @@ public class WxPayOrderServiceHelper { }else if ("PAYERROR".equals(trade_state)) { return EnumPayStatus.PAY_STATUS_FAIL.getCode(); } - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态非法["+trade_state+"]"+record.getPayOrderNo()); + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态非法["+trade_state+"]"+payOrderNo); }else { String errCode = returnMap.get("err_code"); String errCodeDes = returnMap.get("err_code_des"); - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态失败["+errCode+":"+errCodeDes+"]"+record.getPayOrderNo()); + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态失败["+errCode+":"+errCodeDes+"]"+payOrderNo); } } else { String return_msg = returnMap.get("return_msg"); throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询微信支付状态失败"+return_msg); } } + + public static int wxOrderPayStatus(WxPayOrder record,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount) { + Map returnMap = wxOrderPayStatusMap(record,order,appInfo,payAccount); + return getPayStatusFromMap(returnMap,record.getPayOrderNo()); + } public static String wechatPayOrderQuery(WxAppinfo appInfo, WxPayOrder record ,WxPayAccount payAccount) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 51b1f26b3..cbfcd3c2f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -22,6 +22,7 @@ import com.iformall.utils.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -114,19 +115,66 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"reason\":\"请检查XML参数格式是否正确\"}}"); - @Transactional + private void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map retMap) { + //更新wxPayOrder + Date curDate = new Date(); + if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { + oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); + String timEndStr = retMap.get("time_end"); + Date timeEnd = null; + try { + timeEnd = Utility.getDateFromString(timEndStr); + } catch (ParseException e) { + logger.error("解析timeEnd失败"); + timeEnd = new Date(); + } + oldRecord.setPayTimeEnd(timeEnd); + oldRecord.setPayEndFrom(EnumPayEndFrom.QUERY.getCode()); + String transactionId = retMap.get("transaction_id"); + oldRecord.setTransactionId(transactionId); + oldRecord.setUpdateTime(curDate); + wxPayOrderMapper.updateById(oldRecord); + } + WxCoupon wxCoupon = wxCouponMapper.selectById(order.getProductId()); + if(wxCoupon != null) { + if (isOrderGroupCoupon(oldRecord, wxCoupon)) { + // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER + try { + wxOrderGroupService.createOrderGroup(order, wxCoupon); + } catch (Exception e) { + logger.error("参团失败" + e.getMessage()); + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); + order.setUpdateDate(new Date()); + wxOrderMapper.updateById(order); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD); + } + } else { + // 普通券, 修改订单状态 + try { + wxOrderService.couponOrderSuccess(order); + } catch (Exception e) { + logger.error(e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单更新"); + } + // 下订单完成,发送内部消息 + try { + wxOrderService.sendOrderSuccessActionMsg(order); + } catch (Exception e) { + logger.error("内部消息发送失败: " + e.getMessage()); + throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR); + } + } + } + } + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker) { - int wxpaystatus = WxPayOrderServiceHelper.wxOrderPayStatus(oldRecord, order, appInfo, payAccount); + //int wxpaystatus = WxPayOrderServiceHelper.wxOrderPayStatus(oldRecord, order, appInfo, payAccount); + Map retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, order, appInfo, payAccount); + int wxpaystatus = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, oldRecord.getPayOrderNo()); if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { - if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { - oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); - wxPayOrderMapper.updateById(oldRecord); - } - if (order.getOrderStatus() != EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()) { - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - wxOrderMapper.updateById(order); - } + handleSuccessOrder(oldRecord,order,retMap); throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"该订单已经支付,请勿重复支付!"); }else if (EnumPayStatus.PAY_STATUS_REFUND.getCode()==wxpaystatus) { if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_REFUND.getCode()) { @@ -302,7 +350,9 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { throw new MallinkException(ErrorCode.PAY_ORDER_EXIST); //如果是支付中的,则调用微信接口查询支付状态 }else if (oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_WAIT.getCode()) { - record = handleWxOrderQuery(oldRecord,order,appInfo,payAccount,idworker); + //TODO 直接调用不会触发事务,spring事务基于AOP代理 + WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); + record = proxy.handleWxOrderQuery(oldRecord,order,appInfo,payAccount,idworker); if (null == record) { throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"订单微信查询支付状态失败!"); }