Browse Source

[刷卡支付][收银台]:刷卡支付实现查询订单接口及撤销订单接口

release_toaliyun_real
Stormeye Wu 7 years ago
parent
commit
c6f835355c
9 changed files with 357 additions and 66 deletions
  1. +110
    -1
      mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java
  2. +2
    -2
      mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java
  3. +1
    -0
      mallinkService/src/main/java/com/iformall/common/ErrorCode.java
  4. +11
    -5
      mallinkService/src/main/java/com/iformall/enums/EnumPayStatus.java
  5. +7
    -0
      mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java
  6. +2
    -3
      mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java
  7. +1
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
  8. +222
    -53
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java
  9. +1
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java

+ 110
- 1
mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java View File

@@ -2,6 +2,7 @@ package com.iformall.controller;




import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.config.PayProperty; import com.iformall.config.PayProperty;
import com.iformall.domain.po.*; import com.iformall.domain.po.*;
@@ -64,6 +65,8 @@ public class WxMicroPayController extends BaseController {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "totalFee不能为空"); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "totalFee不能为空");
} }


String ipStr = IPUtil.getIpAddr(request);

WxMerchantBUser user = getUser(); WxMerchantBUser user = getUser();


WxOrder order = null; WxOrder order = null;
@@ -83,9 +86,9 @@ public class WxMicroPayController extends BaseController {
record.setOrderId(order.getId()); record.setOrderId(order.getId());
record.setAuthCode(authCode); record.setAuthCode(authCode);
record.setPayAmount(order.getPayment()); record.setPayAmount(order.getPayment());
record.setIp(ipStr);


try { try {
record.setIp(IPUtil.getIpAddr(request));
return wxPayOrderService.createMicroPayOrder(payProperty.isReal(), appInfo, user, record, EnumPayWay.PAY_WAY_WECHAT); return wxPayOrderService.createMicroPayOrder(payProperty.isReal(), appInfo, user, record, EnumPayWay.PAY_WAY_WECHAT);
} catch (MallinkException e) { } catch (MallinkException e) {
logger.error("payment wechat, order create error, req 2: " + record.toString() + ", e:" + e.getMessage()); 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()); return new ResultData(ErrorCode.PAY_ORDER_ERROR, e.getMessage());
} }
} }

@ApiOperation(value = "查询刷卡支付订单", notes = "{\"payOrderId\":\"String\",\"orderId\":\"String\"}")
@PostMapping("order_query")
public ResultData queryMicopayOrder(@RequestBody Map<String, String> 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<String, String> 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());
}
}
} }

+ 2
- 2
mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java View File

@@ -106,10 +106,10 @@ public class WxPayOrderController extends BaseController {
payOrder.setPayOrderStatus(status); payOrder.setPayOrderStatus(status);
payOrder.setFailReason(reasonStr); payOrder.setFailReason(reasonStr);
try { 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更新 // 有价券不走update, callback更新
payOrder = wxPayOrderService.getById(payOrderId); 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, "支付状态更新成功"); return new ResultData(Result.SUCCESS, "支付状态更新成功");
} else { } else {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付未状态,请等待!!"); return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付未状态,请等待!!");


+ 1
- 0
mallinkService/src/main/java/com/iformall/common/ErrorCode.java View File

@@ -164,6 +164,7 @@ public enum ErrorCode{
PAY_ORDER_IS_ZERO(12004, "支付订单金额为0"), PAY_ORDER_IS_ZERO(12004, "支付订单金额为0"),
PAY_ORDER_IS_NOT_PAYMENT(12005, "不是支付订单"), PAY_ORDER_IS_NOT_PAYMENT(12005, "不是支付订单"),
PREPAY_ID_IS_EMPTY(12006, "prepay_id是空值"), PREPAY_ID_IS_EMPTY(12006, "prepay_id是空值"),
PAY_ORDER_QUERY_ERROR(12007, "支付订单查询异常"),


REFUND_ORDER_EXIST(12010, "退款订单已存在"), REFUND_ORDER_EXIST(12010, "退款订单已存在"),
REFUND_PAY_ORDER_IS_NOT_EXIST(12011, "退款支付订单不存在"), REFUND_PAY_ORDER_IS_NOT_EXIST(12011, "退款支付订单不存在"),


+ 11
- 5
mallinkService/src/main/java/com/iformall/enums/EnumPayStatus.java View File

@@ -4,11 +4,17 @@ package com.iformall.enums;
* Created by Stormeye on 2018/08/09. * Created by Stormeye on 2018/08/09.
*/ */
public enum EnumPayStatus { 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) { public static EnumPayStatus getEnum(Integer code) {


+ 7
- 0
mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java View File

@@ -44,6 +44,13 @@ public interface WxPayOrderService {
*/ */
ResultData payOrderClose(WxAppinfo appInfo, WxPayOrder record); ResultData payOrderClose(WxAppinfo appInfo, WxPayOrder record);


/**
* 微信支付刷卡支付撤销订单
* @param appInfo 支付订单Appinfo
* @param record 支付订单
*/
ResultData payOrderReverse(WxAppinfo appInfo, WxPayOrder record);

/** /**
* 异步通知 * 异步通知
* *


+ 2
- 3
mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java View File

@@ -5,7 +5,6 @@ import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@@ -370,7 +369,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService {
try { try {
WxPayOrder wxPayOrder = new WxPayOrder(); WxPayOrder wxPayOrder = new WxPayOrder();
wxPayOrder.setOrderId(couponOrder.getOrderId()); wxPayOrder.setOrderId(couponOrder.getOrderId());
wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode());
wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());
wxPayOrder = wxPayOrderMapper.selectOne(wxPayOrder); wxPayOrder = wxPayOrderMapper.selectOne(wxPayOrder);
if (wxPayOrder != null && wxPayOrder.getShare().equals(EnumPayShare.YES.getCode())) if (wxPayOrder != null && wxPayOrder.getShare().equals(EnumPayShare.YES.getCode()))
wxProfitSharingOrderService.createSharingOrder(wxPayOrder); wxProfitSharingOrderService.createSharingOrder(wxPayOrder);
@@ -437,7 +436,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService {
WxPayOrder payOrderQ = new WxPayOrder(); WxPayOrder payOrderQ = new WxPayOrder();
payOrderQ.setTenantId(couponOrder.getTenantId()); payOrderQ.setTenantId(couponOrder.getTenantId());
payOrderQ.setOrderId(order.getId()); payOrderQ.setOrderId(order.getId());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());
List<WxPayOrder> payList = wxPayOrderMapper.select(payOrderQ); List<WxPayOrder> payList = wxPayOrderMapper.select(payOrderQ);
if (payList.size() > 0) { if (payList.size() > 0) {
payOrder = payList.get(0); payOrder = payList.get(0);


+ 1
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java View File

@@ -661,7 +661,7 @@ public class WxOrderServiceImpl implements WxOrderService {
// 2. get pay order // 2. get pay order
WxPayOrder payOrderQ = new WxPayOrder(); WxPayOrder payOrderQ = new WxPayOrder();
payOrderQ.setTenantId(order.getTenantId()); payOrderQ.setTenantId(order.getTenantId());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> payOrders = wxPayOrderMapper.select(payOrderQ); List<WxPayOrder> payOrders = wxPayOrderMapper.select(payOrderQ);


for(WxPayOrder payOrder: payOrders) { for(WxPayOrder payOrder: payOrders) {


+ 222
- 53
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java View File

@@ -130,7 +130,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
// 2. check 是否有支付订单 // 2. check 是否有支付订单
Date currentDate = new Date(); Date currentDate = new Date();
record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode());
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> list = wxPayOrderMapper.findList(record); List<WxPayOrder> list = wxPayOrderMapper.findList(record);
String payOrderNo = ""; String payOrderNo = "";
if (list.size() <= 0) { if (list.size() <= 0) {
@@ -148,7 +148,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
record.setPayOrderNo(payOrderNo); record.setPayOrderNo(payOrderNo);
record.setPayAmount(order.getPayment()); record.setPayAmount(order.getPayment());
record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); 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()); record.setShare(isShare.getCode());
if (isShare == EnumPayShare.YES) { if (isShare == EnumPayShare.YES) {
// 分账金额 // 分账金额
@@ -388,7 +388,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
// 2. check 是否有支付订单 // 2. check 是否有支付订单
Date currentDate = new Date(); Date currentDate = new Date();
record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode());
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> list = wxPayOrderMapper.findList(record); List<WxPayOrder> list = wxPayOrderMapper.findList(record);
String payOrderNo = ""; String payOrderNo = "";
if (list.size() <= 0) { if (list.size() <= 0) {
@@ -406,7 +406,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
record.setPayOrderNo(payOrderNo); record.setPayOrderNo(payOrderNo);
record.setPayAmount(order.getPayment()); record.setPayAmount(order.getPayment());
record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); 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()); record.setShare(isShare.getCode());
if (isShare == EnumPayShare.YES) { if (isShare == EnumPayShare.YES) {
// 分账金额 // 分账金额
@@ -491,8 +491,18 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); 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 { } else {
// 统一下单 // 服务商模式 // 统一下单 // 服务商模式
String noncestr = Utility.generate32UUID(); String noncestr = Utility.generate32UUID();
@@ -564,8 +574,18 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); 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 { } else {
// 虚拟支付 // 虚拟支付
@@ -656,37 +676,63 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {


logger.info("pay order query, " + record.toString() + ", response: " + response); logger.info("pay order query, " + record.toString() + ", response: " + response);
Map<String, String> returnMap = WxPayment.xmlToMap(response); Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
String result_code = returnMap.get("result_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 { } 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 { } 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()); record.setUpdateTime(new Date());
try { try {
wxPayOrderMapper.updateByPrimaryKeySelective(record); wxPayOrderMapper.updateByPrimaryKeySelective(record);
@@ -722,6 +768,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey()));
map = BeanUtils.toStringMap(payOrderC); map = BeanUtils.toStringMap(payOrderC);
String response = WxPay.closeOrder(map); String response = WxPay.closeOrder(map);
logger.info("request:" + map.toString() + "\nresponse:" + response);
return response; return response;
} catch (RuntimeException e) { } catch (RuntimeException e) {
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); 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())); payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey()));
map = BeanUtils.toStringMap(payOrderSC); map = BeanUtils.toStringMap(payOrderSC);
String response = WxPay.closeOrder(map); String response = WxPay.closeOrder(map);
logger.info("request:" + map.toString() + "\nresponse:" + response);
return response; return response;
} catch (RuntimeException e) { } catch (RuntimeException e) {
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); 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); logger.info("pay order close, " + record.toString() + ", response: " + response);
Map<String, String> returnMap = WxPayment.xmlToMap(response); Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
String result_code = returnMap.get("result_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 { } 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<String, String> 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 { } 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.setFailReason(errMsg);
record.setUpdateTime(new Date()); record.setUpdateTime(new Date());
try { try {
@@ -788,6 +956,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap);
} }

} catch (RuntimeException e) { } catch (RuntimeException e) {
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage());
} catch (Exception e) { } catch (Exception e) {
@@ -920,7 +1089,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
Date currentDate = new Date(); Date currentDate = new Date();
EnumPayStatus payStatus = EnumPayStatus.getEnum(record.getPayOrderStatus()); EnumPayStatus payStatus = EnumPayStatus.getEnum(record.getPayOrderStatus());
// 判断支付状态 // 判断支付状态
if (payStatus == EnumPayStatus.PAY_WAY_SUCCESS) {
if (payStatus == EnumPayStatus.PAY_STATUS_SUCCESS) {
// 已经是成功状态,只更新transactionId // 已经是成功状态,只更新transactionId
try { try {
record.setUpdateTime(currentDate); record.setUpdateTime(currentDate);
@@ -932,8 +1101,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
return; 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()); "is paid success , orderId : " + record.getOrderId());
return; return;
} }
@@ -949,7 +1118,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
updateOrder.setId(record.getId()); updateOrder.setId(record.getId());
updateOrder.setOrderId(record.getOrderId()); updateOrder.setOrderId(record.getOrderId());
updateOrder.setUpdateTime(currentDate); updateOrder.setUpdateTime(currentDate);
updateOrder.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode());
updateOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());
updateOrder.setTransactionId(transactionId); updateOrder.setTransactionId(transactionId);
try { try {
wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder); wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder);
@@ -988,7 +1157,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void handlePayOrderStatusUpdate(WxPayOrder record) { 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() + logger.error("pay handle, payOrder " + record.getPayOrderNo() +
"is complete, orderId : " + record.getOrderId()); "is complete, orderId : " + record.getOrderId());
return; return;
@@ -1038,13 +1207,13 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND); 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) { if (record.getPayAmount() > 0) {
payOrderQ = new WxPayOrder(); payOrderQ = new WxPayOrder();
payOrderQ.setTenantId(order.getTenantId()); payOrderQ.setTenantId(order.getTenantId());
payOrderQ.setOrderId(record.getOrderId()); payOrderQ.setOrderId(record.getOrderId());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> payOrders = wxPayOrderMapper.select(payOrderQ); List<WxPayOrder> payOrders = wxPayOrderMapper.select(payOrderQ);
for (WxPayOrder payOrder : payOrders) { for (WxPayOrder payOrder : payOrders) {
payOrderClose(appInfo, payOrder); payOrderClose(appInfo, payOrder);
@@ -1052,7 +1221,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
} else { } else {
// 支付订单成功? // 支付订单成功?
if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_WAY_SUCCESS.getCode())) {
if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) {
if (StringUtils.isBlank(updateOrder.getTransactionId())) { if (StringUtils.isBlank(updateOrder.getTransactionId())) {
// 回调已设置成功 // 回调已设置成功
// 继续修改订单状态 // 继续修改订单状态
@@ -1060,7 +1229,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
// 回调异常 // 回调异常
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "transactionId未获取"); 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 { try {
record.setPayOrderNo(String.valueOf(record.getId())); 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 { try {
int _count = wxOrderService.orderSuccess(order); int _count = wxOrderService.orderSuccess(order);
if (_count > 1) { if (_count > 1) {
@@ -1108,7 +1277,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
logger.error(e.getMessage()); logger.error(e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单更新"); 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 { try {
int _count = wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); int _count = wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL);
if (_count > 1) { if (_count > 1) {


+ 1
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java View File

@@ -338,7 +338,7 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService {
payOrderQ.setTenantId(appInfo.getTenantId()); payOrderQ.setTenantId(appInfo.getTenantId());
payOrderQ.setcUserId(wxOrder.getCUserId()); payOrderQ.setcUserId(wxOrder.getCUserId());
payOrderQ.setOrderId(wxOrder.getId()); payOrderQ.setOrderId(wxOrder.getId());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());


WxPayOrder payOrder = null; WxPayOrder payOrder = null;
List<WxPayOrder> list = wxPayOrderMapper.findList(payOrderQ); List<WxPayOrder> list = wxPayOrderMapper.findList(payOrderQ);


Loading…
Cancel
Save