同步通知验签
什么是同步通知?
同步通知是通过GET方法给接口调用者同步返回的接口调用结果。在调用支付宝接口时,返回页需要被设置目标URL以便之后能够处理接收到的同步通知信息。同步通知通常有两种返回形式:returnURL形式和XML形式。
注意:
交易状态不可通过同步通知确认。
returnURL形式的同步通知:
返回页会使得支付完成后页面跳转回商家的网站(或其他指定页面)。返回页在不同编程语言示例代码中是以下页面:
- Java: return_url.jsp
- Php: return_url.php
- C#: return_url.aspx.cs
XML形式的同步通知:
很多情况下,同步通知是以XML形式返回。返回XML同步通知后,您当前的支付宝网关页面(https://intlmapi.alipay.com/gateway.do)将自动刷新,并输出支付宝的处理结果。
同步通知验签
收到同步通知后,您需要对通知验签。只有签名验证通过才能信任收到的通知。请完成以下步骤进行同步通知验签:
MD5签名类型
- 生成待签名字符串:
a. 将sign
和sign_type
字段移除。
b. 将剩下的字段用字母顺序排列。
c. 将所有字段通过&符号拼接起来。
Note:
对于XML形式的异步通知,返回参数是存放在节点当中。您可以讲每个节点名等同于参数名,节点值等同于参数值,使用与returnURL形式的异步通知同样的步骤进行验签。例如,来自create_forex_trade_wap接口的同步通知示例:out_trade_no=test20181109153145&total_fee=0.01&trade_status=TRADE_FINISHED&sign=32c532376eee9281fa4d424dd4a40e5b&trade_no=2018110922001332950500389138¤cy=USD&sign_type=MD5
其待签名字符串:currency=USD&out_trade_no=test20181109153145&total_fee=0.01&trade_no=2018110922001332950500389138&trade_status=TRADE_FINISHED
- 获取
mysign
参数的值:
a. 将MD5密钥拼接到待签名字符串的尾部。
b. 使用各自语言对应的MD5加密函数对拼接了MD5密钥的字符串进行加密,得到的加密值即为mysign
的值。 - 对
mysign
和sign
的值做相等判断: 得到的加密值mysign
与支付宝返回的参数sign
做相等判断,如果相等,则验证通过。
RSA2/RSA签名类型
- 生成待签名字符串:
a. 将sign
和sign_type
字段移除。
b. 将剩下的字段用字母顺序排列。
c. 将所有字段通过&符号拼接起来。
例如,来自create_forex_trade_wap接口的异步通知示例:
Note:
对于XML形式的异步通知,返回参数是存放在节点当中。您可以讲每个节点名等同于参数名,节点值等同于参数值,使用与returnURL形式的异步通知同样的步骤进行验签。例如,来自create_forex_trade_wap接口的同步通知示例:currency=USD&out_trade_no=FALCN32YWXN2CL4KFT8&trade_no=2020010222001331421405964515&total_fee=108.00&trade_status=TRADE_FINISHED&sign=bOQ2PdVHqBRK7UuewOIFlgQjyKdAVN7itA1VNu3MB+jtK+9Z2TPyTYJXngmwHzfHD44AVNaN90YXoHweivSKU+GmHxlJMBStT1Pie+AemJhJ9J126WMg5GaE+7xmp0V3zxuwFupzJi+A2iX+XxHTv6jOchDEESFSl5W6UXZX1AI&sign_type=RSA2
其待签名字符串:currency=USD&out_trade_no=FALCN32YWXN2CL4KFT8&total_fee=108.00&trade_no=2020010222001331421405964515&trade_status=TRADE_FINISHED
- 将签名参数使用base64解码为字节码串。
- 使用RSA2/RSA验签方法验证签名。将待签名字符串,经过based64解码的签名参数及支付宝公钥传入RSA2/RSA验签方法,根据返回结果判定是否验签通过。RSA验签方法示例:
copy
public static boolean verify(String content, String sign, String ali_public_key, String input_charset)
注意:
- 更多关于RSA2/RSA验签方法示例的信息,请参见示例代码下载。
- 获取支付宝公钥,请联系支付宝国际技术支持团队(AlipayGlobalTechService@service.alipay.com)。