Android 微信支付和支付寶支付 快速接入

現(xiàn)在的支付潮流莫過于微信跟支付寶了严肪,最近我們項目涉及到會員需求谦屑,就用到微信支付跟支付寶支付驳糯,說實話接入之前會覺得這個復(fù)雜,等真正去動手實踐的時候才覺得狠簡單氢橙,真的狠簡單酝枢。從接入到支付一步到位,Run完直接調(diào)起了微信跟支付寶悍手。接入前也看了這兩個支付的詳細(xì)接入文檔帘睦,但是看是一碼事,做也是一碼事坦康。所以實踐很重要竣付。

  • 之所以說狠簡單而且快速接入,主要是因為我們公司的運維后臺很給力滞欠,把微信的一些請求參數(shù)古胆,全部后臺返回給我們,我們直接用實體是接受拿到就好仑撞。
先說下微信支付吧赤兴,畢竟相對于支付而言,還是支付寶簡單快速一點隧哮,就留到后面說了

1.如果你已經(jīng)成功集成了微信登錄和分享桶良,直接用你的 libammsdk.jar和 WECHAT_APP_ID就可以了, 那么下面幫你快速集成微信支付沮翔。

2.接入前可以看看上面鏈接的文檔陨帆,不過微信官方的文檔寫的不夠好,好多開發(fā)者吐槽采蚀,至今也沒改善點啥疲牵。
3.好了直接說接入,接入微信支付SDK前準(zhǔn)備下面三個東西榆鼠,如果你集成了微信分享纲爸,登錄那只需要一個 WXPayEntryActivity 類就行了
① 微信支付的APPID
② 微信支付依賴包 -------- libammsdk.jar
③ 一個Activity類 ----------- WXPayEntryActivity

  • 這里需要特別說明一下,這個WXPayEntryActivity 類妆够,直接從微信官方下載的Demo代碼中copy到自己的工程中即可识啦,這個頁面是在你調(diào)起微信支付完成支付(或取消或失敻何谩)后,再回到你的App時會調(diào)用的一個頁面颓哮。頁面的布局可以是你自定義的布局(一般做法是直接注釋掉這個布局)
    網(wǎng)上copy的一張圖講解:
WXPayEntryActivity 的路徑

4、WXPayEntryActivity中的布局是可以自定義的伤极,如果你不需要展示什么布局姨伤,而是要跳轉(zhuǎn)頁面乍楚,把這段代碼刪除即可

/**
 * -Created by Luke on 2017/2/14.
 */
public class WXPayEntryActivity extends AppCompatActivity  {
    private static final String TAG = WXPayEntryActivity.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.pay_result);
        BaseApplication.api.handleIntent(getIntent(), this);
    }
}
WECHAT_APP_ID 已經(jīng)在BaseApplication中定義了 在這里不需要再寫

5.下面是回調(diào)的邏輯凌箕,官方是這樣的圖


官方回調(diào)頁面
  • 我這邊就簡單的演示下支付成功的地方
    @Override
    public void onResp(BaseResp resp) {

        LogUtil.d(TAG, "Luke = " + resp.toString());
        
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            int code = resp.errCode;
            switch (code) {
                case 0:
                    ToastUtil.show("支付成功");
                    break;
                case -1:
                    ToastUtil.show("支付失敗");
                    finish();
                    break;
                case -2:
                    ToastUtil.show("支付取消");
                    finish();
                    break;
                default:
                    ToastUtil.show("支付失敗");
                    setResult(RESULT_OK);
                    finish();
                    break;
            }
        }
    }

接下來咱就把這個WXPayEntryActivity放在清單manifest文件里面注冊牵舱,然后加上exported屬性芜壁,設(shè)置為true:

<activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/Theme.AppCompat.NoActionBar"/>
注意的地方:
  • 0 成功 展示成功頁面
  • -1 錯誤 可能的原因:簽名錯誤慧妄、未注冊APPID塞淹、項目設(shè)置APPID不正確饱普、注冊的APPID與設(shè)置的不匹配套耕、其他異常等峡继。
  • -2 用戶取消 無需處理碾牌。發(fā)生場景:用戶不支付了,點擊取消翘瓮,返回APP资盅。

6.這個類中的其余的回調(diào)方法呵扛,我們都不需要去操作今穿。然后我們就可以開始支付了蓝晒,蠻簡單

  • 下面是請求的參數(shù)列表帖鸦,我們都是服務(wù)器端返回作儿,包括APPID攻锰,直接用已經(jīng)正式的sign。
微信支付請求參數(shù)列表
  • 大概的支付流程是
    ① 點擊支付的時候創(chuàng)建訂單,獲取訂單號orderNumber (或者在需要獲取訂單號的時候獲取)
    ② 通過你的價格和這個orderNumber去請求微信返回的一堆參數(shù)妒蛇,以及調(diào)起支付頁面:
    下面是關(guān)鍵的一步:

//PrePayWeChatEntity 服務(wù)器返回給我們微信支付的參數(shù)

private void WeChatPay(PrePayWeChatEntity data) {

        if (null == data) {
             //判斷是否為空材部。丟一個toast乐导,給個提示。比如服務(wù)器異常旺拉,錯誤啥的
            return;
        }

        IWXAPI api = WXAPIFactory.createWXAPI(this, data.getAppid());
        
        if (!isWXAppInstalledAndSupported(api)) {
            // throw new WeChartNoFoundException();
            ToastUtil.show(getString(R.string.text_uninstalled_wchat));
            
            return;
        }

        //data  根據(jù)服務(wù)器返回的json數(shù)據(jù)創(chuàng)建的實體類對象
        PayReq req = new PayReq();

        req.appId = data.getAppid();
        
        req.partnerId = data.getPartnerid();
        
        req.prepayId = data.getPrepayid();
        
        req.packageValue = data.getPkgstr();
        
        req.nonceStr = data.getNoncestr();
        
        req.timeStamp = data.getTimestamp();
        
        req.sign = data.getSign();

        api.registerApp(data.getAppid());
        
        //發(fā)起請求
        api.sendReq(req);
    }

7.到這就是成功了晋涣,調(diào)起了微信支付沉桌。再回到 WXPayEntryActivity 中去判斷成功后的動作留凭,例如支付完成跳轉(zhuǎn)一個成功的頁面finish();也許是用戶取消蔼夜,和異常的支付失敗,可以在這個邏輯中去請求訂單的狀態(tài)是怎么樣的瘤运。
8.最后一個問題就是關(guān)于微信開放平臺簽名的問題尽超。只要你手機(jī)上的程序的簽名和你在微信平臺登記的簽名一致即可似谁,無論是debug版本巩踏,還是release版本续搀,都是可以的,默認(rèn)都可以用release的簽名

到這微信支付就愉快的結(jié)束了

支付寶支付彪杉,這個比微信稍微簡單那么點派近,同樣在請求參數(shù)服務(wù)端返回的情況下
  • 支付寶開放平臺 在這個平臺申請我們的支付功能:
  • 注意一點就是個人不能申請的洁桌,只能是企業(yè),so 我demo里面的用的一些資料也是demo里面的

1.進(jìn)入支付寶開放平臺戒幔,注冊賬戶并登錄土童。


官網(wǎng)地址

支付寶移動支付

2.登錄成功后敢订,點擊管理中心創(chuàng)建應(yīng)用(創(chuàng)建應(yīng)用時,注意命名規(guī)范)玉掸。

  • 下載 alipaySdk-20161222.jar 和 alipay_demo

  • 將demo里面的alipaySdk-20161222.jar拷貝到我們工程的libs下司浪,并添加到依賴中

  • 跟微信一樣在清單文件中注冊下這兩個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>

3.設(shè)置應(yīng)用公鑰

4.生成密鑰

5.點擊上方的支付寶密鑰生成器下載下jar包之后解壓

6.點擊密鑰生成器之后回彈出黑窗口吁伺,等幾秒之后彈出生成器窗口

7.跟微信的流程相差無幾。拿到價格和訂單號篮奄,就可以去請求支付的地址了窟却,然后用這些參數(shù)回調(diào)支付

    //orderNum,  orderInfo,  sign,  signType  服務(wù)器端返回夸赫,本地生成也是OK的
    private void requestAlipay(String orderNum, String orderInfo, String sign, String signType) {

        try {

            // 對sign做URL編碼
            sign = URLEncoder.encode(sign, "UTF-8");

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //  整的符合支付寶參數(shù)規(guī)范的訂單信息
        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&sign_type=\"" + signType + "\"";

        //lambda    此處  () ->  為lambda 表達(dá)式寫法
        Runnable payRunnable = () -> {
            // 構(gòu)造PayTask 對象
            PayTask payTask = new PayTask(this);
            // 調(diào)用支付接口茬腿,獲取支付結(jié)果
            String result = payTask.pay(payInfo, true);

            if (null == result) {
                result = "out_trade_no={" + orderNum + "}";
            } else {
                result += ";out_trade_no={" + orderNum + "}";
            }

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

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

上述生成的這些東西一般都是后臺返回的切平,當(dāng)然我們本地生成也是可以的揭绑,所以我就大概的說下流程

  • 處理支付結(jié)果:
 @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {

        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {

                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     對于支付結(jié)果他匪,請商戶依賴服務(wù)端的異步通知結(jié)果邦蜜。同步通知結(jié)果悼沈,僅作為支付結(jié)束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判斷resultStatus 為9000則代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 該筆訂單是否真實支付成功衣吠,需要依賴服務(wù)端的異步通知缚俏。
                        Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 該筆訂單真實的支付結(jié)果贮乳,需要依賴服務(wù)端的異步通知向拆。
                        Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
                    }
                    break;
                }

                case SDK_AUTH_FLAG: {
                    @SuppressWarnings("unchecked")
                    AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                    String resultStatus = authResult.getResultStatus();

                    // 判斷resultStatus 為“9000”且result_code
                    // 為“200”則代表授權(quán)成功浓恳,具體狀態(tài)碼代表含義可參考授權(quán)接口文檔
                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                        // 獲取alipay_open_id,調(diào)支付時作為參數(shù)extern_token 的value
                        // 傳入赞草,則支付賬戶為該授權(quán)賬戶
                        Toast.makeText(PayDemoActivity.this,
                                "授權(quán)成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
                                .show();
                    } else {
                        // 其他狀態(tài)值則為授權(quán)失敗
                        Toast.makeText(PayDemoActivity.this,
                                "授權(quán)失敗" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();

                    }
                    break;
                }

                default:
                    break;
            }
        }

        ;
    };

  • 到這兒就支付成功了厨疙,提示用戶的邏輯沾凄,我們得從服務(wù)器確認(rèn)是否正在支付了撒蟀,查詢是否支付成功的狀態(tài)温鸽。根據(jù)服務(wù)器端返回的判斷碼來處理支付之后的一些動作。

  • 接入的時候有啥問題可以隨時跟我談?wù)摴贸撸蚁脒@些會給你們一些幫助统捶,記錄就是在腦子里過一遍,也許是最好的成長喘鸟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愕把,隨后出現(xiàn)的幾起案子茵瘾,更是在濱河造成了極大的恐慌拗秘,老刑警劉巖雕旨,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凡涩,死亡現(xiàn)場離奇詭異活箕,居然都是意外死亡可款,警方通過查閱死者的電腦和手機(jī)闺鲸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門摸恍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人壁袄,你說我怎么就攤上這事然想。” “怎么了令哟?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛙卤。 經(jīng)常有香客問我,道長神年,這世上最難降的妖魔是什么已日? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮护奈,結(jié)果婚禮上哥纫,老公的妹妹穿的比我還像新娘霉旗。我一直安慰自己,他們只是感情好蛀骇,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布厌秒。 她就那樣靜靜地躺著,像睡著了一般松靡。 火紅的嫁衣襯著肌膚如雪简僧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天雕欺,我揣著相機(jī)與錄音岛马,去河邊找鬼棉姐。 笑死,一個胖子當(dāng)著我的面吹牛啦逆,可吹牛的內(nèi)容都是我干的乃坤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼食棕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唱逢,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拒课,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡卢鹦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巷怜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宋雏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚪燕,到底是詐尸還是另有隱情鲁驶,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一付鹿、第九天 我趴在偏房一處隱蔽的房頂上張望谁不。 院中可真熱鬧烛缔,春花似錦亡蓉、人聲如沸淋肾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春顽耳,著一層夾襖步出監(jiān)牢的瞬間限次,已是汗流浹背旱幼。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留帅韧,地道東北人刁品。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓拌汇,卻偏偏與公主長得像疚察,于是被迫代替她去往敵國和親貌嫡。 傳聞我的和親對象是個殘疾皇子夫椭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容