支付对接

This commit is contained in:
周现广
2026-04-08 19:01:16 +08:00
parent 2cdda23545
commit cce99a9ec6
47 changed files with 3351 additions and 4 deletions
@@ -0,0 +1,87 @@
package io.v.nutz.pay.notify;
import cn.wizzer.framework.base.Result;
import io.v.nutz.pay.annotations.Api;
import io.v.nutz.pay.annotations.ApiOperation;
import io.v.nutz.pay.cache.ChinaBankOrderPayNotifyCacheService;
import io.v.nutz.pay.cache.ChinaBankOrderWaitPayCacheService;
import io.v.nutz.pay.notify.enums.PayNotifyOrderStatusEnum;
import io.v.nutz.pay.notify.enums.PayNotifyReturnActFlagEnum;
import io.v.nutz.pay.record.service.IMemberPayRecordService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 中国银行支付通知 controller
*/
@Slf4j
@IocBean
@Api("中国银行支付通知")
@At("/notify/china/bank")
public class ChinaBankPayResultNotify {
@Inject
private IMemberPayRecordService memberPayRecordService;
@Inject
private ChinaBankOrderWaitPayCacheService chinaBankOrderWaitPayCacheService;
@Inject
private ChinaBankOrderPayNotifyCacheService chinaBankOrderPayNotifyCacheService;
@At("/pay")
@Ok("json")
@ApiOperation("中国银行支付通知")
public Result payResultNotify(HttpServletRequest req, HttpServletResponse resp) {
// 商户订单号
String orderNo = req.getParameter("orderNo");
// 银行订单流水号
String orderSeq = req.getParameter("orderSeq");
// 银行订单状态 0:未处理 1:支付 2:撤销 3:退货 4:未明 5:失败 6:下单
String orderStatus = req.getParameter("orderStatus");
// 银行交易流水号
String bankTranSeq = req.getParameter("bankTranSeq");
// 中行签名数据
String signData = req.getParameter("signData");
// 支付金额
String payAmount = req.getParameter("payAmount");
// 操作类型 1:支付结果通知 2:电话订单结果通知 3:退款结果通知 4:订单查询结果
String returnActFlag = req.getParameter("returnActFlag");
log.info("收到中行银行支付结果通知: orderNo->{}, orderSeq->{}, orderStatus->{}, bankTranSeq->{}, payAmount->{}, signData->{}", orderNo, orderSeq, orderStatus, bankTranSeq, payAmount, signData);
log.info("收到中行银行支付结果通知: returnActFlag->{}", returnActFlag);
try{
// 支付结果通知
if(PayNotifyReturnActFlagEnum.PAY_RESULT_NOTIFY.getCode().equals(returnActFlag)) {
// 设置30秒内同一个商户订单 不可重复接收到通知
if(chinaBankOrderPayNotifyCacheService.exists(orderNo)) {
log.error("商户订单号重复支付结果通知:orderNo->{}", orderNo);
return Result.error("商户订单号重复通知");
}
chinaBankOrderPayNotifyCacheService.setex(orderNo, 30, orderNo);
// 支付成功
if (PayNotifyOrderStatusEnum.PAY.getCode().equals(orderStatus)) {
memberPayRecordService.paySuccess(orderNo, Double.valueOf(payAmount));
// 支付失败
} else if (PayNotifyOrderStatusEnum.FAIL.getCode().equals(orderStatus)) {
memberPayRecordService.payFail(orderNo, "用户支付失败");
}
chinaBankOrderWaitPayCacheService.delItem(orderNo);
}
}catch (Exception e){
e.printStackTrace();
return Result.error();
}
return Result.success();
}
}
@@ -0,0 +1,43 @@
package io.v.nutz.pay.notify.enums;
import io.v.nutz.pay.enums.PayChannelEnum;
public enum PayNotifyOrderStatusEnum {
// 订单状态 0:未处理 1:支付 2:撤销 3:退货 4:未明 5:失败 6:下单
NOT_HANDLE("0", "未处理"),
PAY("1", "支付"),
REVOKE("2", "撤销"),
RETURN("3", "退货"),
UNKNOWN("4", "未明"),
FAIL("5", "失败"),
ORDER("6", "下单");
private String code;
public String getCode() {
return code;
}
private String name;
public String getName() {
return name;
}
public static PayNotifyOrderStatusEnum getByCode(String code) {
if(code == null) {
return null;
} else {
PayNotifyOrderStatusEnum[] values = PayNotifyOrderStatusEnum.values();
for(PayNotifyOrderStatusEnum value : values) {
if(value.getCode().equals(code)) {
return value;
}
}
}
return null;
}
PayNotifyOrderStatusEnum(String code, String name) {
this.code = code;
this.name = name;
}
}
@@ -0,0 +1,39 @@
package io.v.nutz.pay.notify.enums;
public enum PayNotifyReturnActFlagEnum {
// 操作类型 1:支付结果通知 2:电话订单结果通知 3:退款结果通知 4:订单查询结果
PAY_RESULT_NOTIFY("1", "支付结果通知"),
PAY_PHONE_NOTIFY("2", "电话订单结果通知"),
PAY_REFUND_NOTIFY("3", "退款结果通知"),
ORDER_QUERY_NOTIFY("4", "订单查询结果");
private String code;
public String getCode() {
return code;
}
private String name;
public String getName() {
return name;
}
public static PayNotifyReturnActFlagEnum getByCode(String code) {
if(code == null) {
return null;
} else {
PayNotifyReturnActFlagEnum[] values = PayNotifyReturnActFlagEnum.values();
for(PayNotifyReturnActFlagEnum value : values) {
if(value.getCode().equals(code)) {
return value;
}
}
}
return null;
}
PayNotifyReturnActFlagEnum(String code, String name) {
this.code = code;
this.name = name;
}
}