Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)
作者:xiong_it 发布时间:2022-03-14 01:12:28
一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商,阿里就是其中之一。
笔者在此总结了下阿里旗下支付宝Android SDK支付的接入流程,供后来者参考。
接入流程如下:
1 签约成为支付宝商户
签约地址:https://b.alipay.com/,
只有成为签约商户的开发者才能具备集成支付宝app支付的资格。
签约资料:1)营业执照 2)APP说明文档 3)商户经营信息、商户联系人等信息
必要时还需提供APP apk以备审核。审核通过后即可进行代码集成。
审核通过后,可得到支付宝分配的商户号等信息。
2 客户端代码集成准备
2.1 导入jar包资源
目前最新版支付宝开发jar包下载地址:http://xiazai.jb51.net/201611/yuanma/alipaySdk_jb51.jar
下载后将之拷贝libs目录,Eclipse会自动添加依赖,Android Studio需在app的gradle中添加一行
compile files('libs/alipaySdk-20160223.jar')
点击右上角:Sync Now,稍等片刻
2.2 修改AndroidManifest.xml清单
声明必要Activity
<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>
添加必要权限
<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" />
2.3 添加支付宝混淆规则
-libraryjars libs/alipaySDK-20160223.jar
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
3 客户端代码集成
流程图白话版解释
1.app携带支付信息调用支付接口请求支付宝客户端调起支付界面;
2.用户操作,输入密码支付,支付成功;直接返回取消支付;出现错误,支付失败;进入支付界面,但输入密码支付,支付待确认;
3.支付宝客户端将支付结果告诉app客户端,商户服务器通知app服务器支付结果;
4.app客户端处理支付结果;
5.app服务器处理支付结果。
支付宝的支付流程较之微信的支付流程图少了一步app服务器端订单的生成,但是在其demo代码中是推荐使用app服务器进行sign签名过程的,于是笔者索性是按照的微信支付的流程(微信支付交互流程)去集成的。
•客户端代码得到用户购买的商品信息,将之传给自己公司app服务器,参数包含但不限于以下:
params.put("money", payMoney);// 商品金额,单位:元
params.put("goodsname", goodsName);// 商品名称
注意:支付宝支付的人民币单位和微信支付,银联支付稍有不同,需以:元 作为支付单位。其他两者支付单位为:分
其他参数均交给咱们app服务器处理即可,详细参数请点击:https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103663&docType=1
•app服务器参考上述详细参数链接,得到sign(支付签名信息)字段并返回sign字段给手机客户端;
•手机客户端使用sign签名信息在非UI线程调起支付客户端进行支付;
用户操作:输入密码进行支付;返回键取消支付;进入支付界面,用户未进行支付,用户返回,待支付;网络无连接支付失败等;
•客户端得到支付结果;
•支付宝服务器异步通知咱们公司app服务器支付结果(服务器的工作,与客户端无关)
这样做的好处:签名逻辑在服务器完成,app无需暴露公钥和私钥,更安全。同时也是demo中的推荐做法。
更详细的支付宝接入交互流程解释请点击:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.7WO30X&treeId=59&articleId=103658&docType=1
4 客户端代码示例
支付调起代码(须在子线程)
new Thread() {
@Override
public void run() {
super.run();
PayTask payTask = new PayTask(mActivity);
String result = payTask.pay(signInfo, true);
Message message = mHandler.obtainMessage();
message.what = PAY_RESULT;
message.obj = result;
mHandler.sendMessage(message);
}
}.start();
支付处理代码(UI线程)
/*支付宝支付结果码*/
private static final String PAY_OK = "9000";// 支付成功
private static final String PAY_WAIT_CONFIRM = "8000";// 交易待确认
private static final String PAY_NET_ERR = "6002";// 网络出错
private static final String PAY_CANCLE = "6001";// 交易取消
private static final String PAY_FAILED = "4000";// 交易失败
/*内部类,处理支付宝支付结果*/
static class AliPayHandler extends Handler {
private SoftReference<PayActivity> activitySoftReference;// 使用软引用防止内存泄漏
public AliPayHandler(PayActivity activity) {
activitySoftReference = new SoftReference<PayActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
PayActivity activity = activitySoftReference.get();
AliPayResult payResult = new AliPayResult((String) msg.obj);
String resutStatus = payResult.getResultStatus();
Log.d(TAG, "statusCode = " + resutStatus);
if (resutStatus.equals(PAY_OK)) {
activity.paySuccessed();
} else if (resutStatus.equals(PAY_CANCLE)) {
activity.payCanceled();
} else if (resutStatus.equals(PAY_NET_ERR)) {
activity.payFailed(NETWORK_ERR);
} else if (resutStatus.equals(PAY_WAIT_CONFIRM)) {
activity.payWaitConfirm();
} else {
activity.payFailed(UNKNOW_ERR);
}
}
}
注:AliPayResult.Java来自支付宝demo中的PayResult.java
至此,集成支付宝SDK结束。祝各位集成支付宝支付成功!
结束语
app服务器接入注意事项:官方给出的填写rsa公钥的地址有误,无论填写什么都提示:公钥格式错误。需要移步至:支付宝公钥填写正确地址填写
按照惯例,附上支付宝SDK接入的官方demo下载链接:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1
来源:http://blog.csdn.net/xiong_it/article/details/51819559


猜你喜欢
- 发送邮件的主程序 import java.util.Properties; import common.util.Ema
- 写在前面:上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业 * 的软考证书,然后接下
- 说明:此头像类似微信群组头像,整个头像由组内前N位人员的头像组合而成,可用网络或本地图片进行组合,最终显示为一个头像整体,看效果图:一、自定
- 说起空间动态、微博的点赞效果,网上也是很泛滥,各种实现与效果一大堆。而详细实现的部分,讲述的也是参差不齐,另一方面估计也有很多大侠也不屑一顾
- 配置操作第一步操作如图:选择右侧的database页签,一般在idea的右边会有Database界面,点击它即可。有时候我们会发现这个Dat
- 本文实例讲述了Android实现给TableLayou绘制边框的方法。分享给大家供大家参考,具体如下:效果如下:思路:使用share作为背景
- 多文件上传就是改良一个方法把MultipartFile类换成CommonsMultipartFile类,因为上传多个文件用数组方式的话Mul
- 一.使用MSScriptControl 到微软的网站上下载Windows Script Control,它是一个ActiveX(R) 控件,
- 目录背景问题解决思路其他问题小结背景关于个人,前段时间由于业务太忙,所以一直没有来得及思考并且沉淀点东西;同时组内一个个都在业务上能有自己的
- 废话不多说,先看下实现后的效果:实现思路看到上边 gif 图的效果,主要列举一下实现过程过程中遇到的难点。如何使键盘弹出时候不遮挡底部登录布
- 以前也用过爬虫,比如使用nutch爬取指定种子,基于爬到的数据做搜索,还大致看过一些源码。当然,nutch对于爬虫考虑的是十分全面和细致的。
- 在Java开发中常用到For循环,它对简化业务处理,提高效率,非常有帮助。但要防止程序算法中可能导致死循环的情况,而且有的死循环还不好察觉。
- 本人工作有一个月多了。对于android很多东西,都有了新的了解或者说真正的掌握。为了让更多的像我这样的小白少走弯路,所以我会坚持将我在工作
- 前言自己android开发也有些年头了,每每回想起作为初学者的时候自己写的代码,自己会有种喷自己的冲动,代码写的太渣了。因此想着自己要总结下
- 废话不多说了,直接给大家贴代码了,具体代码如下所述:/*** 把一个View的对象转换成bitmap*/private Bitmap get
- 这篇文章主要介绍了springboot配置文件绑定实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 问题最近 Cordova 项目里有一个需求,这里需要从 assets 目录中读取文件,加载配置信息,并且代码中要用到。因为看到 gradle
- 今天的几个目标: 1. 自定义ActionProvider 2. Toolbar ActionBar自定义Menu 3. Toolbar A
- 1.配置多个数据源多个数据源是指在同一个系统中,用户数据来自不同的表,在认证时,如果第一张表没有查找到用户,那就去第二张表中査询,依次类推。
- intellj idea的强大之处就不多说了,相信每个用过它的人都会体会到,但是我们也会被他的复杂搞的晕头转向,尤其刚从eclipse转过来