微信支付 sdk 验签
时间: 2023-10-16 12:10:59 浏览: 128
微信支付 SDK 验签的基本流程如下:
1. 从微信支付服务器获取支付结果通知(XML 格式)。
2. 将 XML 格式的支付结果通知转换成 Map 对象。
3. 对 Map 对象中的参数按照 key 值进行字典序排序。
4. 将排序后的参数拼接成一个字符串,格式为 key1=value1&key2=value2&...&keyn=valuen。
5. 将拼接后的字符串与商户密钥进行拼接,得到一个新的字符串。
6. 对新的字符串进行 MD5 签名,得到一个签名值。
7. 将签名值与支付结果通知中的 sign 字段进行比较,如果一致则代表验签通过。
以下是一个 Java 实现的示例代码:
```java
import java.util.*;
import java.security.*;
import javax.xml.bind.DatatypeConverter;
public class WxPay {
// 商户密钥
private static final String KEY = "your_key_here";
// 验证微信支付通知
public static boolean verify(Map<String, String> params) {
// 将参数按照 key 值进行字典序排序
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
// 拼接参数字符串
String paramStr = "";
for (String key : keys) {
String value = params.get(key);
if (!value.isEmpty() && !key.equals("sign")) {
paramStr += key + "=" + value + "&";
}
}
paramStr += "key=" + KEY;
// 对参数字符串进行 MD5 签名
String sign = null;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(paramStr.getBytes("UTF-8"));
sign = DatatypeConverter.printHexBinary(bytes).toLowerCase();
} catch (Exception e) {
return false;
}
// 比较签名值
return sign.equals(params.get("sign"));
}
}
```
调用示例:
```java
// 获取支付结果通知
Map<String, String> params = ...;
// 验证支付通知
if (WxPay.verify(params)) {
// 验签通过,处理支付结果
} else {
// 验签失败,忽略该支付通知
}
```
阅读全文