From 9b44c17d57474254ca8f7ef9eecc2fe1be1ea695 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Mon, 08 Sep 2025 18:03:53 +0800
Subject: [PATCH] 1
---
src/main/java/com/nq/service/impl/PayServiceImpl.java | 267 ++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 241 insertions(+), 26 deletions(-)
diff --git a/src/main/java/com/nq/service/impl/PayServiceImpl.java b/src/main/java/com/nq/service/impl/PayServiceImpl.java
index 7b1c67a..e96f0ec 100644
--- a/src/main/java/com/nq/service/impl/PayServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/PayServiceImpl.java
@@ -8,6 +8,8 @@
import com.nq.common.CmcPayConfig;
import com.nq.common.ServerResponse;
import com.nq.dao.*;
+import com.nq.enums.EStockType;
+import com.nq.enums.EUserAssets;
import com.nq.pay.PayUtil;
import com.nq.pojo.*;
import com.nq.service.*;
@@ -24,6 +26,8 @@
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+import java.security.Key;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
@@ -31,10 +35,15 @@
import java.time.format.DateTimeFormatter;
import java.util.*;
import javax.annotation.Resource;
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import net.sf.json.JSON;
import net.sf.json.JSONObject;
+import okhttp3.*;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.collections.map.LinkedMap;
import org.apache.commons.lang3.ObjectUtils;
@@ -83,7 +92,13 @@
@Autowired
PaymentRechargeService paymentRechargeService;
- public ServerResponse thirdPartyRecharge(HttpServletRequest request, String tradeAmount, Integer type) throws UnsupportedEncodingException, JsonProcessingException, NoSuchAlgorithmException {
+ @Autowired
+ UserAssetsServices userAssetsServices;
+
+ private static final String KEY_ALGORITHM = "AES";
+ private static final String AES128CBC = "AES/CBC/PKCS5Padding";
+
+ public ServerResponse thirdPartyRecharge(HttpServletRequest request, String tradeAmount, Integer type) throws Exception {
// 支付1
String reqUrl = "https://api.watchglb.com/pay/web";
// 支付2
@@ -96,15 +111,106 @@
return ServerResponse.createByErrorCodeMsg(401,googleTranslateUtil.translate("请登录",lang ));
}
- if(type == 1){//支付1
+ if(type == 2){//支付1
return getPaymentOne(tradeAmount, reqUrl,user,request);
- }else if(type == 2){//支付2
+ }else if(type == 1){//支付2
return getPaymentTwo(tradeAmount, uipReqRul, user,request);
+ }else if(type == 0){
+ return getPaymentZero(tradeAmount, uipReqRul, user,request);
}
return ServerResponse.createByErrorMsg("获取支付方式失败",request);
}
+ private ServerResponse getPaymentZero(String tradeAmount, String uipReqRul, User user, HttpServletRequest request) throws Exception {
+ //int
+ String url = "https://gateway.king-pays.com/gateway/payment/init";//正式地址
+ String merchantKey = "qqaC1DH/LeR9iPvm";//商户key 需替换
+ String aesKey = "ge6vK40fHNZPFJ4p";//商户aesKey 需替换
+ String aesIv = "6gJoHTEE1i2O3ovE";//商户aesIv 需替换
+ //请求参数
+ JSONObject dataObj = new JSONObject();
+ // 代收请求
+ dataObj.put("amount",tradeAmount);//需替换
+ dataObj.put("customerName",user.getPhone());//需替换
+ dataObj.put("customerEmail","123456@qq.com");//需替换
+ dataObj.put("customerPhone",user.getPhone());//需替换
+ dataObj.put("merchantOrderNo",generatePayOrderId());//自定义订单号
+ dataObj.put("notifyUrl", "https://api.durocaspitall.com/user/rechargeCallbackZero.do");//回调通知地址
+ JSONObject requestObj = new JSONObject();
+ // 加密数据
+ byte[] encryptedData = encrypt(dataObj.toString(), aesKey, aesIv);
+ String base64EncodedData = Base64.getEncoder().encodeToString(encryptedData);
+ requestObj.put("data", base64EncodedData);
+ //消息头
+ Headers headers = new Headers.Builder().add("merchant_key", merchantKey).build();//merchant_key需替换
+ //请求
+ String resp = doPost(url, requestObj.toString(), headers);
+ Gson gson = new Gson();
+ PaymentResponseZero paymentResponse = gson.fromJson(resp, PaymentResponseZero.class);
+ if(paymentResponse.getCode() != 0 && !paymentResponse.getMsg().equals("success")){
+ log.error("默认充值下单失败:"+resp);
+ return ServerResponse.createByErrorMsg("获取默认充值链接失败",request);
+ }
+ PaymentRecharge paymentRecharge = new PaymentRecharge();
+ paymentRecharge.setUserId(user.getId());
+ paymentRecharge.setOrderNo(dataObj.getString("merchantOrderNo"));
+ paymentRecharge.setMchOrderNo(paymentResponse.getData().getOrderNo());
+ paymentRecharge.setAmount(new BigDecimal(tradeAmount));
+ paymentRecharge.setStatus(1);
+ paymentRecharge.setPaymentTime(new Date());
+ paymentRecharge.setCreatedAt(new Date());
+ paymentRecharge.setNotifyUrl(getOrderTime());
+ paymentRecharge.setPayInfo(paymentResponse.toString());
+ paymentRechargeService.save(paymentRecharge);
+
+ UserRecharge userRecharge = new UserRecharge();
+ userRecharge.setUserId(user.getId());
+ userRecharge.setNickName(user.getRealName());
+ userRecharge.setAgentId(user.getAgentId());
+ userRecharge.setOrderSn(dataObj.getString("merchantOrderNo"));
+ userRecharge.setPayChannel("Payment 1");
+ userRecharge.setPayAmt(new BigDecimal(tradeAmount));
+ userRecharge.setAddTime(new Date());
+ userRecharge.setPayTime(new Date());
+ userRecharge.setOrderStatus(Integer.valueOf(0));
+ userRecharge.setPayId(1);
+ userRechargeMapper.insert(userRecharge);
+ return ServerResponse.createBySuccess(paymentResponse.getData().getPaymentLinkUrl());
+ }
+
+ public static String doPost(String url, String data, Headers headers) throws IOException {
+ OkHttpClient customClient = new OkHttpClient();
+ Request request = new Request.Builder()
+ .url(url)
+ .headers(headers)
+ .post(RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), data))
+ .build();
+ Response response = customClient.newCall(request).execute();
+ String resp = response.body().string();
+ return resp;
+ }
+
+
+ public static byte[] encrypt(String data, String key, String iv) throws Exception {
+ return encrypt(data.getBytes(StandardCharsets.UTF_8), key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8));
+ }
+
+ /**
+ * 加密
+ *
+ * @param data 待加密数据
+ * @param key 密钥
+ * @return byte[] 加密数据
+ * @throws Exception
+ */
+ public static byte[] encrypt(byte[] data, byte[] key, byte[] iv) throws Exception {
+ Key k = new SecretKeySpec(key, KEY_ALGORITHM);
+ Cipher cipher = Cipher.getInstance(AES128CBC);
+ final IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+ cipher.init(Cipher.ENCRYPT_MODE, k, ivParameterSpec);
+ return cipher.doFinal(data);
+ }
//支付2
private ServerResponse getPaymentTwo(String tradeAmount, String uipReqRul, User user, HttpServletRequest request) throws UnsupportedEncodingException, NoSuchAlgorithmException, JsonProcessingException {
// 示例参数
@@ -150,6 +256,19 @@
paymentRecharge.setNotifyUrl(getOrderTime());
paymentRecharge.setPayInfo(payResponse.toString());
paymentRechargeService.save(paymentRecharge);
+
+ UserRecharge userRecharge = new UserRecharge();
+ userRecharge.setUserId(user.getId());
+ userRecharge.setNickName(user.getRealName());
+ userRecharge.setAgentId(user.getAgentId());
+ userRecharge.setOrderSn(params.get("out_trade_no"));
+ userRecharge.setPayChannel("Payment 1");
+ userRecharge.setPayAmt(amount);
+ userRecharge.setAddTime(new Date());
+ userRecharge.setPayTime(new Date());
+ userRecharge.setOrderStatus(Integer.valueOf(0));
+ userRecharge.setPayId(1);
+ userRechargeMapper.insert(userRecharge);
return ServerResponse.createBySuccess(payResponse.getData().getUrl());
}
@@ -910,41 +1029,57 @@
PrintWriter pw = response.getWriter();
PaymentRecharge paymentRecharge = paymentRechargeService.getOne(new LambdaQueryWrapper<>(PaymentRecharge.class)
- .eq(PaymentRecharge::getMchOrderNo, vo.getOut_trade_no())
+ .eq(PaymentRecharge::getOrderNo,vo.getOut_trade_no())
.eq(PaymentRecharge::getStatus,1)
.last("limit 1")
);
-
- if(!vo.getStatus().equals("payin_ing")){
- log.error("充值2回调交易中:"+vo.toString());
- return;
- }
-
- if(!vo.getStatus().equals("payin_fail")){
- paymentRecharge.setStatus(2);
- paymentRecharge.setAmount(new BigDecimal(vo.getAccount_fee()));
- paymentRecharge.setPayInfo(vo.toString());
- paymentRechargeService.updateById(paymentRecharge);
- log.error("充值回调失败:"+vo.toString());
- return;
- }
-
if(ObjectUtils.isEmpty(paymentRecharge)){
log.info("未找到充值订单");
pw.print("error 未找到充值订单");
return;
}
+ UserRecharge userRecharge = userRechargeMapper.selectOne(new LambdaQueryWrapper<>(UserRecharge.class)
+ .eq(UserRecharge::getOrderSn, paymentRecharge.getOrderNo())
+ .eq(UserRecharge::getOrderStatus, 0).last(" limit 1"));
+ if(ObjectUtils.isEmpty(userRecharge)){
+ log.info("未找到充值记录订单");
+ pw.print("error 未找到充值订单");
+ return;
+ }
+
+ if(vo.getStatus().equals("payin_ing")){
+ log.error("充值2回调交易中:"+vo.toString());
+ return;
+ }else if(vo.getStatus().equals("payin_fail")){
+ paymentRecharge.setStatus(2);
+ paymentRecharge.setAmount(new BigDecimal(vo.getTotal_fee()));
+ paymentRecharge.setPayInfo(vo.toString());
+ paymentRechargeService.updateById(paymentRecharge);
+ userRecharge.setOrderStatus(2);
+ userRechargeMapper.updateById(userRecharge);
+ log.error("充值回调失败:"+vo.toString());
+ return;
+ }else if(!vo.getStatus().equals("payin_fail") && !vo.getStatus().equals("payin_ing") && !vo.getStatus().equals("payin_success")){
+ log.error("充值回调失败----未知状态:"+vo.toString());
+ return;
+ }
+
UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<>(UserAssets.class)
.eq(UserAssets::getUserId, paymentRecharge.getUserId())
.eq(UserAssets::getAccectType, "IN")
);
- ServerResponse serverResponse = iUserAssetsServices.updateUserAssets(userAssets.getId(), vo.getAccount_fee().toString(), "2");
- if(serverResponse.getStatus() == 0){
- paymentRecharge.setStatus(2);
- paymentRecharge.setAmount(new BigDecimal(vo.getAccount_fee()));
- paymentRecharge.setPayInfo(vo.toString());
- paymentRechargeService.updateById(paymentRecharge);
- }
+// ServerResponse serverResponse = iUserAssetsServices.updateUserAssets(userAssets.getId(), vo.getTotal_fee().toString(), "2");
+ userAssetsServices.availablebalanceChange(EStockType.IN.getCode(),
+ paymentRecharge.getUserId(), EUserAssets.TOP_UP,new BigDecimal(vo.getTotal_fee().toString()),"","");
+
+ paymentRecharge.setStatus(2);
+ paymentRecharge.setAmount(new BigDecimal(vo.getTotal_fee()));
+ paymentRecharge.setPayInfo(vo.toString());
+ paymentRechargeService.updateById(paymentRecharge);
+
+ userRecharge.setOrderStatus(1);
+ userRechargeMapper.updateById(userRecharge);
+
log.info("充值回调----完成");
pw.print("success");
pw.flush();
@@ -952,4 +1087,84 @@
}
}
+
+ public void rechargeCallbackZero(PaymentNotifyResponse vo, HttpServletResponse response) throws IOException {
+
+ log.info("充值回调进来了:"+vo.toString());
+ synchronized (vo.getData().getOrderNo()){
+ PrintWriter pw = response.getWriter();
+
+ PaymentRecharge paymentRecharge = paymentRechargeService.getOne(new LambdaQueryWrapper<>(PaymentRecharge.class)
+ .eq(PaymentRecharge::getOrderNo,vo.getData().getMerchantOrderNo())
+ .eq(PaymentRecharge::getStatus,1)
+ .last("limit 1")
+ );
+ if(ObjectUtils.isEmpty(paymentRecharge)){
+ log.info("未找到充值订单");
+ pw.print("error 未找到充值订单");
+ return;
+ }
+ UserRecharge userRecharge = userRechargeMapper.selectOne(new LambdaQueryWrapper<>(UserRecharge.class)
+ .eq(UserRecharge::getOrderSn, paymentRecharge.getOrderNo())
+ .eq(UserRecharge::getOrderStatus, 0).last(" limit 1"));
+ if(ObjectUtils.isEmpty(userRecharge)){
+ log.info("未找到充值记录订单");
+ pw.print("error 未找到充值订单");
+ return;
+ }
+
+ if(vo.getData().getStatus().equals("PENDING")){
+ log.error("充值2回调交易中:"+vo.toString());
+ pw.print("{code: 200}");
+ pw.flush();
+ pw.close();
+ return;
+ }else if(vo.getData().getStatus().equals("FAILURE")){
+ paymentRecharge.setStatus(2);
+ paymentRecharge.setAmount(new BigDecimal(vo.getData().getAmount()));
+ paymentRecharge.setPayInfo(vo.toString());
+ paymentRechargeService.updateById(paymentRecharge);
+ userRecharge.setOrderStatus(2);
+ userRechargeMapper.updateById(userRecharge);
+ log.error("充值回调失败:"+vo.toString());
+ pw.print("{code: 200}");
+ pw.flush();
+ pw.close();
+ return;
+ }else if(vo.getData().getStatus().equals("REFUND")){
+ paymentRecharge.setStatus(2);
+ paymentRecharge.setAmount(new BigDecimal(vo.getData().getAmount()));
+ paymentRecharge.setPayInfo(vo.toString());
+ paymentRechargeService.updateById(paymentRecharge);
+ userRecharge.setOrderStatus(2);
+ userRecharge.setOrderDesc("REFUND");
+ userRechargeMapper.updateById(userRecharge);
+ log.error("充值回调失败(已退款):"+vo.toString());
+ pw.print("{code: 200}");
+ pw.flush();
+ pw.close();
+ return;
+ }else if(!vo.getData().getStatus().equals("PENDING") && !vo.getData().getStatus().equals("FAILURE") && !vo.getData().getStatus().equals("SUCCESS") && !vo.getData().getStatus().equals("REFUND")){
+ log.error("充值回调失败----未知状态:"+vo.toString());
+ pw.print("error 未找到充值订单");
+ return;
+ }
+
+ userAssetsServices.availablebalanceChange(EStockType.IN.getCode(),
+ paymentRecharge.getUserId(), EUserAssets.TOP_UP,new BigDecimal(vo.getData().getAmount().toString()),"","");
+
+ paymentRecharge.setStatus(2);
+ paymentRecharge.setAmount(new BigDecimal(vo.getData().getAmount()));
+ paymentRecharge.setPayInfo(vo.toString());
+ paymentRechargeService.updateById(paymentRecharge);
+
+ userRecharge.setOrderStatus(1);
+ userRechargeMapper.updateById(userRecharge);
+
+ log.info("充值回调----完成");
+ pw.print("{code: 200}");
+ pw.flush();
+ pw.close();
+ }
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3