Android集成支付宝支付功能

公司项目中需要支付功能,现在支付宝、微信支付很方便,也很多人使用,因此,他们是首选。在此记录一下支付宝集成过程,下期为微信支付,敬请期待

授人以鱼不如授人以渔

授人以鱼不如授人以渔

首先去支付宝官网下载其最新的Android的SDK集成Dmeo

将支付宝jar包添加项目中

  • alipaySdk-20160516.jar
支付宝SDK Demo

可以看到其主要的调用方法在PayDemoActivity类中,下面为主要支付调用方法:

        /**
         * 完整的符合支付宝参数规范的订单信息
         */
        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask(PayDemoActivity.this);
                // 调用支付接口,获取支付结果
                String result = alipay.pay(payInfo, true);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();

注意,我们需要异步发支付请求。可以看到他仅仅需要我们 传递好参数

  • 完整的符合支付宝参数规范的订单信息

这一步,我公司由服务器返回已经处理好的秘钥,我直接传递给支付宝即可

partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="测试"&body="测试测试"&total_fee="0.01"&notify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&sign="lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA"

请求后,我们讲获得返回值result

resultStatus={9000};memo={};result={partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="测试"&body="测试测试"&total_fee="0.01"&notify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&success="true"&sign_type="RSA"&sign="hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZgSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU="}

错误码

  • 9000 -> 订单支付成功
  • 8000 -> 正在处理中
  • 4000 -> 订单支付失败
  • 6001 -> 用户中途取消
  • 6002 ->网络连接出错

回调处理

@SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SDK_PAY_FLAG: {
                PayResult payResult = new PayResult((String) msg.obj);
                /**
                 * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
                 * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                 * docType=1) 建议商户依赖异步通知
                 */
                String resultInfo = payResult.getResult();// 同步返回需要验证的信息

                String resultStatus = payResult.getResultStatus();
                // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
                if (TextUtils.equals(resultStatus, "9000")) {
                    Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                } else {
                    // 判断resultStatus 为非"9000"则代表可能支付失败
                    // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
                    if (TextUtils.equals(resultStatus, "8000")) {
                        Toast.makeText(PayDemoActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();

                    } else {
                        // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
                        Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

                    }
                }
                break;
            }
            default:
                break;
            }
        };
    };

至此Android客户端集成支付宝已经完成,是不是So easey!

上面是支付宝Demo的代码,我自己写的时候做了优化,毕竟我们集成的支付插件不仅仅只有支付宝,因此需要写一个统一支付pay,在此基础上做好相应的封装,方便后续的拓展,在此说下我的封装思路。

  • 新建一个IPay借口,里面仅仅只有pay方法
  • 新建一个Pay实现IPay,重写pay方法,实现支付功能,在Pay里面,统一做网络请求操作,如需要从服务器获取==完整的符合支付宝参数规范的订单信息==,微信一样需要这样,因此可以在此类中统一做请求,获得返回值之后,根据调用支付类型,执行相应pay方法。
  • 当然也可以建立一个PayHelper 专门用于实现各个支付类型的pay方法,然后在Pay中调用,减少代码量
  • 我们要新建一个IPayResultCallBack接口,定义onSuccess、onFail方法,表示支付成功失败的回调
  • 新建一个抽象类PayResultCallBack实现IPayResultCallBack,讲onSuceess、onFail放到支付成功/失败相应中,表明支付成功、失败回调方法,到时调用pay方法是,即要传递实现好的回调类对象

支持基本一个可拓展的支付功能基本搭建完成,剩余的仅仅是需要一个一个集成其他支付功能,走的路子任然如此,一个pay,然后回调方法里面处理支付结果!!!

1、IPay

/**
 * 支付接口
 * Created by kingpeng on 16/5/19.
 */
public interface IPay {
    void pay(int payType,String orderInfo);
}

2、Pay

/**
 * 支付工具类
 * Created by kingpeng on 16/5/19.
 */
public class Pay implements IPay {
    private Activity mContext;
    private MyCallback mCallback = new MyCallback();
    private int mPayType;
    private PayHelper mPayHelper;
    private IPayResultCallback mPayResultCallback;

    public Pay(Activity context, IPayResultCallback payResultCallback) {
        mContext = context;
        mPayResultCallback = payResultCallback;
        mPayHelper = new PayHelper();
    }

    @Override
    public void pay(int payType, String orderInfo) {
        mPayType = payType;
        ReqParam param = new ReqParam();
        param.setAlertProgressDialog(mContext, true);
        param.put("orderInfo", orderInfo);
        param.put("payway", payType);
        RequestUtil.getInstance().postApi3(R.string.payment_app_require, param, mCallback);
    }

    /**
     * 支付宝支付
     *
     * @param payInfo
     */
    private void aliPay(final String payInfo) {
        mPayHelper.aliPay(mContext, payInfo, mPayResultCallback);
    }
    private class MyCallback extends ReqCallbackIml {
        @Override
        public void onSuccess(int action, String response) {
            switch (action) {
                case R.string.payment_app_require:
                    PayParseBean bean = (PayParseBean) GsonUtil.jsonToBean(response, PayParseBean.class);
                    if (bean != null && bean.errcode == 0) {
                        switch (mPayType) {
                            case 1:
                                //请求支付宝
                                aliPay(bean.signStr);
                                break;
                            case 2:
                                //ToDo 请求微信
                                break;
                        }
                    } else {
                        ToastUtils.showDefaultToastCenter(mContext.getApplicationContext(), "获取订单信息失败");
                    }
                    break;
            }
        }

        @Override
        public void onFail(int action, Throwable e) {
            ToastUtils.showDefaultToastCenter(mContext.getApplicationContext(), "获取订单信息失败");
        }
    }

3、PayHelper

/**
 * 支付帮助类
 * Created by kingpeng on 16/5/19.
 */
public class PayHelper {
    public PayHelper() {
    }

    /**
     * 支付宝支付
     *
     * @param activity
     * @param payInfo
     */
    public void aliPay(Activity activity, String payInfo, IPayResultCallback payResultCallback) {
        new AlipayTask(activity, payInfo, payResultCallback).execute();
    }

    private class AlipayTask extends AsyncTask<String, Integer, String> {
        private Activity mContext;
        private String mPayInfo;
        private IPayResultCallback mPayResultCallback;

        public AlipayTask(Activity context, String payInfo, IPayResultCallback payResultCallback) {
            super();
            mContext = context;
            mPayInfo = payInfo;
            mPayResultCallback = payResultCallback;
        }

        @Override
        protected String doInBackground(String... params) {
            // 构造PayTask 对象
            PayTask alipay = new PayTask(mContext);
            // 调用支付接口,获取支付结果
            String result = alipay.pay(mPayInfo, true);
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            mPayResultCallback.payResult(result, Constants.PAY_ALIPAY);
        }
    }

4、PayResultCallbackImpl

/**
 * 支付结果回调
 * Created by kingpeng on 16/5/19.
 */
public abstract class PayResultCallbackImpl implements IPayResultCallback {
    public void payResult(String result, int payType) {
        switch (payType) {
            case Constants.PAY_ALIPAY:
                aliPayResult(result, payType);
                break;
            case Constants.PAY_WX:
                wxPayResult(result, payType);
                break;
        }

    }
    /**
     * 支付宝支付结果
     *
     * @param result
     * @param payType
     */
    private void aliPayResult(String result, int payType) {
        PayResult payResult = new PayResult(result);
        /**
         * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
         * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
         * docType=1) 建议商户依赖异步通知
         */
        String resultInfo = payResult.getResult();// 同步返回需要验证的信息
        String resultStatus = payResult.getResultStatus();
        // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
        if (TextUtils.equals(resultStatus, "9000")) {
            onPaySuccess(result, payType);
        } else {
            // 判断resultStatus 为非"9000"则代表可能支付失败
            // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
            // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
            onPayFail(result, payType);
        }
    }

    /**
     * 支付成功
     *
     * @param result
     * @param payType
     */
    public abstract void onPaySuccess(String result, int payType);

    /**
     * 支付失败
     *
     * @param result
     * @param payType
     */
    public abstract void onPayFail(String result, int payType);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容