欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 支付宝SDK接入

程序员文章站 2022-05-30 08:17:38
...

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')
  • 1

点击右上角: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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

添加必要权限

<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" />
  • 1
  • 2
  • 3
  • 4
  • 5

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 *;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3 客户端代码集成

支付宝交互流程示意图 
Android 支付宝SDK接入

流程图白话版解释

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

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

  • 客户端代码得到用户购买的商品信息,将之传给自己公司app服务器,参数包含但不限于以下:
        params.put("money", payMoney);// 商品金额,单位:元
        params.put("goodsname", goodsName);// 商品名称
  • 1
  • 2

注意:支付宝支付的人民币单位和微信支付,银联支付稍有不同,需以:元 作为支付单位。其他两者支付单位为:分 
其他参数均交给咱们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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

支付处理代码(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);
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

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