Android支付封装(微信+支付宝)

作者: 流水潺湲 | 来源:发表于2018-02-02 18:19 被阅读1022次

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

    做过支付的人都知道,微信支付回调的是Activity,支付宝是Handler
    一般在开发过程中许多地方都有用到支付(特别是电商的APP),如果每次都写个回调会显得代码冗余繁琐,再次我将支付封装到工具类直接使用,只需要对应的参数。

    先来看看怎么使用呢

    一、Activity中实现PayResultListener 接口

    ··· Activity  implements PayResultListener {···
    
    
       @Override
        public void onPaySuccess() {
            showMessage("支付成功");
        }
    
        @Override
        public void onPayError() {
            showMessage("支付失败");
        }
    
        @Override
        public void onPayCancel() {
            showMessage("取消");
        }
    
    }
    
    

    在OnCreateh中添加接口

    
    PayListenerUtils.getInstance(this).addListener(this);
    

    在onDestroy中销毁

    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            PayListenerUtils.getInstance(this).removeListener(this);
        }
    

    二、使用

    微信支付

       PayUtils.getInstance(this).pay(PayUtils.PAY_TYPE_WX, "传入服务器获取的签名字段");
    

    支付宝支付

        PayUtils.getInstance(this).pay(PayUtils.PAY_TYPE_ALI, "传入服务器获取的签名字段");
    

    三、具体封装

    首先呢,封装个接口,用于返回支付状态的

    /**
     * Author: syhuang
     * Date:  2018/2/2
     * 支付返回结果
     */
    
    public interface PayResultListener {
        public void onPaySuccess();
    
        public void onPayError();
    
        public void onPayCancel();
    }
    
    

    通过管理类管理接口

    public class PayListenerUtils {
    
        private static PayListenerUtils instance;
        private        Context          mContext;
    
        private final static ArrayList<PayResultListener> resultList = new ArrayList<>();
    
    
    
    
        private PayListenerUtils(Context context) {
            this.mContext = context;
            //TODO
    
        }
    
        public synchronized static PayListenerUtils getInstance(Context context) {
            if (instance == null) {
                instance = new PayListenerUtils(context);
            }
            return instance;
        }
    
        public void addListener(PayResultListener listener) {
            if (!resultList.contains(listener)) {
                resultList.add(listener);
            }
        }
    
        public void removeListener(PayResultListener listener) {
            if (resultList.contains(listener)) {
                resultList.remove(listener);
            }
        }
    
        public void addSuccess() {
            for (PayResultListener listener : resultList) {
                listener.onPaySuccess();
            }
        }
    
        public void addCancel() {
            for (PayResultListener listener : resultList) {
                listener.onPayCancel();
            }
        }
    
        public void addError() {
            for (PayResultListener listener : resultList) {
                listener.onPayError();
            }
        }
    }
    

    接下来主要封装支付的工具类,以后在使用的过程中直接采用工具类即可。

    
    
    public class PayUtils {
        private static      String TAG          = PayUtils.class.getSimpleName();
        /**
         * 支付类型
         */
        public static final int    PAY_TYPE_WX  = 1;
        public static final int    PAY_TYPE_ALI = 2;
        /**
         * 支付宝返回参数
         */
        final static        int    SDK_PAY_FLAG = 1001;
    
        private static PayUtils instance;
        private static Context  mContext;
        private static Activity mActivity;
    
        private PayUtils() {
        }
    
        public static PayUtils getInstance(Context context) {
            if (instance == null) {
                instance = new PayUtils();
            }
            mContext = context;
            mActivity = (Activity) mContext;
            return instance;
        }
    
        public static void pay(int payType, String result) {
            switch (payType) {
                case PAY_TYPE_WX:
                    //微信
                    toWXPay(result);
                    break;
                //
                case PAY_TYPE_ALI:
                    toAliPay(result);
                    break;
            }
        }
    
    
        /**
         * 微信支付
         *
         * @param result
         */
        private static void toWXPay(String result) {
            //result中是重服务器请求到的签名后各个字符串,可自定义
            //result是服务器返回结果
            PayReq request = new PayReq();
            request.appId = "wxfe2fa2f264353d7d3";
            request.partnerId = "1494934532";
            request.prepayId = "wx201802011023453926020588351720";
            request.packageValue = "Sign=WXPay";
            request.nonceStr = "4cdCo3o4453xhGPpv";
            request.timeStamp = System.currentTimeMillis() / 1000 + "";
            request.sign = "F8A42CF827345377A34646ADD9E321FAB4";
            boolean send = getWxapi().sendReq(request);
        }
    
    
        /**
         * 支付宝
         */
        private static void toAliPay(String result) {
            //result中是重服务器请求到的签名后字符串,赋值,此处随便写的
    
            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&timestamp=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(mActivity);
                    Map<String, String> result = alipay.payV2(orderInfo, true);
                    Message msg = new Message();
                    msg.what = SDK_PAY_FLAG;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
    
                    Log.i(TAG, "aliresult--->" + result);
                }
            };
            // 必须异步调用
            Thread payThread = new Thread(payRunnable);
            payThread.start();
        }
    
        /**
         * 支付宝状态
         * 9000 订单支付成功
         * 8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
         * 4000 订单支付失败
         * 5000 重复请求
         * 6001 用户中途取消
         * 6002 网络连接出错
         * 6004 支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
         * 其它   其它支付错误
         */
        private static Handler mHandler = new Handler() {
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case SDK_PAY_FLAG: {
                        PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                        /**
                         对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                         */
                        String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                        String resultStatus = payResult.getResultStatus();
                        // 判断resultStatus 为9000则代表支付成功
                        if (TextUtils.equals(resultStatus, "9000")) {
                            // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                            showMessage("支付成功");
                            PayListenerUtils.getInstance(mContext).addSuccess();
                        } else if (TextUtils.equals(resultStatus, "6001")) {
                            // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                            showMessage("取消");
                            PayListenerUtils.getInstance(mContext).addCancel();
                        } else {
                            // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                            showMessage("支付失败");
                            PayListenerUtils.getInstance(mContext).addError();
                        }
                        break;
                    }
                }
            }
    
    
        };
    
        private static void showMessage(String str) {
            Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show();
        }
    }
    
    

    微信的回调Activity中,直接添加回调就行了

    public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
        private IWXAPI api;
        private String TAG = WXPayEntryActivity.class.getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_pay);
            api = WXAPIFactory.createWXAPI(this, ConfigurationSettings.WECHAT_APP_ID);
            api.handleIntent(getIntent(), this);
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            api.handleIntent(intent, this);
        }
    
        @Override
        public void onReq(BaseReq baseReq) {
    
        }
    
        @Override
        public void onResp(BaseResp baseResp) {
            Log.i(TAG, "WX code:------>" + baseResp.errCode);
            switch (baseResp.errCode) {
                case 0:
                    //成功
                    PayListenerUtils.getInstance(this).addSuccess();
                    break;
                case -1:
                    //失败
                    PayListenerUtils.getInstance(this).addError();
                    break;
                case -2:
                    //用户取消
                    PayListenerUtils.getInstance(this).addCancel();
                    break;
            }
            finish();
        
        }
    }
    
    

    至此整个结束,感谢各位大神指导!

    相关文章

      网友评论

      • 余青同学:封装的单利模式在使用支付宝支付的时候会持有Activity的引用造成内存溢出
        流水潺湲:@余青同学 怎么解决呢
      • _小_小白:你好,你这边 boolean send = getWxapi().sendReq(request); getWxapi()这个是哪里的?
        流水潺湲:@Mr_Sun_Leung 我定义在,application里面里静态 的
        private static IWXAPI wxapi;

        public static IWXAPI getWxapi() {
        return wxapi;
        }

        public static void setWxapi(IWXAPI wxapi) {
        SkyPineApplication.wxapi = wxapi;
        }

        在Create里面初始化

        /**
        * 注册到微信
        */
        private void regToWx() {
        wxapi = WXAPIFactory.createWXAPI(this.getApplicationContext(), ConfigurationSettings.WECHAT_APP_ID, true);
        wxapi.registerApp(ConfigurationSettings.WECHAT_APP_ID);
        }
      • 黄二狗V:微信的结果回掉处理了吗
        黄二狗V:@流水潺湲 支付宝回调的handler定义成静态内部类,容易造成内存泄露。😂😂我觉得应该定义成非静态内部类。
        流水潺湲:其实工具类看懂了,微信的回调处理应该也能推测出来怎么写,简单,已加上
        流水潺湲:忘记粘贴了,等会加上,敲我这粗心的,文章写了一半,感谢提醒

      本文标题:Android支付封装(微信+支付宝)

      本文链接:https://www.haomeiwen.com/subject/kzbezxtx.html