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

[c端支付整理][支付]

release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
b8cbe62e85
6 измененных файлов: 74 добавлений и 81 удалений
  1. +8
    -1
      mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java
  2. +4
    -1
      mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java
  3. +1
    -1
      mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java
  4. +4
    -2
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
  5. +54
    -76
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java
  6. +3
    -0
      mallinkService/src/main/resources/mapper/WxOrderMapper.xml

+ 8
- 1
mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java Просмотреть файл

@@ -107,6 +107,7 @@ public class WxPayOrderController extends BaseController {
payOrder.setFailReason(reasonStr);
try {
if(status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) && !payOrderIdStr.equals("0")) {
// 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态
// 有价券不走update, callback更新
payOrder = wxPayOrderService.getById(payOrderId);
if(payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) {
@@ -115,7 +116,13 @@ public class WxPayOrderController extends BaseController {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付未状态,请等待!!");
}
} else {
wxPayOrderService.handlePayOrderStatusUpdate(payOrder);
// 1. 免费券,status = 1,成功
// 2. 有价券,status = 2,取消支付
if(status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) {
wxPayOrderService.handlePayOrderStatusUpdate(payOrder, 1);
} else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) {
wxPayOrderService.handlePayOrderStatusUpdate(payOrder, 2);
}
}
return new ResultData(Result.SUCCESS, "支付状态更新成功");
} catch (MallinkException e) {


+ 4
- 1
mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java Просмотреть файл

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

import com.iformall.domain.po.WxOrder;
import com.iformall.enums.EnumOrderStatus;
import com.iformall.enums.EnumOrderType;
import com.iformall.mapper.WxOrderMapper;
import com.iformall.service.WxOrderService;
import org.slf4j.Logger;
@@ -37,7 +38,8 @@ public class OrderExpiringSchedule {
Map dateMap = new HashMap();
Date curDate = new Date();

//dateMap.put("startDate",new Date(curDate.getTime() - 2*TIME_OUT_VALUE));
// 只检查券相关订单
dateMap.put("type", EnumOrderType.COUPON.getCode());
dateMap.put("endDate", new Date(curDate.getTime() - TIME_OUT_VALUE ));
List<WxOrder> wxOrderList = wxOrderMapper.findListOfUnpaidOrderByDate(dateMap);

@@ -49,6 +51,7 @@ public class OrderExpiringSchedule {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void orderExpired(WxOrder order) {
order.setUpdateDate(new Date());
order.setType(EnumOrderType.COUPON.getCode());
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode());
wxOrderMapper.updateByPrimaryKeySelective(order);



+ 1
- 1
mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java Просмотреть файл

@@ -79,7 +79,7 @@ public interface WxPayOrderService {
*
* @param record
*/
void handlePayOrderStatusUpdate(WxPayOrder record);
void handlePayOrderStatusUpdate(WxPayOrder record, int status);

/**
* 页面回调


+ 4
- 2
mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java Просмотреть файл

@@ -771,14 +771,16 @@ public class WxOrderServiceImpl implements WxOrderService {
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> payOrders = wxPayOrderMapper.select(payOrderQ);

// 3. wx pay order close
for(WxPayOrder payOrder: payOrders) {
// 3. wx pay order close
try {
ResultData payclose = wxPayOrderService.payOrderClose(appInfo, payOrder);
wxPayOrderService.payOrderClose(appInfo, payOrder);
} catch (Exception e) {
logger.error("微信关单失败:" + e.getMessage());
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR);
}
}

return new ResultData();
}



+ 54
- 76
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java Просмотреть файл

@@ -139,8 +139,14 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> list = wxPayOrderMapper.findList(record);
String payOrderNo = "";
if (list.size() <= 0) {
// 3. 创建支付订单
if (list.size() > 0) {
// 3.0 已有支付订单,关闭之前的
payOrderClose(appInfo, list.get(0));
}


{
// 3.1 创建支付订单
Long id = idworker.nextId();
payOrderNo = String.valueOf(id);
record.setId(id);
@@ -168,10 +174,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
logger.error("pay order insert error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}
} else {
record = list.get(0);
record.setShare(isShare.getCode());
payOrderNo = String.valueOf(record.getId());
}


@@ -837,8 +839,13 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
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);
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateByPrimaryKeySelective(record);
} catch (Exception e) {
logger.error("pay order 关单:{} 成功", record.getId());
}
return new ResultData(Result.SUCCESS, "支付订单关闭成功", returnMap);
} else {
String errMsg = "";
JSONObject errObj = errorMapClose.getJSONObject(result_code);
@@ -1319,7 +1326,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {

@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void handlePayOrderStatusUpdate(WxPayOrder record) {
public void handlePayOrderStatusUpdate(WxPayOrder record, int status) {
// 判断支付状态
if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_WAIT.getCode()) {
logger.error("pay handle, payOrder " + record.getPayOrderNo() +
@@ -1348,80 +1355,51 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {

Date currentDate = new Date();
if (record.getId() > 0) {
// 有价券
// 1. get appinfo
WxAppinfo appInfo = getWxAppinfo(order.getType(), order.getTenantId());

WxPayOrder updateOrder = null;

// 检查支付订单状态
WxPayOrder payOrderQ = new WxPayOrder();
payOrderQ.setId(record.getId());
payOrderQ.setTenantId(order.getTenantId());
payOrderQ.setOrderId(record.getOrderId());
try {
updateOrder = wxPayOrderMapper.selectOne(payOrderQ);
} catch (Exception e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND);
}

if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_FAIL.getCode()) {
// 支付订单失败,取消此订单
if (record.getPayAmount() > 0) {
payOrderQ = new WxPayOrder();
payOrderQ.setTenantId(order.getTenantId());
payOrderQ.setOrderId(record.getOrderId());
payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode());
List<WxPayOrder> payOrders = wxPayOrderMapper.select(payOrderQ);
for (WxPayOrder payOrder : payOrders) {
payOrderClose(appInfo, payOrder);
}
}
} else {
// 支付订单成功?
if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) {
if (StringUtils.isNotBlank(updateOrder.getTransactionId())) {
// 回调已设置成功
// 继续修改订单状态
} else {
// 回调异常
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "transactionId未获取");
}
} else if (updateOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_WAIT.getCode())) {
// 回调未返回,主动检查支付订单状态
try {
record.setPayOrderNo(String.valueOf(record.getId()));
String response = wechatPayOrderQuery(appInfo, record);
if (2 == status) {
// 前端支付取消,
// 回调未返回,主动检查支付订单状态
try {
record.setPayOrderNo(String.valueOf(record.getId()));
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 if ("USERPAYING".equals(trade_state)) {
// 继续检查状态
} else {
// 支付订单未成功,返回异常
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "支付订单未成功");
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 if ("USERPAYING".equals(trade_state)) {
// 继续检查状态
} else {
// 支付订单未成功,返回异常
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_FAIL.getCode());
try {
wxPayOrderMapper.updateByPrimaryKeySelective(record);
} catch (Exception e) {
logger.error("支付订单失败状态更新异常: " + e.getMessage());
}
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());
}
} 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());
}
}
}


+ 3
- 0
mallinkService/src/main/resources/mapper/WxOrderMapper.xml Просмотреть файл

@@ -129,6 +129,9 @@
<include refid="allColumns"/>
from wx_order
where order_status = '0'
<if test="type != null">
AND type = #{type,jdbcType=TINYINT}
</if>
<if test="startDate != null">
AND create_date &gt; #{startDate,jdbcType=TIMESTAMP}
</if>


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