From ee1f13ec2159b510965d881bc51e6be81fcad162 Mon Sep 17 00:00:00 2001 From: "Stormeye.Wu" Date: Mon, 22 Oct 2018 14:25:24 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=94=AF=E4=BB=98=E5=BC=82=E5=B8=B8=E4=BF=AE?= =?UTF-8?q?=E6=94=B9][=E4=BF=AE=E6=94=B9]:api=E4=B8=8D=E8=83=BD=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=AE=A2=E5=8D=95=E6=94=AF=E4=BB=98=E6=88=90=E5=8A=9F?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E4=BB=98=E6=88=90=E5=8A=9F=E5=8F=AA=E8=83=BD?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E5=9B=9E=E8=B0=83=E5=92=8C=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxPayOrderController.java | 4 + .../service/impl/WxPayOrderServiceImpl.java | 338 +++++++++--------- .../impl/WxRefundOrderServiceImpl.java | 12 +- 3 files changed, 185 insertions(+), 169 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index 862547943..1bfee33d7 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -8,6 +8,7 @@ import com.iformall.config.PayProperty; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxPayOrder; +import com.iformall.enums.EnumPayStatus; import com.iformall.enums.EnumPayWay; import com.iformall.exception.MallinkException; import com.iformall.service.WxPayOrderService; @@ -98,6 +99,9 @@ public class WxPayOrderController extends BaseController { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId参数不正确"); } } + if (!status.equals(EnumPayStatus.PAY_WAY_CANCEL.getCode())) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "只支持取消支付订单"); + } WxPayOrder payOrder = new WxPayOrder(); payOrder.setId(payOrderId); 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 6c844c844..c07b2f7d7 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -349,13 +349,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } - // TODO - /** - * 微信订单查询 - */ - @Override - public ResultData payOrderQuery(WxAppinfo appInfo, WxPayOrder record) { + private String wechatPayOrderQuery(WxAppinfo appInfo, WxPayOrder record) { // get payAccount WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); if (payAccount.getType() == EnumPayMode.MCH.getCode()) { @@ -372,49 +367,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { payOrderQ.setSign(WxPayment.createSign(map, payAccount.getApiKey())); map = BeanUtils.toStringMap(payOrderQ); String response = WxPay.orderQuery(map); - - logger.info("pay order query, " + payOrderQ.toString() + ", response: " + response); - Map returnMap = WxPayment.xmlToMap(response); - 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); - } else { - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_FAIL.getCode()); - handlePayOrderStatusUpdate(record); - } - 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); - } - 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 response; } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } catch (Exception e) { @@ -438,49 +391,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { map = BeanUtils.toStringMap(payOrderSQ); String response = WxPay.orderQuery(map); - - logger.info("pay order query, " + payOrderSQ.toString() + ", response: " + response); - Map returnMap = WxPayment.xmlToMap(response); - 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); - } else { - record.setPayOrderStatus(EnumPayStatus.PAY_WAY_FAIL.getCode()); - handlePayOrderStatusUpdate(record); - } - 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); - } - 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 response; } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } catch (Exception e) { @@ -490,10 +401,65 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } /** - * 微信关闭支付订单 + * 微信订单查询 */ @Override - public ResultData payOrderClose(WxAppinfo appInfo, WxPayOrder record) { + public ResultData payOrderQuery(WxAppinfo appInfo, WxPayOrder record) { + try { + String response = wechatPayOrderQuery(appInfo, record); + + logger.info("pay order query, " + record.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + 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); + } else { + record.setPayOrderStatus(EnumPayStatus.PAY_WAY_FAIL.getCode()); + handlePayOrderStatusUpdate(record); + } + 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); + } + 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 (MallinkException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } 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 wechatPayOrderClose(WxAppinfo appInfo, WxPayOrder record) { // get payAccount WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); if (payAccount.getType() == EnumPayMode.MCH.getCode()) { @@ -510,32 +476,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); map = BeanUtils.toStringMap(payOrderC); String response = WxPay.closeOrder(map); - - logger.info("pay order close, " + payOrderC.toString() + ", response: " + response); - Map returnMap = WxPayment.xmlToMap(response); - 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); - } 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(), errObj.toJSONString(), returnMap); - } + return response; } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } catch (Exception e) { @@ -558,32 +499,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); map = BeanUtils.toStringMap(payOrderSC); String response = WxPay.closeOrder(map); - - logger.info("pay order close, " + payOrderSC.toString() + ", response: " + response); - Map returnMap = WxPayment.xmlToMap(response); - 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); - } 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); - } + return response; } catch (RuntimeException e) { throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } catch (Exception e) { @@ -592,6 +508,47 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } + /** + * 微信关闭支付订单 + */ + @Override + public ResultData payOrderClose(WxAppinfo appInfo, WxPayOrder record) { + + try { + String response = wechatPayOrderClose(appInfo, record); + + logger.info("pay order close, " + record.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + 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); + } 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); + } + } 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()); + } + } + /** * 提供微信支付回调调用 @@ -781,6 +738,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public void handlePayOrderStatusUpdate(WxPayOrder record) { + // 只支持取消 payOrder // 判断支付状态 if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_WAIT.getCode()) { logger.error("pay handle, payOrder " + record.getPayOrderNo() + @@ -797,45 +755,91 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { logger.error("pay handle, order " + record.getOrderId() + " not found , payOrderGid : " + record.getPayOrderNo()); throw new MallinkException(ErrorCode.USER_IS_EMPTY); } + // 1. get appinfo + WxAppinfo appInfo = null; + WxAppinfo appinfoQ = new WxAppinfo(); + appinfoQ.setTenantId(order.getTenantId()); + appinfoQ.setType(EnumAppType.C.getCode()); + List appList = wxAppinfoMapper.select(appinfoQ); + if (appList.size() > 0) { + appInfo = appList.get(0); + } Date currentDate = new Date(); if (record.getId() > 0) { - // 修改支付订单状态 - // 订单金额为0时,支付订单不创建,直接更改订单状态 - WxPayOrder updateOrder = new WxPayOrder(); - updateOrder.setId(record.getId()); - updateOrder.setOrderId(record.getOrderId()); - updateOrder.setUpdateTime(currentDate); - updateOrder.setPayOrderStatus(record.getPayOrderStatus()); - updateOrder.setPayTimeEnd(currentDate); - updateOrder.setFailReason(record.getFailReason()); + WxPayOrder updateOrder = null; + + // 检查支付订单状态 + WxPayOrder payOrderQ = new WxPayOrder(); + payOrderQ.setId(record.getId()); + payOrderQ.setOrderId(record.getOrderId()); try { - wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder); + updateOrder = wxPayOrderMapper.selectOne(payOrderQ); } catch (Exception e) { logger.error(e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL); + throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND); } if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_CANCEL.getCode()) { // 支付订单取消 if (record.getPayAmount() > 0) { - // 1. get appinfo - WxAppinfo appInfo = null; - WxAppinfo appinfoQ = new WxAppinfo(); - appinfoQ.setTenantId(order.getTenantId()); - appinfoQ.setType(EnumAppType.C.getCode()); - List appList = wxAppinfoMapper.select(appinfoQ); - if (appList.size() > 0) { - appInfo = appList.get(0); - } - WxPayOrder payOrderQ = new WxPayOrder(); + payOrderQ = new WxPayOrder(); payOrderQ.setTenantId(order.getTenantId()); + payOrderQ.setOrderId(record.getOrderId()); payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); List payOrders = wxPayOrderMapper.select(payOrderQ); for (WxPayOrder payOrder : payOrders) { payOrderClose(appInfo, payOrder); } } + } else { + // 支付订单成功? + if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_WAY_SUCCESS.getCode())) { + if (StringUtils.isBlank(updateOrder.getTransactionId())) { + // 回调已设置成功 + // 继续修改订单状态 + } else { + // 回调异常 + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "transactionId未获取"); + } + } else if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_WAY_WAIT.getCode())) { + // 回调未返回,主动检查支付订单状态 + try { + String response = wechatPayOrderQuery(appInfo, record); + + logger.info("pay order query, " + record.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + 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)) { + // 查询支付订单 -- 已支付 + // 继续更改状态 + } else { + // 支付订单未成功,返回异常 + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "支付订单未成功"); + } + } + } catch (MallinkException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } 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 { + // 支付订单未创建, 订单金额不为0时, 返回异常 + if (order.getPayment() > 0) { + throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND); } } 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 2999a2d24..fde2bac94 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java @@ -631,8 +631,16 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { return new ResultData(Result.SUCCESS, "退款", returnMap); } else { wxRefundOrderMapper.updateByPrimaryKey(record); + String errMsg = ""; JSONObject errObj = errorRefundReqMap.getJSONObject(result_no); - return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); + if (errObj != null) { + errMsg = errObj.toJSONString(); + record.setFailReason(errMsg); + } else { + errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + } + return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), errMsg, returnMap); } } else { Map paramMap = WxPayment.buildSWeappRefundQueryMap( @@ -655,7 +663,7 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { record.setFailReason(errMsg); } wxRefundOrderMapper.updateByPrimaryKey(record); - return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); + return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), errMsg, returnMap); } } }