微信商家券V3版本领券回调,签名验证-JAVA

本文介绍了微信商家券V3版本的领券回调处理,包括回调参数的解析与验证。详细讲解了如何使用JAVA进行签名验证,并提供了采用实时刷新在线证书的实现方式,避免了本地证书的读取操作。
摘要由CSDN通过智能技术生成

先附上官方文档:微信支付-开发者文档

一.微信商家券回调参数样式

1.微信回调的参数分两部分,这里两部分参数都要用的!

A.Body

{ 
    "id":"8b33f79f-8869-5ae5-b41b-3c0b59f957d0",
    "create_time":"2019-12-12T16:54:38+08:00",
    "resource_type":"encrypt-resource",
    "event_type":"COUPON.SEND",
    "summary":"商家券领券通知",
    "resource":{
        "original_type":"coupon",
        "algorithm":"AEAD_AES_256_GCM",
        "ciphertext":"xxx",
        "associated_data":"coupon",
        "nonce":"j9g1wAzF9Xn1"
     } 
} 

B.请求头

这里只取用的请求头

Wechatpay-Nonce: c5ac7061fccab6bc5ac7061fccab6bc
Wechatpay-Signature: CtcbzwtQjN8rnOXItEBJ5aQFSnIXESeV28Pr2YEmf9wsDQ8Nx25ytW6FXBCAFdrr0mgqngX3AD9gNzjnNHzSGTPBSsaEkIfhPF4b8YRRTpny88tNLyprXA0GU5ID3DkZHpjFkX1hAp/D0fva2GKjGRLtvYbtUk/OLYqFuzbjt3yOBzJSKQqJsvCtcbzwtQjN8rnOXItEBJ5aQFSnIXESeV28Pr2YEmf9wsDQ8Nx25ytW6FXBCAFdrr0mgqngX3AD9gNzjnNHzSGTPBSsaEkIfhPF4b8YRRTpny88tNLyprXA0GU5ID3DkZHpjFkX1hAp/D0fva2GKjGRLtvYbtUk/O==
Wechatpay-Timestamp: 1555555555
Wechatpay-Serial: 5157F09EFDC096DE155157F09EFDC096DE15EB11

2.接受回调参数,建议采用注解,不同公司封装不同的不一定接收到参数

@RequestBody String body,
@RequestHeader("Wechatpay-Serial") String wechatpaySerial,
@RequestHeader("Wechatpay-Signature") String wechatpaySignature,
@RequestHeader("Wechatpay-Timestamp") String wechatpayTimestamp,
@RequestHeader("Wechatpay-Nonce") String wechatpayNonce)

官方文档用的是CloseableHttpResponse response接收参数的,body= response.getBody

二.上代码,采用的是实时刷新在线证书临时缓存证书的方式,不需要读取本地证书

1.接收参数

@ApiOperation("微信商家券领券事件回调通知API")
    @RequestMapping(value="/callback")
    Map<String, String> stockCouponsReceiveCallback(@RequestBody String params,
                                                    @RequestHeader("Wechatpay-Serial") String wechatpaySerial,
                                                    @RequestHeader("Wechatpay-Signature") String wechatpaySignature,
                                                    @RequestHeader("Wechatpay-Timestamp") String wechatpayTimestamp,
                                                    @RequestHeader("Wechatpay-Nonce") String wechatpayNonce);

2.方法实现

   @Override
    public Map<String, String> stockCouponsReceiveCallback(String postData,
                                                           String wechatpaySerial,
                                                           String wechatpaySignature,
                          
微信支付的V3版本引入了更加安全的签名验证机制。当微信支付完成之后,微信会向商户指定的回调地址发送支付结果通知,商户系统需要验证这些通知的真实性,以确保信息来源可靠,并且内容没有被篡改。签名验证是通过比对微信服务器发送的数据包中的签名与商户系统根据接收到的数据计算出来的签名是否一致来完成的。 在Java中,实现微信V3 Native支付回调签名验证,你需要按照以下步骤操作: 1. 从HttpServletRequest中获取所有参数(包括GET和POST参数),并按照参数名的字典序进行排序。 2. 将排序后的参数名称和参数值拼接成字符串,并使用`&`字符连接起来。 3. 在拼接的字符串前加上`key=`,其中`key`是你的微信支付平台分配的API密钥。 4. 使用SHA256算法对上述字符串进行加密,并将加密结果转换为大写,这就是微信发送过来的签名。 5. 同时,你也需要使用同样的方法计算出一个签名,并与微信发送的签名进行对比。 6. 如果两个签名一致,则说明验证通过,否则验证失败。 下面是一个简化版的代码示例: ```java import javax.servlet.http.HttpServletRequest; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class WeChatPaySignatureValidator { public static boolean validateSignature(HttpServletRequest request, String apiKey) throws NoSuchAlgorithmException { // 获取所有参数并排序 String params = getSortedParams(request); // 将API密钥拼接到参数前 String toSign = "key=" + apiKey + "&" + params; // 计算签名 String sign = calculateSignature(toSign); // 获取微信发送的签名并比较 String weChatSign = request.getHeader("Wechatpay-Signature"); return sign.equals(weChatSign); } private static String getSortedParams(HttpServletRequest request) { // 实现获取排序后的参数字符串的逻辑 // ... } private static String calculateSignature(String data) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digest = md.digest(data.getBytes()); return toUpperCaseHex(digest); } private static String toUpperCaseHex(byte[] bytes) { StringBuilder hexString = new StringBuilder(); for (byte b : bytes) { String hex = Integer.toHexString(0xFF & b); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } } ``` 注意,这只是一个基础的实现逻辑,实际生产环境中你还需要考虑参数的空值和特殊情况处理,以及可能的性能优化等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值