From 3cb61867769d091f7e20ade8701b6593b82141ad Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期四, 26 九月 2024 14:40:10 +0800
Subject: [PATCH] 玩湃微信商户分账

---
 cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java |   77 ++++++++++++++++++++++++++++++++------
 1 files changed, 65 insertions(+), 12 deletions(-)

diff --git a/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java b/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java
index 8756908..a8021ef 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java
@@ -1,6 +1,7 @@
 package com.dsh.course.util;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
@@ -22,10 +23,7 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
+import javax.crypto.*;
 import javax.crypto.spec.SecretKeySpec;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
@@ -38,6 +36,8 @@
 import java.security.NoSuchProviderException;
 import java.security.Security;
 import java.util.*;
+
+import static com.dsh.course.util.akeylogin.Md5Util.byteArrayToHexString;
 
 /**
  * 第三方支付工具类
@@ -495,6 +495,8 @@
             return ResultUtil.error(map1.get("return_msg"), new JSONObject());
         }
     }
+
+
     /**
      * 发起分账
      * @param order 微信订单号
@@ -506,16 +508,20 @@
         map.put("appid", appid);
         map.put("nonce_str", nonceStr);
         map.put("transaction_id", order);
+        String out_order_no = UUIDUtil.getRandomCode(16);
+        map.put("out_order_no", out_order_no);
         // 将这个字符串使用json格式拼接起来
         Map<String, Object> body = new HashMap<>();
         body.put("type", "MERCHANT_ID");
         body.put("account", merchantNumber);
-        body.put("amount", amount);
-        body.put("description", "订单分账");
+        int i = amount.multiply(new BigDecimal("100")).intValue();
+        body.put("amount", i);
+        body.put("description", "购买课包分账");
         JSONObject jsonObject = new JSONObject(body);
-        String jsonString = jsonObject.toString();
-        map.put("receiver",jsonString);
-        String s = this.weixinSignature(map);
+        JSONArray objects = new JSONArray();
+        objects.add(jsonObject);
+        map.put("receivers",objects.toJSONString());
+        String s = this.weixinSignature1(map);
         map.put("sign", s);
         String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
         //设置请求头
@@ -535,7 +541,7 @@
         Map<String, String> map1 = null;
         String body1 = null;
         try {
-            body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+            body1 = HttpClientUtil.pushHttpsRequsetXml1(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -554,7 +560,7 @@
         if ("SUCCESS".equals(return_code)) {
             String result_code = map1.get("result_code");
             if ("SUCCESS".equals(result_code)) {
-                return ResultUtil.success();
+                return ResultUtil.success(map1.get("order_id"));
             } else {
 //                System.err.println(map1.get("err_code_des"));
                 return ResultUtil.error(map1.get("err_code_des"));
@@ -1237,7 +1243,54 @@
         }
         return null;
     }
-
+    private String weixinSignature1(Map<String, Object> map) {
+        try {
+            Set<Map.Entry<String, Object>> entries = map.entrySet();
+            List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(entries);
+            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+            Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
+                public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
+                    return (o1.getKey()).toString().compareTo(o2.getKey());
+                }
+            });
+            // 构造签名键值对的格式
+            StringBuilder sb = new StringBuilder();
+            for (Map.Entry<String, Object> item : infoIds) {
+                if (item.getKey() != null || item.getKey() != "") {
+                    String key = item.getKey();
+                    Object val = item.getValue();
+                    if (!(val == "" || val == null)) {
+                        sb.append(key + "=" + val + "&");
+                    }
+                }
+            }
+            sb.append("key=" + key);
+            String sign = sha256_HMAC(sb.toString(), key).toUpperCase();
+            return sign;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    /**
+     * sha256_HMAC加密
+     * @param message 消息
+     * @param secret  秘钥
+     * @return 加密后字符串
+     */
+    public  String sha256_HMAC(String message, String secret) {
+        String hash = "";
+        try {
+            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
+            SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
+            sha256_HMAC.init(secret_key);
+            byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
+            hash = byteArrayToHexString(bytes);
+        } catch (Exception e) {
+            System.out.println("Error HmacSHA256 ===========" + e.getMessage());
+        }
+        return hash;
+    }
 
     /**
      * 微信下单的签名算法

--
Gitblit v1.7.1