Android App支付:支付宝SDK接入详细指南(附官方支付demo)

来源:互联网 发布:义隆单片机 编辑:程序博客网 时间:2024/05/16 12:17
 

Android App支付:支付宝SDK接入详细指南(附官方支付demo)

前言

一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商,阿里就是其中之一。 
继《 Android App支付系列(一):微信支付接入详细指南》之后,有部分来自郭霖大神公众号:guolin_blog 的读者,和博客读者反馈,希望写一篇支付宝app支付sdk的接入博文。 
笔者在此总结了下阿里旗下支付宝Android SDK支付的接入流程,供后来者参考。

本篇文章已授权微信公众号 guolin_blog(郭霖)独家发布.

接入流程如下:

1 签约成为支付宝商户

签约地址:https://b.alipay.com/, 
只有成为签约商户的开发者才能具备集成支付宝app支付的资格。 
签约资料:1)营业执照 2)APP说明文档 3)商户经营信息、商户联系人等信息 
必要时还需提供APP apk以备审核。审核通过后即可进行代码集成。

审核通过后,可得到支付宝分配的商户号等信息。

2 客户端代码集成准备

2.1 导入jar包资源

目前最新版支付宝开发jar包下载地址:http://download.csdn.net/detail/xiong_it/9566771 
下载后将之拷贝libs目录,Eclipse会自动添加依赖,Android Studio需在app的gradle中添加一行

<code class="language-Groovy hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">compile <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">files</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'libs/alipaySdk-20160223.jar'</span>)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

点击右上角:Sync Now,稍等片刻

2.2 修改AndroidManifest.xml清单

声明必要Activity

[java] view plain copy
  1. <activity  
  2.             android:name="com.alipay.sdk.app.H5PayActivity"  
  3.             android:configChanges="orientation|keyboardHidden|navigation"  
  4.             android:exported="false"  
  5.             android:screenOrientation="behind" >  
  6. </activity>  
  7. <activity  
  8.             android:name="com.alipay.sdk.auth.AuthActivity"  
  9.             android:configChanges="orientation|keyboardHidden|navigation"  
  10.             android:exported="false"  
  11.             android:screenOrientation="behind" >  
  12.  </activity>  

添加必要权限

[java] view plain copy
  1. <uses-permission android:name="android.permission.INTERNET" />  
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  4. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  


2.3 添加支付宝混淆规则

[java] view plain copy
  1. -libraryjars libs/alipaySDK-20160223.jar  
  2.   
  3. -keep class com.alipay.android.app.IAlixPay{*;}  
  4. -keep class com.alipay.android.app.IAlixPay$Stub{*;}  
  5. -keep class com.alipay.android.app.IRemoteServiceCallback{*;}  
  6. -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}  
  7. -keep class com.alipay.sdk.app.PayTask{ public *;}  
  8. -keep class com.alipay.sdk.app.AuthTask{ public *;}  

3 客户端代码集成

支付宝交互流程示意图 
支付宝交互流程图

流程图白话版解释

  1. app携带支付信息调用支付接口请求支付宝客户端调起支付界面;
  2. 用户操作,输入密码支付,支付成功;直接返回取消支付;出现错误,支付失败;进入支付界面,但输入密码支付,支付待确认;
  3. 支付宝客户端将支付结果告诉app客户端,商户服务器通知app服务器支付结果;
  4. app客户端处理支付结果;
  5. app服务器处理支付结果。

支付宝的支付流程较之微信的支付流程图少了一步app服务器端订单的生成,但是在其demo代码中是推荐使用app服务器进行sign签名过程的,于是笔者索性是按照的微信支付的流程(微信支付交互流程)去集成的。

  • 客户端代码得到用户购买的商品信息,将之传给自己公司app服务器,参数包含但不限于以下:
[java] view plain copy
  1. params.put("money", payMoney);// 商品金额,单位:元  
  2.      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 客户端代码示例

支付调起代码(须在子线程)

[java] view plain copy
  1. new Thread() {  
  2.                @Override  
  3.                public void run() {  
  4.                    super.run();  
  5.                    PayTask payTask = new PayTask(mActivity);  
  6.                    String result = payTask.pay(signInfo, true);  
  7.                    Message message = mHandler.obtainMessage();  
  8.                    message.what = PAY_RESULT;  
  9.                    message.obj = result;  
  10.                    mHandler.sendMessage(message);  
  11.                }  
  12.            }.start();  


支付处理代码(UI线程)

[java] view plain copy
  1. /*支付宝支付结果码*/  
  2.    private static final String PAY_OK = "9000";// 支付成功  
  3.    private static final String PAY_WAIT_CONFIRM = "8000";// 交易待确认  
  4.    private static final String PAY_NET_ERR = "6002";// 网络出错  
  5.    private static final String PAY_CANCLE = "6001";// 交易取消  
  6.    private static final String PAY_FAILED = "4000";// 交易失败  
  7.   
  8.    /*内部类,处理支付宝支付结果*/  
  9.    static class AliPayHandler extends Handler {  
  10.        private SoftReference<PayActivity> activitySoftReference;// 使用软引用防止内存泄漏  
  11.   
  12.        public AliPayHandler(PayActivity activity) {  
  13.            activitySoftReference = new SoftReference<PayActivity>(activity);  
  14.        }  
  15.   
  16.        @Override  
  17.        public void handleMessage(Message msg) {  
  18.            super.handleMessage(msg);  
  19.            PayActivity activity = activitySoftReference.get();  
  20.   
  21.            AliPayResult payResult = new AliPayResult((String) msg.obj);  
  22.            String resutStatus = payResult.getResultStatus();  
  23.            Log.d(TAG, "statusCode = " + resutStatus);  
  24.   
  25.            if (resutStatus.equals(PAY_OK)) {  
  26.                activity.paySuccessed();  
  27.            } else if (resutStatus.equals(PAY_CANCLE)) {  
  28.                activity.payCanceled();  
  29.            } else if (resutStatus.equals(PAY_NET_ERR)) {  
  30.                activity.payFailed(NETWORK_ERR);  
  31.            } else if (resutStatus.equals(PAY_WAIT_CONFIRM)) {  
  32.                activity.payWaitConfirm();  
  33.            } else {  
  34.                activity.payFailed(UNKNOW_ERR);  
  35.            }  
  36.        }  
  37.    }  

注:AliPayResult.Java来自支付宝demo中的PayResult.Java 
至此,集成支付宝SDK结束。祝各位集成支付宝支付成功!

结束语

本文作者:xiong_it,本文链接:http://blog.csdn.net/xiong_it/article/details/51819559 
app服务器接入注意事项:官方给出的填写rsa公钥的地址有误,无论填写什么都提示:公钥格式错误。需要移步至:支付宝公钥填写正确地址填写

udpate 20160714 
近期登录开发平台,发现已改版,在原址填写rsa公钥即可.请各位知悉.

按照惯例,附上支付宝SDK接入的官方demo下载链接:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信号手机号码换了怎么办 起诉以后没有被告人住址怎么办 农村老人走丢了怎么办 读在职博士工作单位不支持怎么办 两证合一后国税怎么办 杭州的发票丢了怎么办 小车登记证丢了怎么办 个体户地税逾期未申报怎么办 公司社保本丢了怎么办 社保红本子掉了怎么办 三证合一后逾期怎么办 个体执照没办国税地税怎么办 丰巢APP注册没工牌号怎么办 农业银行k宝证书过期怎么办 个体户网上申报税没定期怎么办 遇到不给开票的商户怎么办 奶茶店电脑下单怎么办 个体户营业执照注销怎么办清税业务 注册公司没有办公地点怎么办 变更莒业执照法人怎么办手续 欠了几十万贷款怎么办 杭州公司跨区迁址怎么办 公司同市内跨区迁址怎么办 合同写错了字怎么办 农行卡转工行卡怎么办 外地人在北京交社保退休怎么办 身份证掉了单位宿舍怎么办居住证 广州租住单位宿舍怎么办居住证 公司u盾丢了怎么办 北京办了居住卡怎么办延期 商铺被陌生人注册左公司怎么办 营业执照年检登录密码忘了怎么办 欠人家钱没钱还怎么办 欠钱实在没钱还怎么办 党关系丢了10年怎么办? 离婚后生孩子怎么办出生证明 注册公司没有注册地址怎么办 银行流水不够2倍怎么办 个体户小店怎么办五险 姓和名五行相克怎么办? 三星s7刷机后计算器没有了怎么办