alipay--- Android 集成支付宝SDK实现快捷支付--详解

Android 开发之Android 应用程序如何调用支付宝接口:https://software.intel.com/zh-cn/blogs/2015/03/05/android-android


公司最近要在项目中加入购物车功能,提到购物车那就自然少不了支付宝的身影啦。下面我们就来探讨一下如何在Android快速集成支付宝SDK。

支付宝的SDK目前已经更新到了2.0版本,这次的SDK相比上个版本的SDK来说,代码更佳简洁了,集成起来更加的方便快捷。

摘要:准备工作

如果是在公司开发,可以让相关部门和支付宝签约,申请一个卖家支付宝账号,可能要审核3-5个工作日,审核通过后支付宝会以邮件或者电话的方式提醒你的,所以不要担心什么时候才能审核通过。

1:下载支付宝官方SDK

https://b.alipay.com/order/techService.htm

打开上面链接,下载下面画红线部分的SDK,不要下载错了,下面是列出了支付宝SDK支持支付的各种方式


下载完成解压之后会得到如下的结构目录


打开移动支付接口SDK2.0标准版,找到DEMO下面的客户端demo下面的支付宝移动支付Android版,解压之后的目录结构如下


alipay-sdk-common中是我们要使用到的jar文件,alipay_demo是官方提供的demo(该demo并不能直接运行,要自己重新配置)

2:在我们强大的eclipse中新建一个项目,然后在清单文件中加入如下授权


在将我们上面alipay-sdk-common中的三个jar文件拷贝到我们项目下的libs目录下,结构图如下


下面我们就可以用代码实现啦

3:代码实现

这里直接使用官方提供的布局文件啦,(*^__^*) 嘻嘻……


点击支付时 我们就直接调用支付宝相关接口进行支付,点击检查账户时就是检查当前环境下是否有可用的支付宝账号,可有可无。


上面贴出来的代码就是调用支付宝的核心代码,我们在依次来看下其中的各个方法

第83行的getOrderInfo


该方法中有两个参数,我们这里要说明一下,第一个是第157行的合作者身份ID(PARTNER)这个参数是我们在支付宝账号审核通过之后登陆支付宝后点击点击获取PID/key

之后,支付宝给我们分配的

https://b.alipay.com/order/techService.htm   如下图红色部分



第二个就是第160行的卖家支付宝账号,这个没啥说的,就是我们申请的支付宝账号。

第三个是第170行的服务器异步通知页面路径,首先我们用支付宝支付之后,支付宝会返回给我们两个通知,一个是同步的,就是我们点击支付后支付宝直接反馈给我们客户端的信息,我们可以直接拿到,根据反馈的结果可以初步判定该次交易是否成功,第二个就是服务器异步的通知,这个异步的通知是支付宝的服务器端发给我们服务器端的信息,我们在客户端是直接获取不了的,那支付宝的服务器怎么知道我们服务器的路径呢,那就是这参数的作用了,我们给支付宝服务器一个路径,它就会在订单状态改变的时候给我们服务器端一个反馈,告诉服务器这次交易的状态,如果服务器结果判定该次交易成功了,就必须返给支付宝服务器一个success,要不服务器会一直给我们异步通知,因为它不知道该次交易是否完成了(一般情况下25小时内8次通知,频率一般是2m 10m 10m 1h 2h 6h 15h),我们一般会在收到异步通知时,对订单的状态进行更新。

还有一个就是162行的getOutTradeNo方法,这个方式就是生成一个唯一的订单号


讲完了这个方法里面的参数,我们回过头来看下我们的支付方法,在支付方法第84行我们可以看到

String sign = sign(orderInfo);

那么这个sign方法里又干了些什么呢,下面我们就来看下


可以看出这个方法非常简单,就一行代码,那这个SignUtils又是什么呢 ,这个是支付宝SDK中提供给我们的一个工具类,可以在官方的demo中找到,代码我就不贴出来了

我们可以看到这个方法中有一个RSA_PRIVATE 这个是什么东西呢,这个东西就是我们生成的商户的私钥,下面我们来看下该如何生成他呢

我们将下载好的SDK解压后在DEMO文件下会看到openssl文件夹,打开它目录下面的bin文件夹,然后运行openssl.exe文件,如下图


输入“genrsa -out rsa_private_key.pem 1024”命令,回车后,在当前bin文件目录中会新增一个rsa_private_key.pem文件,其文件为原始的商户私钥(请妥善保存该文件,PHP开发语言中需要使用该文件),以下为命令正确执行截图:


输入“rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem”命令回车后,在当前bin文件目录中会新增一个rsa_public_key.pem文件,其文件为原始的商户公钥(请妥善保存该文件,PHP开发语言中需要使用该文件),以下为命令正确执行截图:


输入命令“pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt”并回车,生成PKCS8编码的私钥


右键点击openssl窗口上边边缘,选择“编辑→标记”,选中要复制的文字


以上白色部分的内容就是我们上面说的RSA_PRIVATE 这个参数的值,注意着个值在eclipse中时不能有换行,不能有空格,必须一行显示完全

下面还有非常重要的一步就是要将上传商户公钥,我们要将上面生成的商户公钥上传,

上传地址需要登录



点击查看密钥,因为我这里已经上传过了,所以是查看,


然后点击保存,我这里是修改,然后在点击查看支付宝公钥,这里的公钥就是我们程序里的RSA_PUBLIC


上面两句直接在activity中声明即可。

支付主方法中第86行的getSignType方法如下


点击检查账户执行下面逻辑


然后我们定义一个handler来处理请求




接入支付宝出现交易订单处理失败,请稍后再试(ALI64)的错误

接入第三方平台的时候,有时虽然按照文档来做,但是总是还会有各种各样的问题。

上次在接入支付宝的时候就碰到了交易订单处理失败,请稍后再试(ALI64)这样的错误,后来经过排查和总结,一般来讲这种问题都是公钥和私钥没有正确配置造成的。支付宝这边为了保证数据在传输时不被篡改,使用了rsa这种非对称的加密方式。大概的流程如下:

支付宝交互数据流程

支付宝交互数据流程

理解这种流程后,因为支付宝的密钥我们是看不到,需要检测我们自己的公钥和密钥,还有支付宝的公钥。下面列一下自己在实际中碰到的问题。

公钥不是一行

实际中的话,我们下载支付宝的公钥,可以看到公钥是一行的。常见的格式都有带BEGIN PUBLIC KEY、END PUBLIC KEY这样的字眼:

-----BEGIN PUBLIC KEY——
 ......
 -----END PUBLIC KEY——

这里需要把自己的公钥调整为一行,删除换行、头尾begin、end行。

公钥没有传到支付宝服务器

这个有时会忘记掉,因为支付宝要用我们的公钥解开我们传递到支付宝的数据,所以需要将我们自己的公钥上传到支付宝服务器,记的搞成一行。另外还有一个要注意的是,可以传公钥的地方都可以传一下。如下图合作伙伴密钥管理、开放平台密钥管理、无线产品密钥管理都需要传一下。我估计这三个是用在不同的业务上。

上传公钥到支付宝

上传公钥到支付宝

私钥格式不对

私钥的格式有多种,如:pem、pkcs、der等格式,不同的程序语言在处理上需要的格式不一样,php处理用openssl_get_privatekey需要pem格式,java可以处理pkcs格式。这方面稍微注意下。

上面说到公钥和和私钥的问题,支付宝有提供一个工具可以用来检测,上次我们也是通过这个工具才检测出是私钥格式不对造成的。

这里附上生成公钥,密钥的方式

用openssl工具生成:

生成私钥pem

$ openssl genrsa -out rsa_private_key.pem 1024

此时会在当前目录生成rsa_private_key.pem文件,php私钥就是用这个文件。

生成公钥

$ openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

此时会在当前目录生成rsa_public_key.pem文件,这个就是公钥文件,上传到淘宝的就是这个,注意去除掉换行、头和尾的begin和end。

如果你需要使用pkcs8格式,可以按照如下生成:

$ openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

注意把输出的文件保存下来,就是pkcs8格式,淘宝提供java工具校验密钥和公钥是否配对,就是使用这个格式来进行检测。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值