From c6f835355c98c64484596195ef3f0531435d7aef Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Thu, 8 Nov 2018 10:36:13 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=88=B7=E5=8D=A1=E6=94=AF=E4=BB=98][?= =?UTF-8?q?=E6=94=B6=E9=93=B6=E5=8F=B0]:=E5=88=B7=E5=8D=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9E=E7=8E=B0=E6=9F=A5=E8=AF=A2=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=8F=8A=E6=92=A4=E9=94=80=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxMicroPayController.java | 111 ++++++- .../controller/WxPayOrderController.java | 4 +- .../java/com/iformall/common/ErrorCode.java | 1 + .../com/iformall/enums/EnumPayStatus.java | 16 +- .../iformall/service/WxPayOrderService.java | 7 + .../impl/WxCouponOrderServiceImpl.java | 5 +- .../service/impl/WxOrderServiceImpl.java | 2 +- .../service/impl/WxPayOrderServiceImpl.java | 275 ++++++++++++++---- .../impl/WxRefundOrderServiceImpl.java | 2 +- 9 files changed, 357 insertions(+), 66 deletions(-) diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java index 6eb9942aa..aba24a922 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java @@ -2,6 +2,7 @@ package com.iformall.controller; import com.iformall.common.ErrorCode; +import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.config.PayProperty; import com.iformall.domain.po.*; @@ -64,6 +65,8 @@ public class WxMicroPayController extends BaseController { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "totalFee不能为空"); } + String ipStr = IPUtil.getIpAddr(request); + WxMerchantBUser user = getUser(); WxOrder order = null; @@ -83,9 +86,9 @@ public class WxMicroPayController extends BaseController { record.setOrderId(order.getId()); record.setAuthCode(authCode); record.setPayAmount(order.getPayment()); + record.setIp(ipStr); try { - record.setIp(IPUtil.getIpAddr(request)); return wxPayOrderService.createMicroPayOrder(payProperty.isReal(), appInfo, user, record, EnumPayWay.PAY_WAY_WECHAT); } catch (MallinkException e) { logger.error("payment wechat, order create error, req 2: " + record.toString() + ", e:" + e.getMessage()); @@ -95,4 +98,110 @@ public class WxMicroPayController extends BaseController { return new ResultData(ErrorCode.PAY_ORDER_ERROR, e.getMessage()); } } + + @ApiOperation(value = "查询刷卡支付订单", notes = "{\"payOrderId\":\"String\",\"orderId\":\"String\"}") + @PostMapping("order_query") + public ResultData queryMicopayOrder(@RequestBody Map paramMap) { + logger.info("queryMicopayOrder: " + paramMap.toString()); + String payOrderIdStr = paramMap.get("payOrderId"); + String orderIdStr = paramMap.get("orderId"); + + if (StringUtils.isBlank(payOrderIdStr)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId不能为空"); + } + if (StringUtils.isBlank(orderIdStr)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); + } + WxMerchantBUser user = getUser(); + WxAppinfo appInfo = getAppInfo(user.getAppId()); + + Long payOrderId = 0L; + Long orderId = 0L; + try { + payOrderId = Long.valueOf(payOrderIdStr); + } catch (NumberFormatException e) { + payOrderId = 0L; + logger.error("payOrderId参数不正确: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + try { + orderId = Long.valueOf(orderIdStr); + } catch (NumberFormatException e) { + orderId = 0L; + logger.error("orderId参数不正确: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + + WxPayOrder record = new WxPayOrder(); + record.setId(payOrderId); + record.setbUserId(user.getId()); + record.setOrderId(orderId); + + try { + wxPayOrderService.payOrderQuery(appInfo, record); + } catch (MallinkException e) { + logger.error("payment wechat, order query error, req 2: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error("payment wechat, order query error, req 3: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.PAY_ORDER_QUERY_ERROR, e.getMessage()); + } + + + WxPayOrder payOrder = wxPayOrderService.getById(payOrderId); + if(payOrder != null) { + return new ResultData(payOrder); + } else { + return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND.getCode(), "支付订单未找到"); + } + } + + @ApiOperation(value = "撤销刷卡支付订单", notes = "{\"payOrderId\":\"String\",\"orderId\":\"String\"}") + @PostMapping("order_reverse") + public ResultData reverseMicopayOrder(@RequestBody Map paramMap) { + logger.info("reverseMicopayOrder: " + paramMap.toString()); + String payOrderIdStr = paramMap.get("payOrderId"); + String orderIdStr = paramMap.get("orderId"); + + if (StringUtils.isBlank(payOrderIdStr)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId不能为空"); + } + if (StringUtils.isBlank(orderIdStr)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); + } + WxMerchantBUser user = getUser(); + WxAppinfo appInfo = getAppInfo(user.getAppId()); + + Long payOrderId = 0L; + Long orderId = 0L; + try { + payOrderId = Long.valueOf(payOrderIdStr); + } catch (NumberFormatException e) { + payOrderId = 0L; + logger.error("payOrderId参数不正确: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + try { + orderId = Long.valueOf(orderIdStr); + } catch (NumberFormatException e) { + orderId = 0L; + logger.error("orderId参数不正确: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + + WxPayOrder record = new WxPayOrder(); + record.setId(payOrderId); + record.setbUserId(user.getId()); + record.setOrderId(orderId); + + try { + return wxPayOrderService.payOrderReverse(appInfo, record); + } catch (MallinkException e) { + logger.error("payment wechat, order query error, req 2: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error("payment wechat, order query error, req 3: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.PAY_ORDER_ERROR, e.getMessage()); + } + } } diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index fa48cd4e9..e59e1cb2f 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -106,10 +106,10 @@ public class WxPayOrderController extends BaseController { payOrder.setPayOrderStatus(status); payOrder.setFailReason(reasonStr); try { - if(status.equals(EnumPayStatus.PAY_WAY_SUCCESS.getCode()) && !payOrderIdStr.equals("0")) { + if(status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) && !payOrderIdStr.equals("0")) { // 有价券不走update, callback更新 payOrder = wxPayOrderService.getById(payOrderId); - if(payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_WAY_SUCCESS.getCode())) { + if(payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { return new ResultData(Result.SUCCESS, "支付状态更新成功"); } else { return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付未状态,请等待!!"); diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java index be00d7eaf..2f644e633 100644 --- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java @@ -164,6 +164,7 @@ public enum ErrorCode{ PAY_ORDER_IS_ZERO(12004, "支付订单金额为0"), PAY_ORDER_IS_NOT_PAYMENT(12005, "不是支付订单"), PREPAY_ID_IS_EMPTY(12006, "prepay_id是空值"), + PAY_ORDER_QUERY_ERROR(12007, "支付订单查询异常"), REFUND_ORDER_EXIST(12010, "退款订单已存在"), REFUND_PAY_ORDER_IS_NOT_EXIST(12011, "退款支付订单不存在"), diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumPayStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumPayStatus.java index bd49a112f..f6d69666d 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumPayStatus.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumPayStatus.java @@ -4,11 +4,17 @@ package com.iformall.enums; * Created by Stormeye on 2018/08/09. */ public enum EnumPayStatus { - PAY_WAY_UNKNOWN(-1, "未知"), - PAY_WAY_WAIT(0, "支付中"), - PAY_WAY_SUCCESS(1, "支付成功"), - PAY_WAY_FAIL(2, "支付失败"), - PAY_WAY_CANCEL(3, "取消支付") + PAY_STATUS_UNKNOWN(-1, "未知"), + PAY_STATUS_WAIT(0, "支付中"), + PAY_STATUS_SUCCESS(1, "支付成功"), + PAY_STATUS_ERR(2, "支付错误"), + PAY_STATUS_CANCEL(3, "取消支付"), + PAY_STATUS_CANCEL_FAIL(4,"取消支付失败"), + PAY_STATUS_CLOSE(5, "关闭支付订单"), + PAY_STATUS_CLOSE_FAIL(6,"关闭支付订单失败"), + PAY_STATUS_REVERSE(7, "关闭支付订单"), + PAY_STATUS_REVERSE_FAIL(8,"关闭支付订单失败"), + PAY_STATUS_REFUND(9,"支付转退款") ; public static EnumPayStatus getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java index 1a7056b22..8d4468cf5 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java @@ -44,6 +44,13 @@ public interface WxPayOrderService { */ ResultData payOrderClose(WxAppinfo appInfo, WxPayOrder record); + /** + * 微信支付刷卡支付撤销订单 + * @param appInfo 支付订单Appinfo + * @param record 支付订单 + */ + ResultData payOrderReverse(WxAppinfo appInfo, WxPayOrder record); + /** * 异步通知 * diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java index 0af8b15b9..42b184db7 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -5,7 +5,6 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; -import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; @@ -370,7 +369,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { try { WxPayOrder wxPayOrder = new WxPayOrder(); wxPayOrder.setOrderId(couponOrder.getOrderId()); - wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); + wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); wxPayOrder = wxPayOrderMapper.selectOne(wxPayOrder); if (wxPayOrder != null && wxPayOrder.getShare().equals(EnumPayShare.YES.getCode())) wxProfitSharingOrderService.createSharingOrder(wxPayOrder); @@ -437,7 +436,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { WxPayOrder payOrderQ = new WxPayOrder(); payOrderQ.setTenantId(couponOrder.getTenantId()); payOrderQ.setOrderId(order.getId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); List payList = wxPayOrderMapper.select(payOrderQ); if (payList.size() > 0) { payOrder = payList.get(0); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 41bc546b5..d57da6b2d 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -661,7 +661,7 @@ public class WxOrderServiceImpl implements WxOrderService { // 2. get pay order WxPayOrder payOrderQ = new WxPayOrder(); payOrderQ.setTenantId(order.getTenantId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); List payOrders = wxPayOrderMapper.select(payOrderQ); for(WxPayOrder payOrder: payOrders) { 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 1ca2f9a31..6cbb322c1 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -130,7 +130,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } // 2. check 是否有支付订单 Date currentDate = new Date(); - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); List list = wxPayOrderMapper.findList(record); String payOrderNo = ""; if (list.size() <= 0) { @@ -148,7 +148,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { record.setPayOrderNo(payOrderNo); record.setPayAmount(order.getPayment()); record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); record.setShare(isShare.getCode()); if (isShare == EnumPayShare.YES) { // 分账金额 @@ -388,7 +388,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } // 2. check 是否有支付订单 Date currentDate = new Date(); - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); List list = wxPayOrderMapper.findList(record); String payOrderNo = ""; if (list.size() <= 0) { @@ -406,7 +406,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { record.setPayOrderNo(payOrderNo); record.setPayAmount(order.getPayment()); record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); record.setShare(isShare.getCode()); if (isShare == EnumPayShare.YES) { // 分账金额 @@ -491,8 +491,18 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); } + } else { + String errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); } - return new ResultData(Result.ERROR, "刷卡支付异常", returnMap); } else { // 统一下单 // 服务商模式 String noncestr = Utility.generate32UUID(); @@ -564,8 +574,18 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); } + } else { + String errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); } - return new ResultData(Result.ERROR, "刷卡支付异常", returnMap); } } else { // 虚拟支付 @@ -656,37 +676,63 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { logger.info("pay order query, " + record.toString() + ", response: " + response); Map returnMap = WxPayment.xmlToMap(response); + String return_code = returnMap.get("return_code"); String result_code = returnMap.get("result_code"); - if ("SUCCESS".equals(result_code)) { - String trade_state = returnMap.get("trade_state"); - //SUCCESS—支付成功 - //REFUND—转入退款 - //NOTPAY—未支付 - //CLOSED—已关闭 - //REVOKED—已撤销(刷卡支付) - //USERPAYING--用户支付中 - //PAYERROR--支付失败(其他原因,如银行返回失败) - if ("SUCCESS".equals(trade_state)) { - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); - handlePayOrderStatusUpdate(record); - } else if ("USERPAYING".equals(trade_state)) { - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); - handlePayOrderStatusUpdate(record); + if("SUCCESS".equalsIgnoreCase(return_code)) { + if ("SUCCESS".equals(result_code)) { + String trade_state = returnMap.get("trade_state"); + //SUCCESS—支付成功 + //REFUND—转入退款 + //NOTPAY—未支付 + //CLOSED—已关闭 + //REVOKED—已撤销(刷卡支付) + //USERPAYING--用户支付中 + //PAYERROR--支付失败(其他原因,如银行返回失败) + if ("SUCCESS".equals(trade_state)) { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); + handlePayOrderStatusUpdate(record); + } else if ("REFUND".equals(trade_state)) { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_REFUND.getCode()); + handlePayOrderStatusUpdate(record); + } else if ("NOTPAY".equals(trade_state)) { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + handlePayOrderStatusUpdate(record); + } else if ("CLOSED".equals(trade_state)) { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_CLOSE.getCode()); + handlePayOrderStatusUpdate(record); + } else if ("REVOKED".equals(trade_state)) { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_REVERSE.getCode()); + handlePayOrderStatusUpdate(record); + } else if ("USERPAYING".equals(trade_state)) { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + handlePayOrderStatusUpdate(record); + } else { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_ERR.getCode()); + handlePayOrderStatusUpdate(record); + } + return new ResultData(Result.SUCCESS, "订单查询成功", returnMap); } else { - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_FAIL.getCode()); - handlePayOrderStatusUpdate(record); + String errMsg = ""; + JSONObject errObj = errorMapQuery.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + record.setFailReason(errMsg); + } else { + errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + } + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); } - return new ResultData(Result.SUCCESS, "订单查询成功", returnMap); } else { - String errMsg = ""; - JSONObject errObj = errorMapQuery.getJSONObject(result_code); - if (errObj != null) { - errMsg = errObj.toJSONString(); - record.setFailReason(errMsg); - } else { - errMsg = returnMap.get("return_msg"); - record.setFailReason(errMsg); - } + String errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); record.setUpdateTime(new Date()); try { wxPayOrderMapper.updateByPrimaryKeySelective(record); @@ -722,6 +768,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); map = BeanUtils.toStringMap(payOrderC); String response = WxPay.closeOrder(map); + logger.info("request:" + map.toString() + "\nresponse:" + response); return response; } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); @@ -745,6 +792,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); map = BeanUtils.toStringMap(payOrderSC); String response = WxPay.closeOrder(map); + logger.info("request:" + map.toString() + "\nresponse:" + response); return response; } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); @@ -765,19 +813,139 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { logger.info("pay order close, " + record.toString() + ", response: " + response); Map returnMap = WxPayment.xmlToMap(response); + String return_code = returnMap.get("return_code"); String result_code = returnMap.get("result_code"); - if ("SUCCESS".equals(result_code)) { - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_CANCEL.getCode()); - handlePayOrderStatusUpdate(record); - return new ResultData(Result.SUCCESS, "订单关闭成功", returnMap); + if("SUCCESS".equalsIgnoreCase(return_code)) { + if ("SUCCESS".equals(result_code)) { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_CANCEL.getCode()); + handlePayOrderStatusUpdate(record); + return new ResultData(Result.SUCCESS, "订单关闭成功", returnMap); + } else { + String errMsg = ""; + JSONObject errObj = errorMapClose.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + } else { + errMsg = returnMap.get("return_msg"); + } + record.setFailReason(errMsg); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); + } } else { - String errMsg = ""; - JSONObject errObj = errorMapClose.getJSONObject(result_code); - if (errObj != null) { - errMsg = errObj.toJSONString(); + String errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); + } + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } + + private String wechatPayOrderReverse(WxAppinfo appInfo, WxPayOrder record) { + // get payAccount + WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); + if (payAccount.getType() == EnumPayMode.MCH.getCode()) { + // 普通商户号模式 + WxPayOrderQ payOrderC = new WxPayOrderQ(); + String noncestr = Utility.generate32UUID(); + payOrderC.setAppid(appInfo.getAppId()); + payOrderC.setMch_id(payAccount.getMchId()); + payOrderC.setNonce_str(noncestr); + payOrderC.setOut_trade_no(record.getPayOrderNo()); + + try { + Map map = BeanUtils.toStringMap(payOrderC); + payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); + map = BeanUtils.toStringMap(payOrderC); + String response = WxPay.orderReverse(map, payAccount.getCertPath(), payAccount.getMchId()); + logger.info("request:" + map.toString() + "\nresponse:" + response); + return response; + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } else { + // 服务商模式 + WxPayOrderSQ payOrderSC = new WxPayOrderSQ(); + String noncestr = Utility.generate32UUID(); + payOrderSC.setAppid(appInfo.getParentAppId()); + payOrderSC.setSub_appid(appInfo.getAppId()); + payOrderSC.setMch_id(payAccount.getMchId()); + payOrderSC.setSub_mch_id(payAccount.getSubMchId()); + payOrderSC.setNonce_str(noncestr); + payOrderSC.setOut_trade_no(record.getPayOrderNo()); + payOrderSC.setSign_type("HMAC-SHA256"); + + try { + Map map = BeanUtils.toStringMap(payOrderSC); + payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); + map = BeanUtils.toStringMap(payOrderSC); + String response = WxPay.orderReverse(map, payAccount.getCertPath(), payAccount.getMchId()); + logger.info("request:" + map.toString() + "\nresponse:" + response); + return response; + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } + } + + /** + * 微信刷卡支付撤销订单 + */ + @Override + public ResultData payOrderReverse(WxAppinfo appInfo, WxPayOrder record) { + + try { + String response = wechatPayOrderReverse(appInfo, record); + + logger.info("pay order reverse, " + record.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + String return_code = returnMap.get("return_code"); + String result_code = returnMap.get("result_code"); + if("SUCCESS".equalsIgnoreCase(return_code)) { + if ("SUCCESS".equals(result_code)) { + record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_CANCEL.getCode()); + handlePayOrderStatusUpdate(record); + return new ResultData(Result.SUCCESS, "订单关闭成功", returnMap); } else { - errMsg = returnMap.get("return_msg"); + String errMsg = ""; + JSONObject errObj = errorMapClose.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + } else { + errMsg = returnMap.get("return_msg"); + } + record.setFailReason(errMsg); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateByPrimaryKeySelective(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); } + } else { + String errMsg = returnMap.get("return_msg"); record.setFailReason(errMsg); record.setUpdateTime(new Date()); try { @@ -788,6 +956,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); } + } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } catch (Exception e) { @@ -920,7 +1089,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { Date currentDate = new Date(); EnumPayStatus payStatus = EnumPayStatus.getEnum(record.getPayOrderStatus()); // 判断支付状态 - if (payStatus == EnumPayStatus.PAY_WAY_SUCCESS) { + if (payStatus == EnumPayStatus.PAY_STATUS_SUCCESS) { // 已经是成功状态,只更新transactionId try { record.setUpdateTime(currentDate); @@ -932,8 +1101,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } return; } - if (payStatus != EnumPayStatus.PAY_WAY_WAIT) { - logger.error("pay success handle, payOrder " + record.getPayOrderNo() + + if (payStatus != EnumPayStatus.PAY_STATUS_WAIT) { + logger.info("pay success handle, payOrder " + record.getPayOrderNo() + "is paid success , orderId : " + record.getOrderId()); return; } @@ -949,7 +1118,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { updateOrder.setId(record.getId()); updateOrder.setOrderId(record.getOrderId()); updateOrder.setUpdateTime(currentDate); - updateOrder.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); + updateOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); updateOrder.setTransactionId(transactionId); try { wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder); @@ -988,7 +1157,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public void handlePayOrderStatusUpdate(WxPayOrder record) { // 判断支付状态 - if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_WAIT.getCode()) { + if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_WAIT.getCode()) { logger.error("pay handle, payOrder " + record.getPayOrderNo() + "is complete, orderId : " + record.getOrderId()); return; @@ -1038,13 +1207,13 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND); } - if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_CANCEL.getCode()) { + if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_CANCEL.getCode()) { // 支付订单取消 if (record.getPayAmount() > 0) { payOrderQ = new WxPayOrder(); payOrderQ.setTenantId(order.getTenantId()); payOrderQ.setOrderId(record.getOrderId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); List payOrders = wxPayOrderMapper.select(payOrderQ); for (WxPayOrder payOrder : payOrders) { payOrderClose(appInfo, payOrder); @@ -1052,7 +1221,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } else { // 支付订单成功? - if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_WAY_SUCCESS.getCode())) { + if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { if (StringUtils.isBlank(updateOrder.getTransactionId())) { // 回调已设置成功 // 继续修改订单状态 @@ -1060,7 +1229,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { // 回调异常 throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "transactionId未获取"); } - } else if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_WAY_WAIT.getCode())) { + } else if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_WAIT.getCode())) { // 回调未返回,主动检查支付订单状态 try { record.setPayOrderNo(String.valueOf(record.getId())); @@ -1098,7 +1267,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } // 修改订单状态 - if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_SUCCESS.getCode()) { + if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { try { int _count = wxOrderService.orderSuccess(order); if (_count > 1) { @@ -1108,7 +1277,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { logger.error(e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单更新"); } - } else if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_CANCEL.getCode()) { + } else if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_CANCEL.getCode()) { try { int _count = wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); if (_count > 1) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java index fde2bac94..7965ef266 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java @@ -338,7 +338,7 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { payOrderQ.setTenantId(appInfo.getTenantId()); payOrderQ.setcUserId(wxOrder.getCUserId()); payOrderQ.setOrderId(wxOrder.getId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); WxPayOrder payOrder = null; List list = wxPayOrderMapper.findList(payOrderQ);