项目组支付宝商户审核通过,要准备接入支付宝移动支付的能力,本文主要讲述一下android接入支付宝移动支付SDK的步骤。
前期准备
- 支付宝商户网站注册支付宝商户账号。
- 签约
移动支付
产品,等到审核通过。 - 秘钥的生成与上传。
注册和签约没什么好说的,由公司相关部门或人员进行操作就好了。这里重点讲一下密钥。
秘钥的生成:
下载SDK资源压缩包,解压后,里面会有openssl的文件夹,里面有个openssl.exe
,双击运行。
输入如下指令生成私钥:
1 | genrsa -out rsa_private_key.pem 1024 |
java开发者
(否则跳过此步骤)需要转换成PKCS8格式,再输入如下指令进行转换:
1 | pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt |
可以看到下面的界面:右键点击openssl窗口上边边缘,选择“编辑→标记”,选中要复制的文字
,将PKCS8格式私钥复制下来,保存到一个文本中,后面会用到。
继续执行指令:
1 | rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem |
会得到公钥文本。
秘钥的上传:
登录支付宝商户账户,进入到我的商家服务
。
点击查询PID、KEY
,输入支付密码,进入到下面的页面:
记录下PID
。
点击RSA加密后面的添加密码
,这里我已经添加过,所以显示的查看秘钥。将生成步骤中生成的公钥文本粘贴进编辑框,点击保存,若显示上传成功
则代表成功。
接入SDK
- 将
alipaySDK-20160223.jar
jar包添加至项目中。 - 修改AndroidManifest.xml:至此,SDK接入已完成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<!-- 权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 当用户手机没有安装支付宝App时,会调用H5的页面进行支付,若不进行声明,则直接返回支付失败 -->
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
调用支付
在支付宝Demo中,已经有了很详细的说明了。我们只需要填入3个字段:PARTNER
、SELLER
、RSA_PRIVATE
。PARTNER
就是上面步骤记录的PID
,SELLER
即是支付宝账号,RSA_PRIVATE
就是记录的PKCS8格式私钥。
这里贴一下Demo代码吧:
1 | public class PayDemoActivity extends FragmentActivity { |
代码中有个注释需要特别注意:特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
至此,整个集成就已经结束了,不得不说,支付宝的官方文档比微信好多了,哈哈~
补充
正式项目中需要将签名逻辑放在服务端,在我与服务端进行联调时,出现了很多问题,这里说几点:
- 服务端若是使用的是java,则使用PKCS8格式的秘钥,否则使用非PKCS8格式的秘钥。
- 请求参数可以无序,但是必须保证请求的参数与待签名参数的顺序一致。(非常坑,花了半天时间跟服务端联调才找到这个问题)