我写这篇博客,旨在帮助大家在接上支付宝app支付功能时,可以少走弯路,并非单纯地看这篇博文就可以实现app支付功能。大部分还是需要大家根据支付宝官方文档进行开发的。
app支付的介绍
支付宝的app支付,是支付宝2016年8月新推出的一种新型的移动支付方式。相对应的老版本叫“移动支付”。以下我罗列几点,app支付与移动支付的区别:
- 请求网关不一样
移动支付请求支付宝的网关地址为:https://mapi.alipay.com/gateway.do;
App支付请求支付宝的网关地址为:https://openapi.alipay.com/gateway.do; - 签名方式
移动支付仅支持RSA签名方式,App支付支持RSA和RSA2两种签名方法。 - 商户公钥上传入口不一样
移动支付:在“mapi网关产品密钥”入口上传并获取支付宝公钥;
App支付:在“开放平台密钥”入口上传并获取支付宝公钥; - 移动支付暂不支持沙箱环境联调;App支付目前支持Android版沙箱联调(测试环境)
- 移动支付接口产生的交易,可以通过app支付的查询接口(alipay.trade.query)进行查询。但是可能会缺少receipt_amount等信息。如果想通过app支付查询接口(alipay.trade.query)进行查询,必须从移动支付接口升级改签为app支付接口(改签方法可以参见 app支付签约)。
- 移动支付改签到app支付,原移动支付的退款接口会失效!如果您希望延用原来的移动支付退款接口(refund_fastpay_by_platform_nopwd,refund_fastpay_by_platform_pwd)请联系您的业务经理签约即时到账无密退款的产品,如果没有可联系的支付宝业务经理,请直接使用的新的退款接口(alipay.trade.refund)来替代原来的老退款接口!
开发流程
创建应用,在开放平台的“开发者中心”里,创建一个应用,并签约app支付功能。获取应用的APPID。
登录蚂蚁金服开放平台 www.ant-open.com –> 开发文档 –> app支付
既有比较完成的app支付开发流程。相应的文档都可以从这里下载到。
如:支付宝logo素材、客户端SDK及DEMO、密钥工具……使用密钥工具生成RSA2一对私钥和公钥;
将公钥上传至创建应用中的 RSA2(SHA256)密钥上;app支付推荐使用RSA2;将公钥上传之后,会获取相应的 “支付宝公钥”;在这里需要注意,旧版本的移动支付,所有的支付宝公钥都是一样的,而app支付则不是; 新建文件将支付宝公钥保存下来,后面代码中将会用 私钥对参数进行签名,而在回调函数中,使用支付宝公钥对返回的结果进行验签; 建议大家在使用私钥和支付宝公钥时,不要直接在代码中显示,利用I/O的方法读取文件获取较为安全;另外需要提醒的是,某些签名和验签的方法,可能需要要求私钥和公钥有一定的开始和结束标识,不然会报错:-
参数
在新版的支付中,支付宝为java、php、.NET三门语言做了支持,也就是提供了相应的SDK,直接将相应的参数传进去,再进行签名、验签等工序即可;
但当时我开发的时候使用的是node,所以这一切的操作都将自己实现;
请求参数的说明:里面具有非常详细的说明,但是由于参数繁多,非常容易出错;大家都需要仔细再仔细;我给大家罗列一下比较容易出错的地方:- 业务参数biz_content里面,不需要排序,并且只能够使用字符串,即价格虽然是数字,也需要用“”引起来;
- 注意不要传空字段;必要的参数一定要有,非必要的参数若为空,就别传了;
- 排序签名后,sign参数直接拼在最后面,无须对sign进行排序;
- 解签的时候,需要将sign_type和sign去掉之后,再对其余参数进行decode,排序、使用支付宝公钥解签;
- 沙箱环境只至此android,不需要创建应用也能使用,沙箱环境有相对应的网关、appid、pid等,也需要将公钥上传至沙箱环境上;最需要注意的是,在支付接口前,一定要调用EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);