签名验证java代码示例
时间: 2023-07-31 19:10:52 浏览: 99
JAVA签名实例
以下是一个使用Java进行微信支付签名验证的示例代码:
```java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class WeChatPaySignatureValidator {
// 商户密钥(API密钥)
private static final String API_KEY = "your_api_key";
public static boolean validateSignature(Map<String, String> params) {
// 将参数按照键值对的字典序排序
SortedMap<String, String> sortedParams = new TreeMap<>(params);
// 拼接待验证的签名字符串
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (value != null && !value.isEmpty() && !"sign".equals(key)) {
sb.append(key).append("=").append(value).append("&");
}
}
sb.append("key=").append(API_KEY);
// 使用MD5算法进行加密,生成签名值
String sign = md5(sb.toString()).toUpperCase();
// 验证签名
return sign.equals(params.get("sign"));
}
private static String md5(String s) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(s.getBytes());
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xff);
if (hex.length() == 1) {
result.append("0");
}
result.append(hex);
}
return result.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}
```
使用示例:
```java
public class Main {
public static void main(String[] args) {
// 假设收到的回调参数存储在一个Map中
Map<String, String> params = new HashMap<>();
params.put("appid", "your_appid");
params.put("mch_id", "your_mch_id");
params.put("nonce_str", "random_nonce_str");
params.put("out_trade_no", "your_order_no");
params.put("sign", "generated_sign");
boolean isValid = WeChatPaySignatureValidator.validateSignature(params);
if (isValid) {
System.out.println("签名验证通过");
// TODO: 处理支付回调逻辑
} else {
System.out.println("签名验证失败");
// TODO: 处理异常情况
}
}
}
```
请注意,上述示例代码仅提供了签名验证的基本逻辑,您需要根据具体的业务需求和微信支付接口文档进行相应的参数处理和异常处理。此外,确保您已正确获取并保存了商户密钥(API密钥),并在代码中进行相应的替换。
阅读全文