由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。为了简化集成流程,商户可以将同步结果仅仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,完全依赖服务端异步通知。
以下来介绍下同步验签和异步验签;
为了快速接入并避免接入过程中的签名验签问题,强烈建议您先下载对应语言版本的SDK并引入您的开发工程。
自行实现验签
如果未使用支付宝开放平台SDK,需要自行实现验签过程。 其中同步返回和异步通知报文格式及验签方法有所区别,详见以下说明:
同步返回验签
开发者只对支付宝返回的json中xxx_response的值做验签(xxx代表接口名)。
xxx_response的json值内容需要包含首尾的“{”和“}”两个尖括号,双引号也需要参与验签,如果字符串中包含https的正斜杠,需要先将正斜杠做转义,默认打印出来的字符串是已经做过转义的。建议验签不通过时将正斜杠转义一次后再做一次验签。 如当面付扫码支付获取二维码的返回内容为:
则待验签字段为:
调用验签函数:
使用各自语言对应的SHA256WithRSA(对应sign_type为RSA2)或SHA1WithRSA(对应sign_type为RSA)签名验证函数,传入待验签字段、支付宝公钥、签名内容(sign),验签方法(signType)进行验签,根据返回结果判定是否验签通过。
异步通知验签
某些情况下(比如扫码支付成功时),支付宝会给商户发送异步通知。 如果某商户设置的通知地址为https://api.xx.com/receive_notify.htm,对应接收到通知的示例如下:
验签流程:
1.在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。
2.将剩下参数进行url_decode, 然后进行字典排序,组成字符串,得到待签名字符串:
3.将签名参数(sign)使用base64解码为字节码串。
4.使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名,根据返回结果判定是否验签通过。
可以参考开放平台SDK源码中的AlipaySignature.rsaCheckV1方法,示例如下: