1.支付能力介绍:
支付宝的支付能力有当面付、手机网站支付转为Native支付、App支付和手机网站支付。线下当面付产品支持条码支付、扫码支付、声波支付,不在本次讨论之列。手机网站转native支付与手机网站支付的主要区别是:如果用户手机安装了支付宝App,手机网站转Native支付方式会跳转到支付宝App中进行订单支付,用户体验和支付成功率均优于手机网站支付方式。除此之外,还能使用手机网站支付没有提供的功能,例如:指纹支付、手环、手表支付、免密支付等。
2.App支付
【适用场景】适用于商家在App应用中集成支付宝支付功能。商家APP调用支付宝提供的SDK调用支付宝客户端内的支付模块,商家APP会跳转到支付宝中完成支付,支付完后跳回到商家APP内,最后展示支付结果。
目前支持手机系统有:iOS(苹果)、Android(安卓)。
这里注意,如果客户端没有支付宝App,那么就调起网页支付。
【接入步骤】创建应用并获取APPID、配置密钥、集成并配置SDK、调用接口。具体见https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.SG4ygV&treeId=193&articleId=105297&docType=1
支付宝的App支付和网站内支付需要首先在蚂蚁金服开发平台签约支付能力。
其中配置密钥比较重要,单独强调:
生成和配置的步骤:
https://doc.open.alipay.com/doc2/detail?treeId=200&articleId=105310&docType=1
配置的地方:
https://open.alipay.com/platform/detailApp.htm?appId=2016050601369602&tab=appSetting
【调用流程】
Android:
https://doc.open.alipay.com/doc2/detail.htm?treeId=204&articleId=105296&docType=1
iOS:
https://doc.open.alipay.com/doc2/detail.htm?treeId=204&articleId=105295&docType=1
第4步:调用支付接口:此消息就是本接口所描述的支付宝客户端SDK提供的支付对象PayTask,将商户签名后的订单信息传进payv2方法唤起支付宝收银台,交易数据格式具体参见请求参数说明。
partner=\"2088121902895429\"&seller_id=\"esstx_cd@163.com\"&out_trade_no=\"158629010\"
&subject=\"Z93\"&body=\"Z93\"&total_fee=\"13800.0\"
¬ify_url=\http://120.27.128.207:8080/cqyh/alipay/payNotify\
&service=\"mobile.securitypay.pay\"
&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"
&sign=\"NK0f20ZBWc4p7Ab5wUhJvnKeSpGZlHPvPcd8fSVwxTRty%2FqcDFRtrVr3D\"
&sign_type=\"RSA\"
第5步:支付请求:支付宝客户端SDK将会按照商户客户端提供的请求参数发送支付请求。第8步:接口返回支付结果:商户客户端在第4步中调用的支付接口,会返回最终的支付结果(即同步通知),参见客户端同步返回。
第13步:用户在支付宝APP或H5收银台完成支付后,会根据商户在手机网站支付API中传入的前台回跳地址return_url自动跳转回商户页面,同时在URL请求中附带上支付结果参数。同时,支付宝还会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统,详情见支付结果异步通知。
除了正向支付流程外,支付宝也提供交易查询、关闭、退款、退款查询以及对账等配套API。
特别注意:构造交易数据并签名必须在商户服务端完成,商户的应用私钥绝对不能保存在商户APP客户端中,也不能从服务端下发。
同步返回的数据,只是一个简单的结果通知,商户确定该笔交易付款是否成功需要依赖服务端收到支付宝异步通知的结果进行判断。
商户系统接收到通知以后,必须通过验签(验证通知中的sign参数)来确保支付通知是由支付宝发送的。建议使用支付宝提供的SDK来完成,详细验签规则参考异步通知验签。
同步通知验签:
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
3、校验通知中的seller_id(或者seller_email)是否为out_trade_no这笔单据对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明同步校验结果是无效的,只有全部验证通过后,才可以认定买家付款成功。
异步通知验签:
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email)是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),
4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
3.手机网站支付
【适用场景】适用于商家在移动端网页应用中集成支付宝支付功能。
商家在网页中调用支付宝提供的网页支付接口调起支付宝客户端内的支付模块,商家网页会跳转到支付宝中完成支付,支付完后跳回到商家网页内,最后展示支付结果。若无法唤起支付宝客户端,则在一定的时间后会自动进入网页支付流程。
【支付流程】
其他的操作类似
【注意事项】
1.网页版发起请求的时候,demo中是使用表单自动提交的方式,这样没问题也可以,但是为了和其他支付方式统一,最好将数据封装成json返回,然后在ajax的回调中再发起支付。如此,可以很方便地处理一些异常情况。
2.另外支付宝网页支付不能再微信环境使用。
3.支付宝App支付和网页支付的异步回调可以使用同一入口。
3.如果加密方式选择的是RSA方式,那么需要在支付宝商户后台配置openssl工具生成的公钥,自己保存私钥,往支付宝传输信息的时候用私钥加密,支付宝后台用公钥解密;获取到支付宝的公钥,支付宝后台用其私钥加密,我们用公钥解密。是两对公私钥。
参考资料:
蚂蚁金服开放平台官方资料
支付宝这种回调比较合理,请求之后返回一个success才不发,否则按照非幂等时间(隔1/2/4/8/16/32等)发起请求,这样可以一定程度上避免客户服务器响应太慢的问题。建行的就比较蛋疼,他不管你返回什么,直接连续发三次,如果这三次不行的话,客户服务器就收不到这个回调了。不管哪种方式,我们都需要验证该订单的状态,否则可能引发逻辑错误。比如订单状态已经到已发货,或者已经办理过充值这种业务了。