Android 微信 支付寶支付,2行代碼實現支付

做者簡介

微信公衆號(高質量文章推送):走向全棧工程師php

做者:陳博易html

聲明:本文是我的原創,未經容許請勿轉載前端

商業合做請在微信公衆號回覆:聯繫方式java

支付寶支付

微信支付

前言


  1. 如今的多數App都離不開集成阿里支付寶支付和微信支付
  2. 準備寫兩篇關於阿里支付寶支付和微信支付的教程,讓你們能夠快速集成支付
  3. Android前端 Java後端 集成支付寶支付
  4. 微信支付是本篇的重點

環境以及工具


  1. Android項目:AndroidStudio3.0
  2. Java項目:IntelliJ IDEA 2017.2.3

總體步驟


  1. 微信支付申請流程
  2. Android端環境集成
  3. Android端代碼展現
  4. Java後端代碼展現

詳細步驟


請參考微信支付開發文檔 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1數據庫

核心步驟解讀


1. 微信支付申請流程

https://pay.weixin.qq.com/guide/inapp_payment.shtml編程

商戶在微信開放平臺申請開發應用後,微信開放平臺會生成APP的惟一標識APPID。因爲須要保證支付安全,須要在開放平臺綁定商戶應用包名和應用簽名,設置好後才能正常發起支付。後端

2. Android端環境集成

將微信提供給咱們的,wxapi的文件放到咱們的主包下面(重要的事情說三次)api

3. Android端代碼展現
  1. 前端app支付回調核心代碼

  1. 前端app支付核心代碼

4. Java後端代碼展現

微信商戶的基本參數安全

這是java後端作的事情,大概看看就好,咱們前端就發起支付就好bash

App支付成功之後,java後端會收到異步回調,也就是對數據庫進行操做

image.png

/**
 * Create by: 陳博易
 * Date: 2017/12/1
 * time:  16:01
 * Email: 495057454@qq.com
 * 微信公衆號:走向全棧工程師
 * <p>
 * 微信支付 支付寶支付輔助類
 */
public class PaymentHelper {
    private static final int SDK_PAY_FLAG = 1;

    /**
     * @param activity        調用的activity
     * @param weChatPayEntity 微信調用參數
     */
    public void startWeChatPay(Activity activity, WxChatPayEntity weChatPayEntity) {
        if (activity == null || weChatPayEntity == null) {
            return;
        }
        if (!WxPayConfig.APP_ID.equals(weChatPayEntity.getAppid())) {
            return;
        }
        IWXAPI wxapi = WXAPIFactory.createWXAPI(activity, WxPayConfig.APP_ID, true);
        // 將該app註冊到微信
        wxapi.registerApp(WxPayConfig.APP_ID);
        PayReq req = new PayReq();
        req.appId = WxPayConfig.APP_ID;
        req.partnerId = weChatPayEntity.getPartnerid();
        req.prepayId = weChatPayEntity.getPrepayid();
        req.nonceStr = weChatPayEntity.getNoncestr();
        req.timeStamp = weChatPayEntity.getTimeStamp();
        req.packageValue = weChatPayEntity.getPackageValue();// "Sign=" +
        req.sign = weChatPayEntity.getSign();
        wxapi.sendReq(req);
    }

    /**
     * @param activity     調用的activity
     * @param alipayEntity 支付寶參數
     */
    public void startAliPay(final Activity activity, final AlipayEntity alipayEntity) {
        if (activity == null || alipayEntity == null) {
            return;
        }
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 構造PayTask 對象
                PayTask alipay = new PayTask(activity);
                // 調用支付接口,獲取支付結果
                String result = alipay.pay(alipayEntity.getPayInfo(), true);

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

        // 必須異步調用
        Thread payThread = new Thread(payRunnable);
        payThread.start();

    }


    @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(MyApplication.getContext(), "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 判斷resultStatus 爲非"9000"則表明可能支付失敗
                        // "8000"表明支付結果由於支付渠道緣由或者系統緣由還在等待支付結果確認,最終交易是否成功以服務端異步通知爲準(小几率狀態)
                        if (TextUtils.equals(resultStatus, "8000")) {
                            Toast.makeText(MyApplication.getContext(), "支付結果確認中", Toast.LENGTH_SHORT).show();

                        } else if (TextUtils.equals(resultStatus, "6001")) {
                            Toast.makeText(MyApplication.getContext(), "用戶取消支付", Toast.LENGTH_SHORT).show();
                        } else {
                            // 其餘值就能夠判斷爲支付失敗,包括用戶主動取消支付,或者系統返回的錯誤
                            Toast.makeText(MyApplication.getContext(), "支付失敗", Toast.LENGTH_SHORT).show();

                        }
                    }
                    break;
                }
                default:
                    break;
            }
        }

    };


}

複製代碼

總結


  1. 微信開放平臺提供的demo,有一些坑已經幫你們清除了,導入進去就能夠支付了,就是代碼不優雅

  2. 我的封裝的demo(微信支付和支付寶支付案例都集成在一塊兒了,直接複製黏貼)

  3. 請你們多關注關注我。

  4. 導入小編項目的姿式要對!

我的相關教程

各類大佬推薦的編程視頻資源分享

Android前端 Java後端 集成支付寶支付

postman使用 Android java後端 接口調試工具

Android抓包 Charles http接口調試

消息推送 Android java後端集成小米推送

如何導入簡單的java項目-IntelliJ IDEA

請關注我(高質量文章推送)

源碼地址———關注微信公衆號,回覆:微信支付寶支付

長按二維碼「識別」關注或者掃一掃
相關文章
相關標籤/搜索