From 442855f52641dac56f21ad19a25ff309ce23616c Mon Sep 17 00:00:00 2001 From: "Stormeye.Wu" Date: Wed, 15 Aug 2018 23:40:07 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=94=AF=E4=BB=98][=E4=BF=AE=E5=A4=8D]:?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E6=88=90=E5=8A=9F=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxPayOrderController.java | 51 +--- .../java/com/simple/enums/EnumPayStatus.java | 1 + .../simple/mapper/WxCouponOrderMapper.java | 6 - .../main/java/com/simple/pay/WxPayment.java | 20 ++ .../com/simple/service/WxPayOrderService.java | 55 ++-- .../service/impl/WxOrderServiceImpl.java | 17 +- .../service/impl/WxPayOrderServiceImpl.java | 265 ++++++++++++------ .../resources/mapper/WxCouponOrderMapper.xml | 5 - 8 files changed, 244 insertions(+), 176 deletions(-) diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java index 55c31fa32..4645a89cd 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java @@ -70,54 +70,21 @@ public class WxPayOrderController extends BaseController { return new ResultData(ErrorCode.PAY_ORDER_ERROR); } - /** - * - * @return 接收微信异步通知 - * @throws Exception 可能产生的任何异常 - */ - @AuthIgnore - @RequestMapping(value = "/notify/pay", method = RequestMethod.POST) - public String __doNotify(HttpServletRequest request) throws Exception { - Map paramMap = null; - String response; + @ApiOperation("更新支付订单状态") + @PostMapping("/updatePayOrder") + public ResultData updatePayOrder(@RequestBody WxPayOrder wxPayOrder) { try { - String xml = IOUtils.toString(request.getInputStream(), Charset.forName("UTF-8")); - paramMap = WxPayment.xmlToMap(xml); - logger.info("payment wxpay, notify, param: " + paramMap.toString() ); - response = wxPayOrderService.notify(paramMap, EnumPayWay.PAY_WAY_WEAPP); - logger.info("payment wxpay, notify success, req : " + paramMap.toString() + ", resp: " + response.toString()); - return response; - } catch (BizMessageException e) { - logger.error("payment wxpay, notify error, req: " + paramMap.toString() + ", e:" + e.getLocalizedMessage()); - return e.getMessage(); + wxPayOrderService.handlePayOrderStatusUpdate(wxPayOrder); + return new ResultData(); } catch (MallinkException e) { - logger.error("payment wxpay, notify error, req: " + paramMap.toString() + ", e:" +e.getLocalizedMessage()); - return e.getMessage(); + logger.error("payment wechat, order create error, update 2: " + wxPayOrder.toString() + ", e:" + e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); } catch (Exception e) { - logger.error("payment wxpay, order create error, req: " + paramMap.toString() + ", e: " + e.getMessage()); - return e.getMessage(); + logger.error("payment wechat, order create error, update 3: " + wxPayOrder.toString() + ", e:" + e.getMessage()); } + return new ResultData(ErrorCode.PAY_ORDER_ERROR); } - /** - * - * @return 同步回调(订单状态主动检查) - * @throws Exception 可能产生的任何异常 - */ - @RequestMapping(value = "/callback", method = {RequestMethod.GET, RequestMethod.POST}) - public String __doCallback(HttpServletRequest request) throws Exception { - - logger.info("payment wxpay, callback,request:" + request.toString()); - - return "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - "\n"; - } - @ApiOperation("分页列表接口") @GetMapping("/list") @ApiImplicitParams({ diff --git a/mallinkService/src/main/java/com/simple/enums/EnumPayStatus.java b/mallinkService/src/main/java/com/simple/enums/EnumPayStatus.java index 5a06c1bd4..2f2f89621 100644 --- a/mallinkService/src/main/java/com/simple/enums/EnumPayStatus.java +++ b/mallinkService/src/main/java/com/simple/enums/EnumPayStatus.java @@ -8,6 +8,7 @@ public enum EnumPayStatus { PAY_WAY_WAIT(0, "支付中"), PAY_WAY_SUCCESS(1, "支付成功"), PAY_WAY_FAIL(2, "支付失败"), + PAY_WAY_CANCEL(3, "取消支付") ; public static EnumPayStatus getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java b/mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java index 0d35df6ad..2d0387bca 100644 --- a/mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java +++ b/mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java @@ -8,10 +8,4 @@ import com.simple.domain.po.WxCouponOrder; public interface WxCouponOrderMapper extends CommonMapper { List findList(WxCouponOrder wxCouponOrder); - - - - - - } diff --git a/mallinkService/src/main/java/com/simple/pay/WxPayment.java b/mallinkService/src/main/java/com/simple/pay/WxPayment.java index 63b222451..215e4bb5d 100644 --- a/mallinkService/src/main/java/com/simple/pay/WxPayment.java +++ b/mallinkService/src/main/java/com/simple/pay/WxPayment.java @@ -153,6 +153,26 @@ public class WxPayment { } + /** + * 小程序统一下单后二次签名 + * + * @param appId + * @param timestamp + * @param prepay_id + * @param paternerKey + * @return + */ + public static Map buildWeappSecondSignMap(String appId, String timestamp, String prepay_id, String paternerKey) { + Map params = new HashMap(); + Map sighMap = MapUtil.getOrderMap(); + sighMap.put("appId", appId); + sighMap.put("timeStamp", timestamp); + sighMap.put("package", "prepay_id="+prepay_id); + sighMap.put("signType", "MD5"); + + return buildSignAfterParasMap(params, paternerKey); + } + /** * 关闭订单 * diff --git a/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java b/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java index 267d790c6..1187f71a4 100644 --- a/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java @@ -13,7 +13,8 @@ public interface WxPayOrderService { /** * 创建支付订单 - * @param record 支付订单请求 + * + * @param record 支付订单请求 * @param payWay * @return */ @@ -21,28 +22,45 @@ public interface WxPayOrderService { /** * 异步通知 - * @param paramMap 异步通知参数 - * @param payWay 支付方式 + * + * @param paramMap 异步通知参数 + * @param payWay 支付方式 * @return */ String notify(Map paramMap, EnumPayWay payWay); /** * 支付成功处理 + * * @param record * @param transactionId */ void handleOrderPaySuccess(WxPayOrder record, String transactionId); + /** + * 支付状态处理 + * + * @param record + */ + void handlePayOrderStatusUpdate(WxPayOrder record); + /** * 页面回调 - * @param paramMap 页面通知参数 - * @param payWay 支付方式 + * + * @param paramMap 页面通知参数 + * @param payWay 支付方式 * @return */ void callback(Map paramMap, EnumPayWay payWay); - /** + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(WxPayOrder record); + + /** * 根据实体查询分页列表 * * @param record @@ -50,22 +68,17 @@ public interface WxPayOrderService { * @param pageSize * @return */ - PageInfo listAsPage(WxPayOrder record, Integer pageIndex, Integer pageSize); - - /** + PageInfo listAsPage(WxPayOrder record, Integer pageIndex, Integer pageSize); + + /** * 根据Id获得实体 * * @param id * @return */ WxPayOrder getById(Long id); - - /** - * 保存或更新实体 - * - * @param record - */ - void saveOrUpdate(WxPayOrder record); + + /** * 根据Id删除实体 @@ -73,12 +86,6 @@ public interface WxPayOrderService { * @param id */ void deleteById(Long id); - - - - - - - - + + } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java index 60519fac9..98f08bb9f 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java @@ -103,22 +103,25 @@ public class WxOrderServiceImpl implements WxOrderService { } // check 购买是否超限 + int count = 0; try { WxCouponOrder query = new WxCouponOrder(); query.setCouponId(couponId); + query.setCUserId(user.getId()); query.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - List list = wxCouponOrderMapper.findList(query); - if (list.size() >= coupon.getUseLimitQuantity()) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); - } + count = wxCouponOrderMapper.selectCount(query); }catch (Exception e) { //解锁 redisLock.unlock(couponIdStr, timeStr); - logger.error("此券购买数量检查出问题了, couponId: " + couponIdStr); + logger.error("购买是否超限-DB, couponId: " + couponIdStr + ", e:" + e.getMessage()); throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } + if (count > coupon.getUseLimitQuantity()) { + //解锁 + redisLock.unlock(couponIdStr, timeStr); + logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); + throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); + } try { // 减库存 diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java index 508939db2..480cc9fc9 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java @@ -47,10 +47,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Autowired WxOrderMapper wxOrderMapper; - @Autowired + @Autowired WxPayOrderMapper wxPayOrderMapper; - @Autowired + @Autowired WxOrderService wxOrderService; JSONObject errorMap = JSON.parseObject("{\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + @@ -77,82 +77,98 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { // 1. check 订单 WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId()); if (order == null) { - logger.warn("pay order, order not allow, repaymentReq: " + record.toString() +", payWay: " + payWay.toString()); + logger.error("pay order, order not allow, repaymentReq: " + record.toString() + ", payWay: " + payWay.toString()); throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); } if (order.getOrderStatus() != EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()) { - logger.warn("pay order, order status not allow, repaymentReq: " + order.toString() + " , payWay: " + payWay.toString()); + logger.error("pay order, order status not allow, repaymentReq: " + order.toString() + " , payWay: " + payWay.toString()); throw new MallinkException(ErrorCode.ORDER_IS_NOT_PAY); } // 2. check 是否有支付订单 - List list = wxPayOrderMapper.findList(record); - if (list.size() > 0) { - throw new MallinkException(ErrorCode.PAY_ORDER_EXIST); - } - // 3. 创建支付订单 - Long id = idworker.nextId(); Date currentDate = new Date(); - - record.setId(id); - record.setTenantId(user.getTenantId()); - record.setCUserId(user.getId()); - record.setCreateTime(currentDate); - record.setUpdateTime(currentDate); int currentTime = Utility.convertDate2TimeStamp(currentDate); - record.setPayTimeStart(currentTime); - record.setPayTimeEnd(currentTime); - // 支付单号 - record.setPayOrderNo(String.valueOf(id)); - record.setPayAmount(order.getPayment()); - record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); - - int sqlRow = wxPayOrderMapper.insertSelective(record); - if(sqlRow != 1) { - throw new MallinkException(ErrorCode.DB_FAIL); + List list = wxPayOrderMapper.findList(record); + String payOrderNo = ""; + if (list.size() <= 0) { + // 3. 创建支付订单 + Long id = idworker.nextId(); + payOrderNo = String.valueOf(id); + record.setId(id); + record.setTenantId(user.getTenantId()); + record.setCUserId(user.getId()); + record.setCreateTime(currentDate); + record.setUpdateTime(currentDate); + record.setPayTimeStart(currentTime); + record.setPayTimeEnd(currentTime); + // 支付单号 + record.setPayOrderNo(payOrderNo); + record.setPayAmount(order.getPayment()); + record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); + record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); + + int sqlRow = wxPayOrderMapper.insertSelective(record); + if (sqlRow != 1) { + logger.error("pay order insert error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + } else { + record = list.get(0); + payOrderNo = String.valueOf(record.getId()); } + WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); - { - // 统一下单 - String noncestr = Utility.generate32UUID(); - WxPayOrderP wxPayOrderP = new WxPayOrderP(); - wxPayOrderP.setOpenid(user.getOpenId()); - wxPayOrderP.setAppid(user.getAppId()); - wxPayOrderP.setMch_id(payAccount.getMchId()); - wxPayOrderP.setNonce_str(noncestr); - wxPayOrderP.setBody(order.getDetail()); - wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); - wxPayOrderP.setTotal_fee(order.getPayment()); - wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP - wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); - wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 - wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID - wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentTime)); - wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(currentTime + 15 * 60)); // 15分钟结束 - wxPayOrderP.setSign(WxPayment.createSign(BeanUtils.toStringMap(wxPayOrderP), payAccount.getApiKey())); - String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); - logger.info("pay order, wechat pushOrder, wxPayOrder:" + wxPayOrderP.toString() + ", response: " + response.toString()); - Map returnMap = WxPayment.xmlToMap(response); - String result_no = returnMap.get("result_code"); - if ("SUCCESS".equals(result_no)) { - String prepay_id = returnMap.get("prepay_id"); - String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); - Map sighMap = MapUtil.getOrderMap(); - sighMap.put("appId", returnMap.get("appid")); - sighMap.put("timeStamp", timestamp); - sighMap.put("nonceStr", noncestr); - sighMap.put("package", "prepay_id="+prepay_id); - sighMap.put("signType", "MD5"); - String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); - returnMap.put("timeStamp", timestamp); - returnMap.put("nonceStr", noncestr); - returnMap.put("package", "prepay_id="+prepay_id); - returnMap.put("paySign", signAgent); - return new ResultData(200, "创建支付订单成功", returnMap); - } else { - JSONObject errObj = errorMap.getJSONObject(result_no); - return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); - } + + // 统一下单 + String noncestr = Utility.generate32UUID(); + WxPayOrderP wxPayOrderP = new WxPayOrderP(); + wxPayOrderP.setOpenid(user.getOpenId()); + wxPayOrderP.setAppid(user.getAppId()); + wxPayOrderP.setMch_id(payAccount.getMchId()); + wxPayOrderP.setNonce_str(noncestr); + wxPayOrderP.setBody(order.getDetail()); + wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderP.setTotal_fee(order.getPayment()); + wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID + wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentTime)); + wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(currentTime + 15 * 60)); // 15分钟结束 + wxPayOrderP.setSign(WxPayment.createSign(BeanUtils.toStringMap(wxPayOrderP), payAccount.getApiKey())); + String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); + logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); + returnMap.put("payOrderId", payOrderNo); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + /* + Map signMap = WxPayment.buildWeappSecondSignMap(returnMap.get("appid"), + String.valueOf(Utility.getCurrentTimeStamp()), + returnMap.get("prepay_id"), + payAccount.getApiKey()); + + String signAgent = signMap.remove("sign"); + returnMap.putAll(signMap); + returnMap.put("paySign", signAgent); + */ + String prepay_id = returnMap.get("prepay_id"); + String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); + Map sighMap = MapUtil.getOrderMap(); + sighMap.put("appId", returnMap.get("appid")); + sighMap.put("timeStamp", timestamp); + sighMap.put("nonceStr", noncestr); + sighMap.put("package", "prepay_id=" + prepay_id); + sighMap.put("signType", "MD5"); + String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); + returnMap.put("timeStamp", timestamp); + returnMap.put("nonceStr", noncestr); + returnMap.put("package", "prepay_id=" + prepay_id); + returnMap.put("paySign", signAgent); + logger.info("back to UI: " +returnMap.toString()); + return new ResultData(200, "创建支付订单成功", returnMap); + } else { + JSONObject errObj = errorMap.getJSONObject(result_code); + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); } } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); @@ -167,8 +183,9 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { /** * 提供微信支付回调调用 - * @param paramMap 异步通知参数 - * @param payWay 支付方式 + * + * @param paramMap 异步通知参数 + * @param payWay 支付方式 * @return */ @Override @@ -188,16 +205,14 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { try { if (payWay == EnumPayWay.PAY_WAY_WEAPP) { boolean signVerified = false; - if (payWay == EnumPayWay.PAY_WAY_WECHAT) { - // 微信支付 - signVerified = WxPayment.verifyNotify(paramMap, partnerKey); - } + // 微信支付 + signVerified = WxPayment.verifyNotify(paramMap, partnerKey); if (!signVerified) { - logger.warn("notify order, wxpay checksign error, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString()); + logger.warn("notify order, wxpay checksign error, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString()); throw new MallinkException(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR); } if (!"SUCCESS".equals(paramMap.get("return_code"))) { - logger.warn("notify order, wxpay status not success, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString()); + logger.warn("notify order, wxpay status not success, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString()); Map resultMap = new LinkedHashMap<>(); resultMap.put("return_code", "FAIL"); resultMap.put("return_msg", "订单状态码非SUCCESS"); @@ -208,15 +223,15 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { Long payOrderId = Long.valueOf(payOrderNo); WxPayOrder payOrder = wxPayOrderMapper.selectByPrimaryKey(payOrderId); if (payOrder == null) { - logger.warn("notify order, wxpay check pay order not exists, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString()); + logger.warn("notify order, wxpay check pay order not exists, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString()); Map resultMap = new LinkedHashMap<>(); resultMap.put("return_code", "FAIL"); resultMap.put("return_msg", "订单不存在"); return XmlUtil.parseDto2Xml(resultMap, ""); } // 验证支付金额 - if(!paramMap.get("total_fee").equals(payOrder.getPayAmount().toString())) { - logger.warn("notify order, wxpay check total_fee is invalid, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString()); + if (!paramMap.get("total_fee").equals(payOrder.getPayAmount().toString())) { + logger.warn("notify order, wxpay check total_fee is invalid, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString()); Map resultMap = new LinkedHashMap<>(); resultMap.put("return_code", "FAIL"); resultMap.put("return_msg", "订单总金额不一致"); @@ -225,14 +240,14 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { // 处理支付成功 handleOrderPaySuccess(payOrder, paramMap.get("transaction_id")); - logger.info("notify order, wxpay checksign success, paramMap:{}, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString()); + logger.info("notify order, wxpay checksign success, paramMap:{}, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString()); Map resultMap = new LinkedHashMap<>(); resultMap.put("return_code", "SUCCESS"); resultMap.put("return_msg", "OK"); return XmlUtil.parseDto2Xml(resultMap, ""); } } catch (RuntimeException e) { - logger.warn("notify order, alipay checksign error, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString() + ", e:" + e.getMessage()); + logger.warn("notify order, alipay checksign error, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString() + ", e:" + e.getMessage()); throw new MallinkException(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR); } return ""; @@ -246,8 +261,21 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public void handleOrderPaySuccess(WxPayOrder record, String transactionId) { + Date currentDate = new Date(); EnumPayStatus payStatus = EnumPayStatus.getEnum(record.getPayOrderStatus()); // 判断支付状态 + if (payStatus == EnumPayStatus.PAY_WAY_SUCCESS) { + // 已经是成功状态,只更新transactionId + try { + record.setUpdateTime(currentDate); + record.setTransactionId(transactionId); + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error(e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return; + } if (payStatus != EnumPayStatus.PAY_WAY_WAIT) { logger.error("pay success handle, payOrder " + record.getPayOrderNo() + "is paid success , orderId : " + record.getOrderId()); @@ -255,11 +283,11 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId()); if (order == null) { - logger.error("pay success handle, order " + record.getOrderId() +" not found , payOrderGid : " + record.getPayOrderNo()); + logger.error("pay success handle, order " + record.getOrderId() + " not found , payOrderGid : " + record.getPayOrderNo()); throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); } - Date currentDate = new Date(); + // 修改支付订单状态 try { WxPayOrder updateOrder = new WxPayOrder(); @@ -297,6 +325,65 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { */ } + @Override + public void handlePayOrderStatusUpdate(WxPayOrder record) { + // 判断支付状态 + if (record.getPayOrderStatus() != EnumPayStatus.PAY_WAY_WAIT.getCode()) { + logger.error("pay handle, payOrder " + record.getPayOrderNo() + + "is complete s , orderId : " + record.getOrderId()); + return; + } + WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId()); + if (order == null) { + logger.error("pay success handle, order " + record.getOrderId() + " not found , payOrderGid : " + record.getPayOrderNo()); + throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); + } + + Date currentDate = new Date(); + // 修改支付订单状态 + try { + WxPayOrder updateOrder = new WxPayOrder(); + updateOrder.setId(record.getId()); + updateOrder.setOrderId(record.getOrderId()); + updateOrder.setUpdateTime(currentDate); + updateOrder.setPayOrderStatus(record.getPayOrderStatus()); + wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder); + } catch (Exception e) { + logger.error(e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + + // 修改订单状态 + if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_SUCCESS.getCode()) { + try { + wxOrderService.updateOrderStatus(order.getId(), EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS); + } catch (Exception e) { + logger.error(e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + } else if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_CANCEL.getCode()) { + try { + wxOrderService.updateOrderStatus(order.getId(), EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); + } catch (Exception e) { + logger.error(e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + } + /* + Map msgMap = new HashMap<>(); + try { + msgMap.put("name", String.valueOf(order.getCouponId())); + msgMap.put("orderNo", String.valueOf(order.getId())); + msgMap.put("createTime", Utility.getDataFormatString3(order.getCreateDate())); + msgMap.put("standingTime", order.getCreateDate() + "-" + currentDate ); + // 短信 通知 商户 + //smsSenderHandler.sendSms("SMS_18195394", order.getMobile(), msgMap); + } catch (Exception e) { + logger.error("pay success handle, sms send exception, payOrderi: " + updatePayOrder+ ", msgMap: " + msgMap.toString() + ", e: " + e.getMessage()); + } + */ + } + @Override public PageInfo listAsPage(WxPayOrder record, Integer pageIndex, Integer pageSize) { @@ -313,7 +400,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if (record.getId() == null) { //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); IdWorker idWorker = new IdWorker(0, 0); - record.setId(idWorker.nextId()); + record.setId(idWorker.nextId()); wxPayOrderMapper.insertSelective(record); } else { wxPayOrderMapper.updateByPrimaryKeySelective(record); @@ -324,12 +411,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { public void deleteById(Long id) { wxPayOrderMapper.deleteByPrimaryKey(id); } - - - - - - - - + + } diff --git a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml index 3d7ba0907..3656f4487 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml @@ -90,9 +90,4 @@ - - - - -