java微信支付v3 验证签名代码
时间: 2023-09-13 11:13:52 浏览: 109
以下是Java微信支付V3验证签名代码示例:
```java
public class WechatPayVerification {
/**
* 验证签名
*
* @param body 请求报文主体
* @param signature 微信支付返回的签名
* @param timestamp 微信支付返回的时间戳
* @param nonce 微信支付返回的随机字符串
* @param publicKey 商户平台API证书公钥内容
* @return 验证成功返回true,否则返回false
*/
public static boolean verify(String body, String signature, String timestamp, String nonce, String publicKey) {
try {
// 拼接待签名字符串
String message = timestamp + "\n" + nonce + "\n" + body + "\n";
// 将公钥字符串转换为公钥对象
PublicKey publicKeyObj = getPublicKey(publicKey);
// 验证签名
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initVerify(publicKeyObj);
sign.update(message.getBytes());
return sign.verify(Base64.getDecoder().decode(signature));
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 将公钥字符串转换为公钥对象
*
* @param publicKeyStr 商户平台API证书公钥内容
* @return 公钥对象
* @throws Exception 异常
*/
private static PublicKey getPublicKey(String publicKeyStr) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(publicKeyStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(keySpec);
}
}
```
使用示例:
```java
String body = "{\"id\":\"123456\"}";
String signature = "Y5iHYv5RyajCQ2e0gLdK0l1vFqZpDq0NqOuLWmzv7y4t4kzO7EhO5Qjv7xuS9OcX7s1sB2QkIwPzDjKsTGMeTg==";
String timestamp = "1607993739";
String nonce = "nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6";
String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjvJwOwFf7GmzQY+KcSEZrLJrL9rDdM0LpO+u4w1lu4B4f8Jg+4zE5xjZS+7XuJ2f/CQ7h+Q2D5R7R5Y5Y5o5v3qZ3Hc9X8LW1n0LJw5DQMYca12R8GtWk5v5H3lqfZ9XN8gW0hJFyO4cq4QE4b8CkWpLdOxuKqb07SUI7kcD2h06Ov7k6zAAbAzP57F6Y2sI1cXx1ZrT9rKlPnPOgI7w3HnF6kzgD1YjBvzQ6U2J6U9+6bGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6nYut1vzqJHKBn3sxq8UGaGv6vzR6U9Q6";
boolean result = WechatPayVerification.verify(body, signature, timestamp, nonce, publicKey);
System.out.println(result);
```
注意:在实际使用中,需要将公钥字符串替换为商户平台API证书中的公钥内容。
阅读全文