huanglizhi 11 maanden geleden
bovenliggende
commit
e84fc6e5f1
1 gewijzigde bestanden met toevoegingen van 48 en 33 verwijderingen
  1. 48 33
      module-erp/src/main/java/com/hys/app/pay/wx/WxPayServiceMy.java

+ 48 - 33
module-erp/src/main/java/com/hys/app/pay/wx/WxPayServiceMy.java

@@ -17,6 +17,7 @@ import com.hys.app.framework.database.annotation.Id;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.util.JsonUtil;
 import com.hys.app.pay.ali.PayOrder;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
@@ -33,10 +34,7 @@ import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
 import java.net.*;
 import java.nio.charset.StandardCharsets;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.*;
 
 @Service
 public class WxPayServiceMy {
@@ -111,41 +109,58 @@ public class WxPayServiceMy {
         orderRequest.setSubMchId(wxConfig.getSubMchId());
         try {
             WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(orderRequest);
-            Map<String, String> params = new HashMap<>();
-            params.put("app_id", wxConfig.getAppId());
-            params.put("mch_id", wxConfig.getMchId());
-            params.put("nonce_str", result.getNonceStr());
-            params.put("body", payOrder.getSubject());
-            params.put("out_trade_no", payOrder.getTraceNo());
-            params.put("total_fee", String.valueOf(payOrder.getTotalAmount()));
-            params.put("spbill_create_ip", payOrder.getIp());
-            params.put("notify_url", wxConfig.getNotifyUrl());
-            params.put("trade_type", "JSAPI"); // 或 "NATIVE", "APP" 等
-            params.put("package", "prepay_id=" + result.getPrepayId());
-            params.put("time_stamp", String.valueOf(System.currentTimeMillis() / 1000));
-            params.put("sign_type", "MD5");
-            String sign = SignUtils.createSign(params, wxConfig.getMchKey(), null, null);
-            params.put("pay_sign", sign);
-            params.put("app_id", wxConfig.getAppId());
-            params.put("key", wxConfig.getMchKey());
-            return params;
-
-//            Map<String, String> payData = new HashMap<>();
-//            payData.put("appId", wxConfig.getAppId());
-//            payData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
-//            payData.put("nonceStr", result.getNonceStr());
-//            payData.put("package", "prepay_id=" + result.getPrepayId());
-//            payData.put("signType", "MD5");
-//            String sign = SignUtils.createSign(payData, wxConfig.getMchKey(), null, null);
-//            payData.put("paySign", sign);
-//            System.out.println(payData);
-//            return payData;
+//            Map<String, String> params = new HashMap<>();
+//            params.put("appId", wxConfig.getAppId());
+//            params.put("mchId", wxConfig.getMchId());
+//            params.put("nonceStr", result.getNonceStr());
+//            params.put("body", payOrder.getSubject());
+//            params.put("outTradeNo", payOrder.getTraceNo());
+//            params.put("totalFee", String.valueOf(payOrder.getTotalAmount()));
+//            params.put("spbillCreateIp", payOrder.getIp());
+//            params.put("notifyUrl", wxConfig.getNotifyUrl());
+//            params.put("tradeType", "JSAPI"); // 或 "NATIVE", "APP" 等
+//            params.put("package", "prepay_id=" + result.getPrepayId());
+//            params.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
+//            params.put("signtype", "MD5");
+//            String sign = SignUtils.createSign(params, wxConfig.getMchKey(), null, null);
+//            params.put("paySign", sign);
+//            params.put("appId", wxConfig.getAppId());
+//            params.put("key", wxConfig.getMchKey());
+//            return params;
+
+            Map<String, String> payData = new HashMap<>();
+            payData.put("appId", wxConfig.getAppId());
+            payData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
+            payData.put("nonceStr", result.getNonceStr());
+            payData.put("package", "prepay_id=" + result.getPrepayId());
+            payData.put("signType", "MD5");
+            String sign = createSign(payData, wxConfig.getMchKey());
+            payData.put("paySign", sign); // 将签名放入参数中
+            System.out.println(payData);
+            return payData;
         } catch (WxPayException e) {
             e.printStackTrace();
             return null;
         }
     }
 
+
+    public static String createSign(Map<String, String> params, String signKey) {
+        // 1. 对参数进行排序
+        StringBuilder toSign = new StringBuilder();
+        for (String key : new TreeMap<>(params).keySet()) {
+            String value = params.get(key);
+            if (value != null && !value.isEmpty()) {
+                toSign.append(key).append("=").append(value).append("&");
+            }
+        }
+        toSign.append("key=").append(signKey); // 2. 添加商户密钥
+
+        // 3. 生成签名
+        return DigestUtils.md5Hex(toSign.toString()).toUpperCase(); // 使用 MD5 签名
+    }
+
+
     public String getOpenIdCode(Long userId, String ip) throws UnsupportedEncodingException {
         return String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect",
                 wxConfig.getAppId(), URLEncoder.encode(wxConfig.getOAuth2Url(), "UTF-8"), "snsapi_userinfo", userId);