微信Native支付回调的签名验证HttpServletRequest java实现
时间: 2024-09-09 16:09:58 浏览: 45
微信Native支付回调的签名验证是保证支付回调安全性的重要步骤,确保支付结果是由微信支付系统发送的,而不是伪造的消息。在Java中,可以通过以下步骤实现:
1. 从HttpServletRequest中获取回调数据:首先需要从请求中获取所有参数,包括微信支付系统发送的参数以及自定义参数。
2. 将参数按字典序排序:将所有的参数,按照参数名的字典序进行排序,这个步骤是为了保证不同服务器间在进行签名验证时的一致性。
3. 拼接签名串:从排序后的参数中,忽略sign参数,将参数名和参数值拼接成一个字符串,每个参数之间用"&"连接。
4. 使用微信支付分配的密钥进行MD5加密:使用MD5算法对步骤3中得到的字符串进行加密,然后将加密后的结果转换为大写形式。
5. 比较加密后的签名:将步骤4中加密并转为大写后的签名与请求中的sign参数值进行比较,如果相等则验证通过,否则验证失败。
下面是一个简单的示例代码实现:
```java
import javax.servlet.http.HttpServletRequest;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class WechatPaySignatureUtils {
public static boolean verifySignature(HttpServletRequest request) {
try {
// 获取所有参数
String params[] = request.getParameterMap().keySet().toArray(new String[0]);
// 参数排序
java.util.Arrays.sort(params);
// 拼接签名串
StringBuilder sb = new StringBuilder();
for (String param : params) {
if (!"sign".equals(param)) { // 忽略sign参数
if (sb.length() > 0) {
sb.append("&");
}
sb.append(param).append("=").append(request.getParameter(param));
}
}
String signStr = sb.toString();
// 加密
String wechatSign = MD5加密(signStr + "&key=" + "WECHAT_PAY_SECRET_KEY");
// 比较签名
return wechatSign.equals(request.getParameter("sign"));
} catch (Exception e) {
return false;
}
}
private static String MD5加密(String source) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(source.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
}
```
注意替换`"WECHAT_PAY_SECRET_KEY"`为你的微信支付分配的密钥。
阅读全文