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.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<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.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, "支付未状态,请等待!!");


+ 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_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, "退款支付订单不存在"),


+ 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.
*/
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) {


+ 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);

/**
* 微信支付刷卡支付撤销订单
* @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.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<WxPayOrder> payList = wxPayOrderMapper.select(payOrderQ);
if (payList.size() > 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
WxPayOrder payOrderQ = new WxPayOrder();
payOrderQ.setTenantId(order.getTenantId());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> payOrders = wxPayOrderMapper.select(payOrderQ);

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 是否有支付订单
Date currentDate = new Date();
record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode());
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> 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<WxPayOrder> 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<String, String> 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<String, String> 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<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 {
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<WxPayOrder> 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) {


+ 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.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<WxPayOrder> list = wxPayOrderMapper.findList(payOrderQ);


Loading…
Cancel
Save