From de8bbf1c24fd449137a522ec4c7e8f04e3dcd748 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Mon, 02 Mar 2026 17:26:15 +0800
Subject: [PATCH] 1
---
src/main/java/com/nq/service/impl/PayServiceImpl.java | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 151 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/nq/service/impl/PayServiceImpl.java b/src/main/java/com/nq/service/impl/PayServiceImpl.java
index 2e965a2..986c2ec 100644
--- a/src/main/java/com/nq/service/impl/PayServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/PayServiceImpl.java
@@ -41,6 +41,9 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import com.nq.vo.pay.PayOutMD5Util;
+import com.nq.vo.pay.PayoutCallbackData;
+import com.nq.vo.pay.PayoutCallbackRequest;
import net.sf.json.JSON;
import net.sf.json.JSONObject;
import okhttp3.*;
@@ -121,7 +124,8 @@
}else if(type == 2){//支付2
return getPaymentZero(tradeAmount, uipReqRul, user,request);
} else if(type == 3){//支付2
- return getPaymentTwo(tradeAmount, uipReqRul, user,request);
+// return getPaymentTwo(tradeAmount, uipReqRul, user,request);
+ return ServerResponse.createByErrorMsg("未开启,请选择其他支付方式",request);
}else if(type == 1){
// return getPaymentThree(tradeAmount, threeUrl, user,request);
return getPaymentOne(tradeAmount, reqUrl,user,request);
@@ -131,7 +135,7 @@
private ServerResponse getPaymentZero(String tradeAmount, String uipReqRul, User user, HttpServletRequest request) throws Exception {
//int
- String url = "https://gateway.kings-pays.com/gateway/payout/init";//正式地址
+ String url = "https://gateway.kings-pays.com/gateway/payment/init";//正式地址
String merchantKey = "qqaC1DH/LeR9iPvm";//商户key 需替换
String aesKey = "ge6vK40fHNZPFJ4p";//商户aesKey 需替换
String aesIv = "6gJoHTEE1i2O3ovE";//商户aesIv 需替换
@@ -154,6 +158,7 @@
Headers headers = new Headers.Builder().add("merchant_key", merchantKey).build();//merchant_key需替换
//请求
String resp = doPost(url, requestObj.toString(), headers);
+ log.info("代收返回:"+resp);
Gson gson = new Gson();
PaymentResponseZero paymentResponse = gson.fromJson(resp, PaymentResponseZero.class);
if(paymentResponse.getCode() != 0 && !paymentResponse.getMsg().equals("success")){
@@ -1423,7 +1428,7 @@
transferResponseService.updateById(transferResponse);
userWithdraw.setWithStatus(2); // 失败
- userWithdraw.setWithMsg("代付失败:" + vo.getMsg());
+ userWithdraw.setWithMsg("Withdrawal failed:" + vo.getMsg());
userWithdraw.setTransTime(new Date());
userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw);
@@ -1482,4 +1487,147 @@
pw.close();
}
}
+
+ public Map<String, Object> payoutCallbackTwo(PayoutCallbackRequest request, HttpServletResponse response) {
+
+
+ String merchantKey = "qqaC1DH/LeR9iPvm";//商户key 需替换
+ String aesKey = "ge6vK40fHNZPFJ4p";//商户aesKey 需替换
+
+ Map<String, Object> result = new HashMap<>();
+ result.put("code", 200); // 固定返回 200
+
+ try {
+ PayoutCallbackData data = request.getData();
+ String signature = request.getSignature_n();
+
+ // 1. 签名验证
+ String signStr = merchantKey
+ + nullToEmpty(data.getMessage())
+ + nullToEmpty(data.getAmount())
+ + nullToEmpty(data.getStatus())
+ + nullToEmpty(data.getMerchantOrderNo())
+ + nullToEmpty(data.getOrderNo())
+ + aesKey;
+
+ String calculatedSign = PayOutMD5Util.md5(signStr).toLowerCase();
+
+ if (!calculatedSign.equals(signature)) {
+ log.error("代付回调签名验证失败,merchantOrderNo={},本地签名={},回调签名={}",
+ data.getMerchantOrderNo(), calculatedSign, signature);
+ // 签名失败不处理业务,但依旧返回 200
+ return result;
+ }
+
+ // 2. 查询本地代付记录
+ TransferResponse transfer = transferResponseService.getOne(
+ new LambdaQueryWrapper<TransferResponse>()
+ .eq(TransferResponse::getMerTransferId, data.getMerchantOrderNo())
+ .last("limit 1")
+ );
+
+ if (transfer == null) {
+ log.error("代付回调未找到对应记录,merchantOrderNo={}", data.getMerchantOrderNo());
+ return result;
+ }
+
+ // 3. 防止重复回调
+ if (transfer.getCallbackState() != 0) {
+ log.info("代付回调已处理过,merchantOrderNo={},状态={}", data.getMerchantOrderNo(), transfer.getCallbackState());
+ return result;
+ }
+
+ // 4. 查询提现记录
+ UserWithdraw withdraw = userWithdrawMapper.selectByPrimaryKey(transfer.getWithId());
+ if (withdraw == null) {
+ log.error("代付回调未找到提现记录,withId={}", transfer.getWithId());
+ return result;
+ }
+
+ // 5. 根据状态处理
+ String status = data.getStatus();
+ if ("SUCCESS".equals(status)) {
+ handleSuccess(transfer, withdraw, data, signature);
+ } else if ("FAILURE".equals(status)) {
+ handleFailure(transfer, withdraw, data, signature);
+ } else {
+ log.info("代付回调未知状态:{},暂不处理,merchantOrderNo={}", status, data.getMerchantOrderNo());
+ }
+
+ } catch (Exception e) {
+ log.error("代付回调处理异常", e);
+ }
+
+ return result;
+ }
+
+ /**
+ * 处理成功回调
+ */
+ private void handleSuccess(TransferResponse transfer, UserWithdraw withdraw,
+ PayoutCallbackData data, String signature) {
+ // 更新代付记录
+ transfer.setTradeResult(1); // 成功
+ transfer.setCallbackState(1); // 已处理成功
+ transfer.setRespCode("SUCCESS");
+ transfer.setSignType("MD5");
+ transfer.setSign(signature);
+ transfer.setUpdatedAt(new Date());
+ transferResponseService.updateById(transfer);
+
+ // 更新提现记录
+ withdraw.setWithStatus(1); // 成功
+ withdraw.setWithMsg("代付成功");
+ withdraw.setTransTime(new Date());
+ userWithdrawMapper.updateByPrimaryKeySelective(withdraw);
+
+ // 扣除冻结资金(提现时已冻结,此处只需将冻结减少,可用余额不变)
+ UserAssets assets = iUserAssetsServices.assetsByTypeAndUserId("IN", withdraw.getUserId());
+ if (assets != null) {
+ assets.setFreezeMoney(assets.getFreezeMoney().subtract(withdraw.getWithAmt()));
+ userAssetsMapper.updateById(assets);
+ }
+
+ log.info("代付成功处理完成,商户订单号={},平台订单号={}", data.getMerchantOrderNo(), data.getOrderNo());
+ }
+
+ /**
+ * 处理失败回调
+ */
+ private void handleFailure(TransferResponse transfer, UserWithdraw withdraw,
+ PayoutCallbackData data, String signature) {
+ // 更新代付记录
+ transfer.setTradeResult(2); // 失败
+ transfer.setCallbackState(2); // 已处理失败
+ transfer.setRespCode("FAIL");
+ transfer.setErrorMsg(data.getMessage());
+ transfer.setSignType("MD5");
+ transfer.setSign(signature);
+ transfer.setUpdatedAt(new Date());
+ transferResponseService.updateById(transfer);
+
+ // 更新提现记录
+ withdraw.setWithStatus(2); // 失败
+ withdraw.setWithMsg("Withdrawal failed:" + data.getMessage());
+ withdraw.setTransTime(new Date());
+ userWithdrawMapper.updateByPrimaryKeySelective(withdraw);
+
+ // 返还资金:解冻并增加可用余额
+ UserAssets assets = iUserAssetsServices.assetsByTypeAndUserId("IN", withdraw.getUserId());
+ if (assets != null) {
+ assets.setAvailableBalance(assets.getAvailableBalance().add(withdraw.getWithAmt()));
+ assets.setFreezeMoney(assets.getFreezeMoney().subtract(withdraw.getWithAmt()));
+ userAssetsMapper.updateById(assets);
+ }
+
+ log.info("代付失败处理完成,商户订单号={},平台订单号={},失败原因={}",
+ data.getMerchantOrderNo(), data.getOrderNo(), data.getMessage());
+ }
+
+ /**
+ * 将 null 转为空字符串,防止拼接 NPE
+ */
+ private String nullToEmpty(String str) {
+ return str == null ? "" : str;
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3