|
@@ -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);
|