TRX il y a 1 an
Parent
commit
627eed401e

+ 43 - 2
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionFrictionlessPayMainService.java

@@ -1,5 +1,8 @@
 package com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay;
 
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.github.microservice.models.requestModel.SuperResponseModel;
 import com.github.microservice.models.type.PaymentType;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.payment.client.annotation.PayAnnotationService;
@@ -12,6 +15,8 @@ import com.zhongshu.payment.client.payModel.commn.PayNotifyParam;
 import com.zhongshu.payment.client.payModel.commn.PayOrderParam;
 import com.zhongshu.payment.client.payModel.unionFrictionlessPay.model.SignParam;
 import com.zhongshu.payment.server.core.service.pay.SuperPayService;
+import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionFrictionlessPayApiConfig;
+import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionFrictionlessPayConfig;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
 import org.checkerframework.checker.units.qual.A;
@@ -32,6 +37,9 @@ public class UnionFrictionlessPayMainService extends SuperPayService {
     @Autowired
     UnionRequestService unionRequestService;
 
+    @Autowired
+    UnionFrictionlessPayApiConfig payApiConfig;
+
     /**
      * 发起签约
      *
@@ -39,8 +47,41 @@ public class UnionFrictionlessPayMainService extends SuperPayService {
      * @return
      */
     public ResultContent sign(SignParam param) {
-        String sign = unionRequestService.signParam(param);
-        log.info("sign: {}", sign);
+//        String sign = unionRequestService.signParam(param);
+//        log.info("sign: {}", sign);
+        String url = payApiConfig.getUlr(UnionFrictionlessPayApiConfig.sign);
+        SuperResponseModel requestAPI = unionRequestService.requestAPI(url, param, SuperResponseModel.class);
+        if (requestAPI.isFailed()) {
+            return ResultContent.buildFail(requestAPI.getMsg());
+        }
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.set("walletOption", "SINGLE");
+        jsonObject.set("billNo", "31940000201700002");
+        jsonObject.set("billDate", "2017-06-26");
+        jsonObject.set("sign", "2631915B7F7822C4B00A488A32E03764");
+        jsonObject.set("requestTimestamp", "2017-06-26 17:28:02");
+        jsonObject.set("instMid", "QRPAYDEFAULT");
+        jsonObject.set("msgSrc", "WWW.TEST.COM");
+        jsonObject.set("totalAmount", "1");
+
+        JSONArray array = new JSONArray();
+        JSONObject good = new JSONObject();
+        good.set("body", "微信二维码测试");
+        good.set("price", "1");
+        good.set("goodsName", "微信二维码测试");
+        good.set("goodsId", "1");
+        good.set("quantity", "1");
+        good.set("goodsCategory", "TEST");
+        array.add(good);
+        jsonObject.set("goods", array);
+
+        jsonObject.set("msgType", "bills.getQRCode");
+        jsonObject.set("mid", "898340149000005");
+        jsonObject.set("tid", "88880001");
+
+        String sign1 = unionRequestService.signByJSONObject(jsonObject);
+        log.info("sign1: {}", sign1);
 
         return ResultContent.buildSuccess();
     }

+ 71 - 14
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionRequestService.java

@@ -2,6 +2,7 @@ package com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.github.microservice.core.util.net.apache.HttpClientUtil;
@@ -25,6 +26,8 @@ import org.springframework.util.StopWatch;
 
 import java.net.URLEncoder;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.TreeMap;
 
 /**
@@ -59,8 +62,15 @@ public class UnionRequestService extends SuperService {
             StopWatch stopWatch = new StopWatch();
             stopWatch.start();
             // 发送请求
-            ResponseModel request = HttpClientUtil.request(HttpModel.builder()
-                    .url(url).method(apiConfParam.getMethodType()).charset("utf-8").body(data).build());
+            HttpModel httpModel = HttpModel.builder()
+                    .url(url).method(apiConfParam.getMethodType())
+                    .charset("utf-8").body(data).build();
+
+            Map<String, Object> header = new HashMap<>();
+            header.put("Authorization", sign(JSONUtil.parseObj(JSONUtil.toJsonStr(data))));
+            httpModel.setHeader(header);
+            ResponseModel request = HttpClientUtil.request(httpModel);
+
             int code = request.getCode();
             if (code == 200) {
                 BeanUtil.copyProperties(request.getBody(), responseModel);
@@ -69,6 +79,7 @@ public class UnionRequestService extends SuperService {
             } else {
                 BeanUtil.copyProperties(request.getBody(), responseModel);
             }
+            responseModel.setCode(code);
             stopWatch.stop();
             responseModel.setMillis(stopWatch.getTotalTimeMillis());
         } catch (Exception e) {
@@ -105,25 +116,71 @@ public class UnionRequestService extends SuperService {
         StringBuffer reqPara = new StringBuffer();// 组织请求参数
 
         for (String key : map.keySet()) {
+            Object o = map.get(key);
+            String val = "";
+            if (o instanceof ArrayList) {
+                val = JSONUtil.toJsonStr(o);
+            } else if (o instanceof JSONArray) {
+                val = JSONUtil.toJsonStr(o);
+            } else if (o instanceof JSONObject) {
+                val = JSONUtil.toJsonStr(o);
+            } else {
+                val = String.valueOf(map.get(key));
+            }
+//            val = URLEncoder.encode(val, "UTF-8");
             if (signPara.length() == 0) {
-                signPara.append(key + "=" + map.get(key));
-                reqPara.append(key + "=" + URLEncoder.encode(String.valueOf(map.get(key)), "UTF-8"));
+                signPara.append(key + "=" + val);
+                reqPara.append(key + "=" + val);
             } else {
-                Object o = map.get(key);
-                if (o instanceof ArrayList) {
-                    String jsonStr = JSONUtil.toJsonStr(o);
-                    signPara.append("&" + key + "=" + jsonStr);
-                    reqPara.append("&" + key + "=" + URLEncoder.encode(jsonStr, "UTF-8"));
-                } else {
-                    signPara.append("&" + key + "=" + map.get(key));
-                    reqPara.append("&" + key + "=" + URLEncoder.encode(String.valueOf(map.get(key)), "UTF-8"));
-                }
+                signPara.append("&" + key + "=" + val);
+                reqPara.append("&" + key + "=" + val);
             }
         }
-        String sign = AesUtils.signData(signPara.toString() + UnionPaymentConfig.payKey);
+        String signStr = signPara.toString() + UnionPaymentConfig.payKey;
+        log.info("s: {}", signStr);
+        String sign = AesUtils.signData(signStr);
+        log.info("sign: {}", sign);
+        String md5 = AesUtils.getMD5Str(signStr);
+        log.info("md5: {}", md5);
+
         StringBuffer append = reqPara.append("&sign=" + URLEncoder.encode(sign, "UTF-8"));
         return append.toString();
     }
 
+    @SneakyThrows
+    public String sign(JSONObject entries) {
+        TreeMap<String, Object> map = new TreeMap<>();
+        for (String key : entries.keySet()) {
+            if (!ObjectUtil.isEmpty(entries.get(key)) && !"sign".equals(key)) {
+                map.put(key, String.valueOf(entries.get(key)));
+            }
+        }
+        StringBuffer signPara = new StringBuffer();//代签名的字符串
+
+        for (String key : map.keySet()) {
+            Object o = map.get(key);
+            String val = "";
+            if (o instanceof ArrayList) {
+                val = JSONUtil.toJsonStr(o);
+            } else if (o instanceof JSONArray) {
+                val = JSONUtil.toJsonStr(o);
+            } else if (o instanceof JSONObject) {
+                val = JSONUtil.toJsonStr(o);
+            } else {
+                val = String.valueOf(map.get(key));
+            }
+//            val = URLEncoder.encode(val, "UTF-8");
+            if (signPara.length() == 0) {
+                signPara.append(key + "=" + val);
+            } else {
+                signPara.append("&" + key + "=" + val);
+            }
+        }
+        String signStr = signPara.toString() + UnionPaymentConfig.payKey;
+        String sign = AesUtils.signData(signStr);
+        log.info("sign: {}", sign);
+        return sign;
+    }
+
 }
 

+ 2 - 2
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/config/UnionFrictionlessPayApiConfig.java

@@ -20,7 +20,7 @@ import java.util.Optional;
 public class UnionFrictionlessPayApiConfig {
 
     @Autowired
-    public static UnionFrictionlessPayConfig payConfig;
+    public UnionFrictionlessPayConfig payConfig;
 
     // 申请扣款
     public static String pay = "pay";
@@ -81,7 +81,7 @@ public class UnionFrictionlessPayApiConfig {
 
     }
 
-    public static String getUlr(String key) {
+    public String getUlr(String key) {
         if (StringUtils.isNotEmpty(key)) {
             Optional<UnionPayApi> opt = apis.stream().filter(it -> it.getApiKey().equals(key)).findFirst();
             if (opt.isPresent()) {

+ 2 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/config/UnionFrictionlessPayConfig.java

@@ -3,12 +3,14 @@ package com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.c
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
 
 /**
  * @author TRX
  * @date 2024/8/21
  */
 @Data
+@Component
 @Configuration
 @ConfigurationProperties(prefix = "unionfrictionless")
 public class UnionFrictionlessPayConfig {

+ 2 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/config/UnionPaymentConfig.java

@@ -6,6 +6,7 @@ package com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.c
  */
 public class UnionPaymentConfig {
 
-    public static final String payKey = "fcAmtnx7MwismjWWhVKad";
+    // 无感支付 秘钥
+    public static final String payKey = "fcAmtnx7MwismjWNhNKdHC44mNXtnEQeJkRrhkJwyrW2ysRR";
 
 }

+ 26 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/utils/AesUtils.java

@@ -18,4 +18,30 @@ public class AesUtils {
         return toHexString(md.digest());
     }
 
+    public static String getMD5Str(String s) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+//            byte[] digest = md.digest(s.getBytes());
+//            StringBuilder sb = new StringBuilder();
+//            for (byte b : digest) {
+//                sb.append(String.format("%02x", b));
+//            }
+//            return sb.toString();
+            byte[] bytes = md.digest(s.getBytes("utf-8"));
+            return toHex(bytes);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static String toHex(byte[] bytes) {
+        final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
+        StringBuilder ret = new StringBuilder(bytes.length * 2);
+        for (int i = 0; i < bytes.length; i++) {
+            ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);
+            ret.append(HEX_DIGITS[bytes[i] & 0x0f]);
+        }
+        return ret.toString();
+    }
+
 }