diff --git a/src/main/java/com/muyu/pay/wechat/utils/SignUtils.java b/src/main/java/com/muyu/pay/wechat/utils/SignUtils.java new file mode 100644 index 0000000..4de2479 --- /dev/null +++ b/src/main/java/com/muyu/pay/wechat/utils/SignUtils.java @@ -0,0 +1,55 @@ +package com.muyu.pay.wechat.utils; + +import okhttp3.HttpUrl; + +import java.security.Signature; +import java.util.Base64; + +/** + * @author DongZl + * @description: 签名工具类 + * @Date 2023-8-21 上午 11:23 + */ +public class SignUtils { + + // Authorization: +// GET - getToken("GET", httpurl, "") +// POST - getToken("POST", httpurl, json) + String schema = "WECHATPAY2-SHA256-RSA2048"; + HttpUrl httpurl = HttpUrl.parse(url); + + String getToken(String method, HttpUrl url, String body) { + String nonceStr = "your nonce string"; + long timestamp = System.currentTimeMillis() / 1000; + String message = buildMessage(method, url, timestamp, nonceStr, body); + String signature = sign(message.getBytes("utf-8")); + + return "mchid=\"" + yourMerchantId + "\"," + + "nonce_str=\"" + nonceStr + "\"," + + "timestamp=\"" + timestamp + "\"," + + "serial_no=\"" + yourCertificateSerialNo + "\"," + + "signature=\"" + signature + "\""; + } + + String sign(byte[] message) { + Signature sign = Signature.getInstance("SHA256withRSA"); + sign.initSign(yourPrivateKey); + sign.update(message); + + return Base64.getEncoder().encodeToString(sign.sign()); + } + + + String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) { + String canonicalUrl = url.encodedPath(); + if (url.encodedQuery() != null) { + canonicalUrl += "?" + url.encodedQuery(); + } + + return method + "\n" + + canonicalUrl + "\n" + + timestamp + "\n" + + nonceStr + "\n" + + body + "\n"; + } +}