退款回调通知中的Wechatpay-Signature长度不对,报Last unit does not have enough valid bits
问题描述
退款回调通知中的请求头Wechatpay-Signature长度不对,例如长度为:355,导致base64进行解码时,报如下错误:
java.lang.IllegalArgumentException: Last unit does not have enough valid bits
at java.util.Base64$Decoder.decode0(Base64.java:734)
at java.util.Base64$Decoder.decode(Base64.java:526)
at java.util.Base64$Decoder.decode(Base64.java:549)
Wechatpay-Signature如下:
WECHATPAY/SIGNTEST/WasLSPDq2oMMpofamwBbGImTHw9NVoeGAKwl9LcD3jLJ9ugq9ODHNyi0oKtCk0J+Ej3pFobolZHS4CMv11nz3IGPZLhvEZn4q0bIKtJiqas9YMM+eFHL7ihjV0Mc13iZ77TG+Nv2peISvyNsuPx7th3ZZrH6gREWZc3jqW29t3tB4vaqlfeD8kVvIryE7l4N7zB6mqo2L+dmvXvxPdZzSfAK51vdc2646BZiDY6XVuYie9smURVXse6nB/Of2HW3W6bMHXpk11sBt4JM/M6uuDsAqGSFJKAl3myUzgPVUQSLAia2GY7wjFgAEoaaG7897eqcNiZokGInTg==
解决方法
和微信侧进行了核实,回调通知中极少数情况下,签名可能是"WECHATPAY/SIGNTEST/"开头,此回调为探测流量。文档链接:https://pay.weixin.qq.com/docs/merchant/development/interface-rules/signature-verification.html
应对签名探测流量
为了确保商户系统的安全,微信支付会在极少数应答或通知回调中生成错误签名,以探测商户系统是否正确地验证了签名。
商户系统不应对探测流量进行特殊处理,而应将其视为正常的应答或通知回调,并对其签名进行验证。 在排查问题时,您可以通过查看签名值中的 WECHATPAY/SIGNTEST/
前缀快速判断是否为探测流量。所有用于探测目的的签名值都会包含此前缀。
在验签失败的情况下,我们建议商户系统采取以下措施:
如果应答的签名验证失败,商户系统应舍弃该应答。为了提高用户体验,商户系统可以适当地重试,或者让用户重新发起请求。微信支付不会针对重试请求发起探测。
若通知回调的签名验证失败,商户系统应返回失败(即应答
4xx
或5xx
的状态码),等待微信支付携带正确签名重新发送通知回调。