Просмотр исходного кода

[支付异常修改][修改]:api不能设置订单支付成功,支付成功只能通过回调和微信订单查询结果设置

release_toaliyun_real
Stormeye.Wu 7 лет назад
Родитель
Сommit
ee1f13ec21
3 измененных файлов: 185 добавлений и 169 удалений
  1. +4
    -0
      mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java
  2. +171
    -167
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java
  3. +10
    -2
      mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java

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


+ 171
- 167
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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<WxAppinfo> 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<WxAppinfo> 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<WxPayOrder> 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<String, String> 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);
}
}



+ 10
- 2
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<String, String> 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);
}
}
}


Загрузка…
Отмена
Сохранить