微信支付参考:android微信支付详解与坑
官方文档:App支付Android集成流程

好久之前写过支付一直没做个总结,再次重温,小结一下。

gradle配置:

app module下的build.gradle下手动添加依赖,如下代码所示:

dependencies {    ...... compile files('libs/alipaySdk-20170922.jar')    ......}

修改Manifest

在商户应用工程的AndroidManifest.xml文件里面添加声明:

 
和权限声明:

添加混淆规则

在商户应用工程的proguard-project.txt里添加以下相关规则:

-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 *;}-keep class com.alipay.sdk.app.H5PayCallback {    ;    ;}-keep class com.alipay.android.phone.mrpc.core.** { *; }-keep class com.alipay.apmobilesecuritysdk.** { *; }-keep class com.alipay.mobile.framework.service.annotation.** { *; }-keep class com.alipay.mobilesecuritysdk.face.** { *; }-keep class com.alipay.tscenter.biz.rpc.** { *; }-keep class org.json.alipay.** { *; }-keep class com.alipay.tscenter.** { *; }-keep class com.ta.utdid2.** { *;}-keep class com.ut.device.** { *;}

至此,开发包开发资源导入完成。

支付接口调用

需要在新线程中调用支付接口。(可参考alipay_demo实现)

PayTask对象主要为商户提供订单支付、查询功能,及获取当前开发包版本号。
获取PayTask支付对象调用支付(支付行为需要在独立的非ui线程中执行),代码示例:

//订单签名后的信息(服务器返回的数据)final String orderInfo = "app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA2×tamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D";   // 订单信息        Runnable payRunnable = new Runnable() {            @Override            public void run() {                PayTask alipay = new PayTask(MainActivity.this);                Map result = alipay.payV2(orderInfo, true);                Message msg = new Message();                msg.what = SDK_PAY_FLAG;                msg.obj = result;                mHandler.sendMessage(msg);            }        };        // 必须异步调用        Thread payThread = new Thread(payRunnable);        payThread.start();
参数名称 参数说明
String orderInfo app支付请求参数字符串,主要包含商户的订单信息,key=value形式,以&连接。
boolean isShowPayLoading 用户在商户app内部点击付款,是否需要一个loading做为在钱包唤起之前的过渡,这个值设置为true,将会在调用pay接口的时候直接唤起一个loading,直到唤起H5支付页面或者唤起外部的钱包付款页面loading才消失。(建议将该值设置为true,优化点击付款到支付唤起支付页面的过渡过程。)

orderStr示例如下,参数说明见"请求参数说明",orderStr的获取必须来源于服务端:

app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA2×tamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D

返回值: 本方法调用的返回结果,参数说明见"客户端同步返回参数说明"。

支付结果获取和处理

调用pay方法支付后,将通过2种途径获得支付结果:

同步返回
商户应用客户端通过当前调用支付的Activity的Handler对象,通过它的回调函数获取支付结果。(可参考alipay_demo实现)
代码示例:

private Handler mHandler     = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {                case SDK_PAY_FLAG: {                    PayResult payResult = new PayResult((Map) msg.obj);                    /**                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。                     */                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息                    String resultStatus = payResult.getResultStatus();                    // 判断resultStatus 为9000则代表支付成功                    if (TextUtils.equals(resultStatus, "9000")) {                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。                        Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();                    } else {                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。                        Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();                    }                    break;                }            }        }        ;    };

异步通知
商户需要提供一个http协议的接口,包含在请求支付的入参中,其key对应notify_url。支付宝服务器在支付完成后,会以POST方式调用notify_url传输数据。

微信支付&支付宝支付

怎么将两个封装到一个页面使用,支付宝是Handler 回调(可以写在任意的地方)。微信是WXPayEntryActivity回调,(位置固定)

方式一,既然支付宝回调可以任意写,直接写在WXPayEntryActivity,从而实现一个页面
方式二,微信的封装个回调接口,通过接口回传数据,可参考Android支付封装(微信+支付宝)

更多相关文章

  1. Android canvas clip 参数解释
  2. ANDROID多点触控API接口的使用
  3. Android SQLite的ORM接口实现(一)---findAll和find的实现
  4. build.prop生成及参数解析
  5. Android aidl接口远程调用
  6. Android NestedScrolling解决滑动冲突问题(1) - 相关接口
  7. Android shape实现订单卡片制作(shape画半圆及矩形圆角、渐变、虚

随机推荐

  1. 图解YU12、I420、YV12、NV12、NV21、YUV4
  2. Android数据存储方式:SharePreference、SQ
  3. Android学习笔记: Android动画特效
  4. BaseRecyclerViewAdapterHelper
  5. android 关于自定义Application的使用
  6. Android APK文件在电脑上面运行方法
  7. Android中数据存储----SQLite数据库
  8. Android屏幕密度(Density)和分辨率的关系
  9. Android = Java
  10. Android中解决图像解码导致的OOM问题