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