前言

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

Android App支付系列(一):微信支付接入详细指南(附官方demo)
Android开发:使用EasyPay打造全能移动支付框架:集成微信,支付宝,银联支付的开源支付框架

本篇文章已授权微信公众号 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中添加一行

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 activitySoftReference;// 使用软引用防止内存泄漏        public AliPayHandler(PayActivity activity) {            activitySoftReference = new SoftReference(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结束。祝各位集成支付宝支付成功!

结束语

本文作者: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

更多相关文章

  1. 【Android】Android的与服务器端传送信息使用JSON类-JSONObject
  2. Android(安卓)App集成支付宝
  3. android推送服务overview
  4. Android客户端与服务器端的json数据交互(很详细)
  5. 超级简单!Android旧手机也能搭建http服务器ksweb
  6. Android支付宝微信银联等底部弹窗dialog(源码分析+例子)
  7. Android平台上关于IM的实践总结
  8. Android(安卓)集成微信支付和支付宝支付工具类
  9. Android(安卓)Native进程间通信实例—Socket本地通信服务端进程

随机推荐

  1. android sdk更新失败解决办法
  2. Android(安卓)7.1 触摸事件代码跟踪
  3. android 开发积累
  4. Android(安卓)屏幕滑动事件
  5. android 软件源码
  6. android IOS webview word document
  7. android中使用HTTP协议和TCP协议实现上传
  8. Android深入浅出之Audio第三部分Audio Po
  9. unity向android通信
  10. android 自定义 view