From e7eb029ec5bc6d1a2a088f3e9151316757e537d7 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Mon, 10 Feb 2025 11:37:39 +0800
Subject: [PATCH] feat(pay): 添加 FIUU充值功能并优化支付流程 - 新增 FIUU 充值接口和相关请求模型 - 更新 FIUU 支付流程,支持订单和充值操作 - 优化 FIUU 回调处理,增加对充值订单的支持 - 调整订单状态更新逻辑,确保支付成功后正确更新
---
src/main/java/cc/mrbird/febs/pay/controller/FiuuReturnController.java | 16 +++++++
src/main/java/cc/mrbird/febs/pay/controller/FIUUController.java | 85 +++++++++++++++++++++++++++++++++++++++++-
src/main/java/cc/mrbird/febs/pay/model/FIUUInitChargeRequest.java | 16 ++++++++
3 files changed, 113 insertions(+), 4 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/pay/controller/FIUUController.java b/src/main/java/cc/mrbird/febs/pay/controller/FIUUController.java
index cfc649c..9c49d0f 100644
--- a/src/main/java/cc/mrbird/febs/pay/controller/FIUUController.java
+++ b/src/main/java/cc/mrbird/febs/pay/controller/FIUUController.java
@@ -1,17 +1,26 @@
package cc.mrbird.febs.pay.controller;
import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
+import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.OrderDeliveryStateEnum;
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
+import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.common.utils.ValidateEntityUtils;
import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.entity.MallMoneyFlow;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.mall.entity.MallOrderItem;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
+import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
+import cc.mrbird.febs.pay.model.FIUUInitChargeRequest;
import cc.mrbird.febs.pay.model.FIUUInitPayRequest;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -24,6 +33,7 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -38,15 +48,21 @@
private MallOrderInfoMapper mallOrderInfoMapper;
@Resource
+ private IMallMoneyFlowService mallMoneyFlowService;
+
+ @Resource
private MallMemberMapper mallMemberMapper;
@ApiOperation(value = "初始化FIUU支付信息", notes = "初始化FIUU支付信息")
@PostMapping("/initPayment")
public FebsResponse initPayment(@RequestBody FIUUInitPayRequest orderRequest) {
+
+ Long memberId = LoginUserUtil.getLoginUser().getId();
+
Long orderId = orderRequest.getOrderId();
MallOrderInfo mallOrderInfo = ValidateEntityUtils.ensureColumnReturnEntity(orderId, MallOrderInfo::getId, mallOrderInfoMapper::selectOne, "订单不存在");
ValidateEntityUtils.ensureNotEqual("1", mallOrderInfo.getPayResult(), "订单已支付");
- MallMember mallMember = ValidateEntityUtils.ensureColumnReturnEntity(mallOrderInfo.getMemberId(), MallMember::getId, mallMemberMapper::selectOne, "用户不存在");
+ MallMember mallMember = ValidateEntityUtils.ensureColumnReturnEntity(memberId, MallMember::getId, mallMemberMapper::selectOne, "用户不存在");
ValidateEntityUtils.ensureNotEqual(mallMember.getRealName(), null, "请完善个人信息");
ValidateEntityUtils.ensureNotEqual(mallMember.getEmail(), null, "请完善个人信息");
ValidateEntityUtils.ensureNotEqual(mallMember.getPhone(), null, "请完善个人信息");
@@ -70,6 +86,60 @@
params.put("merchant_id", merchantId);
params.put("orderid", String.valueOf(orderId));
params.put("amount", amount);
+ params.put("bill_name", mallMember.getRealName());
+ params.put("bill_email", mallMember.getEmail());
+ params.put("bill_mobile", mallMember.getPhone());
+ params.put("bill_desc", productNames);
+ params.put("currency", "MYR"); // 默认 MYR
+ params.put("vcode", vcode);
+ params.put("returnurl", returnUrl);
+
+ return new FebsResponse().success().data(params);
+ } catch (Exception e) {
+ return new FebsResponse().fail().message("支付参数校验失败");
+ }
+ }
+
+ @ApiOperation(value = "初始化FIUU充值信息", notes = "初始化FIUU充值信息")
+ @PostMapping("/initCharge")
+ public FebsResponse initCharge(@RequestBody FIUUInitChargeRequest orderRequest) {
+ Long memberId = LoginUserUtil.getLoginUser().getId();
+ MallMember mallMember = ValidateEntityUtils.ensureColumnReturnEntity(memberId, MallMember::getId, mallMemberMapper::selectOne, "用户不存在");
+ ValidateEntityUtils.ensureNotEqual(mallMember.getRealName(), null, "请完善个人信息");
+ ValidateEntityUtils.ensureNotEqual(mallMember.getEmail(), null, "请完善个人信息");
+ ValidateEntityUtils.ensureNotEqual(mallMember.getPhone(), null, "请完善个人信息");
+ BigDecimal amount = orderRequest.getAmount();
+ if(BigDecimal.ZERO.compareTo(amount) >= 0){
+ throw new FebsException("金额异常");
+ }
+ String amountStr = orderRequest.getAmount().toString();
+ String productNames = "CHARGE INFO";
+ String rechargeNo = "CZ_"+MallUtils.getOrderNum();
+ mallMoneyFlowService.addMoneyFlow(
+ memberId,
+ amount,
+ MoneyFlowTypeEnum.RECHARGE.getValue(),
+ rechargeNo,
+ FlowTypeEnum.BALANCE.getValue(),
+ "FIUU充值",1);
+ try {
+ String merchantId = "e2umart01";
+ String verifyKey = "4e3a4ed58e62ddbfacf41f6d5ec56bf2";
+ String returnUrl = "https://api.mye2u.com/api/fuPayReturn/payment/callback"; // 支付结果回调地址
+
+ // 生成 vcode(MD5(amount + merchantId + orderId + verifyKey))
+ String vcode = DigestUtils.md5Hex(
+ amountStr +
+ merchantId +
+ rechargeNo +
+ verifyKey
+ );
+
+ // 返回支付参数
+ Map<String, String> params = new HashMap<>();
+ params.put("merchant_id", merchantId);
+ params.put("orderid", rechargeNo);
+ params.put("amount", amountStr);
params.put("bill_name", mallMember.getRealName());
params.put("bill_email", mallMember.getEmail());
params.put("bill_mobile", mallMember.getPhone());
@@ -111,8 +181,17 @@
log.info("notify status: {}", status);
// 4. 根据状态码更新订单
if ("00".equals(status)) {
- // 支付成功,更新订单状态
- updateOrderStatus(orderId, status, amount, paydate, tranID);
+ MallMoneyFlow mallMoneyFlow = mallMoneyFlowService.getBaseMapper().selectOne(new LambdaQueryWrapper<MallMoneyFlow>().eq(MallMoneyFlow::getOrderNo, orderId));
+ if (mallMoneyFlow != null) {
+ // 更新订单状态为已支付
+ mallMoneyFlow.setStatus(2);
+ mallMoneyFlowService.getBaseMapper().updateById(mallMoneyFlow);
+ }
+ MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(Long.parseLong(orderId));
+ if(mallOrderInfo != null){
+ // 支付成功,更新订单状态
+ updateOrderStatus(orderId, status, amount, paydate, tranID);
+ }
// 可选:记录交易ID防止重复处理
log.info("Payment succeeded for order: {}", orderId);
} else {
diff --git a/src/main/java/cc/mrbird/febs/pay/controller/FiuuReturnController.java b/src/main/java/cc/mrbird/febs/pay/controller/FiuuReturnController.java
index 7bce5dd..c14b75b 100644
--- a/src/main/java/cc/mrbird/febs/pay/controller/FiuuReturnController.java
+++ b/src/main/java/cc/mrbird/febs/pay/controller/FiuuReturnController.java
@@ -4,11 +4,14 @@
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.ValidateEntityUtils;
+import cc.mrbird.febs.mall.entity.MallMoneyFlow;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
+import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper;
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
@@ -32,6 +35,8 @@
private static final String SECRET_KEY = "59c709fc18978a6a83b87f05d37cecbf";
@Resource
private MallOrderInfoMapper mallOrderInfoMapper;
+ @Resource
+ private MallMoneyFlowMapper mallMoneyFlowMapper;
@PostMapping("/payment/callback")
public String handlePaymentCallback(
@@ -84,8 +89,17 @@
model.addAttribute("status", status);
model.addAttribute("currency", currency);
model.addAttribute("payDate", payDate);
- updateOrderStatus(orderId, status, amount, payDate, tranId);
+ MallMoneyFlow mallMoneyFlow = mallMoneyFlowMapper.selectOne(new LambdaQueryWrapper<MallMoneyFlow>().eq(MallMoneyFlow::getOrderNo, orderId));
+ if (mallMoneyFlow != null) {
+ // 更新订单状态为已支付
+ mallMoneyFlow.setStatus(2);
+ mallMoneyFlowMapper.updateById(mallMoneyFlow);
+ }
+ MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(Long.parseLong(orderId));
+ if(mallOrderInfo != null){
+ updateOrderStatus(orderId, status, amount, payDate, tranId);
+ }
// 跳转到支付成功页面
return "payment-success";
}
diff --git a/src/main/java/cc/mrbird/febs/pay/model/FIUUInitChargeRequest.java b/src/main/java/cc/mrbird/febs/pay/model/FIUUInitChargeRequest.java
new file mode 100644
index 0000000..2c79e5f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/model/FIUUInitChargeRequest.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.pay.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "FIUUInitChargeRequest", description = "初始化支付信息")
+public class FIUUInitChargeRequest {
+ @NotNull(message = "参数不能为空")
+ @ApiModelProperty(value = "充值金额")
+ private BigDecimal amount;
+}
--
Gitblit v1.9.1