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

原文链接: http://blog.csdn.net/shenggaofei/article/details/52022206

前言

一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商,阿里就是其中之一。 
《 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






猜你喜欢

转载自blog.csdn.net/gaiyindexingqiu/article/details/74633541