线上支付集成
Online payment是商户跳转到支付宝APP进行支付的解决方案
一、流程及接口参数信息
Mobile - App to App/Mobile website to App 流程
https://global.alipay.com/docs/ac/gr/macau#kNM79 Online Payment Flow (Mobile)
PC Website 流程
https://global.alipay.com/docs/ac/gr/macau#Tb18B Online Payment Flow (Web - Scan QRCode)
接口文檔及注意事項
https://global.alipay.com/docs/ac/gr/macau#oN74h
- 建议参考example里各API的request, response
- 所有Request都有requestMsgId,建议使用UUID,用于request的唯一标示
- 异步通知接口补充说明:支付宝在完成商家的请求数据处理后,服务器会通过主动通知(notify)将其处理的结果数据通知商家网站。这些结果数据是来自服务器的异步通知参数。请注意,这里的商户服务端接收到的是文档里request的描述,然后返回的是response的样式
二、最佳实践
- 建议以异步通知支付结果为准,并以主动查询支付结果保底,即设置定时器,如超时未收到异步通知则需要做主动查询
- 支付结果若为U-unknown, 则需隔10秒再次做主动查询
- 设置订单超时机制,如15分钟未支付,则需做主动撤销(cancel接口)
三、签名及验签
https://global.alipay.com/docs/ac/gr/signature
数字签名使用简介:客户端和支付宝必须在进行API调用之前交换RSA密钥,并且RSA密钥的长度必须为2048位。当对Alipay进行API调用时,客户端使用RSA私钥对API请求进行签名。收到API请求后,支付宝将使用客户端的RSA公钥来验证签名是否与API请求的内容匹配。同样,当客户端收到API响应时,强烈建议客户端使用支付宝的RSA公钥来验证API响应的签名。
1、签名生成步骤
1.1、通过OpenSSL或者其他工具获取RSA密钥对,分别生成后缀为pem格式的私钥和公钥,将公钥上传到Alipay服务器交换公钥以便进行后续签名验证。
(注:a、对于Java开发人员,需从控制台中pkcs8私钥输出中删除页眉、页脚、回车符和空格。b、使用openssl创建私钥后,如果使用java,则需要将私钥转换为pkcs8格式。如果使用.net或者php,则无需将私钥转换为pkcs8格式。)
1.2、提取要签名的request请求内容,确认参数和格式无误(很重要)。
1.3、使用SHA256withRSA算法散列JSON内容。然后,使用客户端的RSA私钥对值进行签名以获得签名。为了获得更高的安全级别,RSA密钥对的长度必须为2048位。
1.4、通过Base64编码进行签名。
1.5、使用签名之后获得的字符串作为Signature参数值。与请求的json数据合并成整个API请求。
1.6、java端签名生成样例代码参考:(https://global.alipay.com/docs/ac/gr/signature#6a947849)
2、签名校验步骤
2.1、使用正则表达式而不是JSON对象,将完整的响应内容分为两部分,响应JSON字符串和签名字符串。
2.2、通过使用SHA256算法散列响应JSON字符串以获得消息摘要。
2.3、使用公钥进行解密签名到消息摘要。
2.4、比较在步骤2和步骤3中获得的两个消息摘要。如果摘要相同,则表明已签名的数据尚未更改。
2.5、java端签名校验样例代码参考:(https://global.alipay.com/docs/ac/gr/signature#895424b6)