前言
项目需要,需要在客户端集成支付宝接口。就研究了一下:因为使用支付宝接口,就需要到支付宝开发平台:注册帐号,到管理中心创建应用,申请审核通过后进入应用详情,配置相关参数。下面讲的是申请好之后的操作。登录成功之后,在开发平台的文档中心找到移动支付,点击DEMO下载,下载Android版资源。然后解压出来之后一般会得到三个文件夹。
这个时候要打开文件名为: 支付宝钱包支付接口开发包2.0标准版的文件。打开之后有一个Demo 文件。打开Demo文件。里面会有三个文件夹:第一个 openssl; 第二个 服务端 Demo,第三个 客户端demo. 这个时候,我们需要关心的是 openssl 文件与 客户端Demo 的文件。
Android 版的Demo宰你部署运行的时候,会发现不能支付成功。在项目主文件里面这样一段代码:
因为这些,都是需要根据商户注册的信息来填写的。所以就算下下载了Demo,没有正确配置,还是不能调起支付的。下面讲的就是如何获取支付所需的私钥与支付宝公钥。
私钥公钥生成
刚刚我们解压之后的openssl文件,获取私钥与公钥的方法就在里面:
首先打开openssl文件:以下是文件打开顺序: openssl–>bin –> 双击 openssl.exe文件。这个时候会出现一个命令框:(首先要说明的是这个文件是在Windows系统下打开的)要是苹果系统好像不行.接着继续往下说:
打开命令框后:输入第一行命令 ,生成私钥,如下:
按回车键,接着输入第二行命令,生成公钥:
按回车键,接着输入第三行命令,将RSA私钥转换成PKCS8格式
执行完这三行命令后,就生成了两个以:.pem 结尾的文件。这就是我们生成的公钥与私钥.文件位置就在: bin 目录下。当然我们打不开这两个文件。但是我们可以复制一份到桌面,改成Txt文件打开即可。因为我们需要的只是里面的字符串,记住当我们引用这两个长的字符串的时候,需要注意的是:字符串,不能包括,换行,空格,以及其他误加的字符。所以复制的时候一定要小心。
当然私钥就是我们需要的私钥了,如何获得支付宝公钥呢:回到支付宝开发平台,首先登录,
一: 点击“查看PID|KEY”,在新打开的页面,可查看到签约支付宝账号、合作者身份ID(PID)。
二:输入支付密码,查询key、支付宝公钥。
三:上传RSA公钥,在“合作伙伴密钥管理”下,点击“RSA加密”后的“添加密钥”,把自己的公钥复制进去。注意不能有空格,换行之类的。
四:点击确认上传,若是提示上传成功。则就是成功。
这个时候就可查看支付宝公钥了。如图:
至此,将对应的私钥与公钥填到我们的Demo的相应配置类中。按DEMO默认的本地订单信息和签名基本就可以运行了。
支付流程
首先我们看一下整个支付的流程图:
流程说明(以Android平台为例):
- ①第2步:调用支付接口:此消息就是本接口所描述的开发包提供的支付对象PayTask,将商户订单信息传进pay方法唤起支付宝收银台。
- ②第3步:手机支付宝支付开发包将会按照商户App提供的参数发送支付请求。
- ③第5步:异步发送支付通知:手机支付宝支付服务器端发送异步通知消息给商户服务器端。
- ④第7步:接口返回支付结果:商户应用客户端通过当前调用支付的Activity的Handler对象,通过它的回调函数获取支付结果。
数据交互
- ①构造订单数据并签名
商户客户端根据手机支付宝支付开发包的接口规则,通过程序生成得到签名结果及要传输给手机支付宝支付开发包的数据集合。签名相关的公私钥生成及配置规则,详情见官网PID和密钥管理。 - ②发送请求数据
把构造完成的数据集合传递给手机支付宝支付开发包。 - ③手机支付宝支付开发包对请求数据进行处理
手机支付宝支付开发包将请求数据根据业务规则包装后传递给支付宝服务端,服务端得到这些集合后,会先进行安全校验等验证,一系列验证通过后便会处理完成这次发送过来的数据请求。 - ④返回处理的结果数据
对于处理完成的交易,支付宝会以两种方式把数据分别反馈给商户应用和商户服务器。
1.在手机客户端上,开发包客户端直接把处理的数据结果反馈给商户客户端。
2.支付宝服务器主动发起通知,调用商户在请求时设定好的支付回调页面路径(参数notify_url,如果商户没设定,则不会进行该操作)。 - ⑤对获取的返回结果数据进行处理
商户在客户端同步通知接收模块或服务端异步通知接收模块获取支付宝返回的结果数据后,可以结合商户自身业务逻辑进行数据处理(如:订单更新、自动充值到会员账号中等)。同步通知结果仅用于结果展示,入库数据需以异步通知为准。
附加说明
支付过程中所需的订单信息和签名最好放在server端完成(这也是支付宝官方的建议),客户端通过请求server端数据,自己拼接orderInfo信息。这里要特别说明的是,orderInfo中的字段很多,一定要和server端的字段保持一致,不然客户端拿server端返回的签名调起支付的时候会报“服务器忙”,“订单信息错误”等信息,从而支付失败。
开发平台官网上创建的移动支付也需要填写应用的包名还有32位的MD5应用签名。不过我自己在开发的过程中验证发现,这个配置在实际支付中好像并没有用到,不像微信支付,你如果配置有误一定会导致支付失败。初步结论是支付宝并没有把这个信息纳入支付校验,不过出于严谨性考虑,建议开发的过程中准确配置各项参数。
最后强调一点,在实际开发中如果遇到问题,首先一定要去官网查找开发规范,不要首先想着去论坛获得帮助。官方文档肯定是最权威而且全面的,这样会少走很多弯路。