Android開發(fā)中的第三方支付支付寶饵溅、微信

一、前言

現(xiàn)在第三方支付在市場上幾乎變成了不可或缺的支付方式妇萄,其中支付寶微信在其中可謂是翹楚蜕企,寫這篇文章的目的旨在給剛接觸支付或者是在集成的時候遇到坑的同胞們。

二冠句、支付寶的接入

在這里只講app支付轻掩,即在app里面集成支付sdk,在用戶支付的時候喚起支付寶進行支付懦底,下面講一下如何接入支付寶
1.集成sdk,將alipaySdk-20161009(我在項目中使用的就是20161009版本).jar添加到應用libs目錄下唇牧,并添加到庫里面去


2.在manifest中進行注冊相應的activity,其中h5payactivity,是用戶手機中沒有安裝支付寶的時候跳轉的h5頁面,后者是已經(jīng)安裝支付寶的時候跳轉的界面

        <!--支付寶頁面-->
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" />
        <activity
            android:name="com.alipay.sdk.auth.AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"

            android:screenOrientation="behind" />

3.聲明權限丐重,和添加混淆腔召,這些權限無非就是網(wǎng)絡權限,寫入權限嗎弥臼,讀取手機狀態(tài)的權限宴咧,等,這點過径缅,沒有什么坑

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

添加混淆

-libraryjars libs/alipaySdk-20161009.jar

-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 *;}

4.在代碼里面添加支付
首先是一堆參數(shù)掺栅,在這個里面坑挺多的,其中這些支付請求參數(shù)由于安全性的考慮需要后臺進行返回纳猪,在返回的時候進行加密處理氧卧,然后客戶端接收之后進行解密處理,在項目里面我們用的加密方式是des加密氏堤。參數(shù)詳細
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.x7kkCI&treeId=204&articleId=105465&docType=1
其中請求參數(shù)appid沙绝,sign是后臺生成的一個簽名,其生成步驟鼠锈,詳細請見
https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105974&docType=1
支付代碼如下:

                            HttpDataResultMall.userRecharge(Constants.USER_RECHARGE_AL, btnChongZhizhifu.getText().toString().substring(2, btnChongZhizhifu.getText().toString().length() - 1), new DataResult<CommonBean<DataBean>>() {
                                @Override
                                public void onSuccessData(CommonBean<DataBean> result) {
                                    if (result.isSuccess()) {
                                        //進行解密
                                        String des = UtilDES.ebotongDecrypto(result.getData().getDes());
                                        LogUtil.i("===============>>" + des);
                                        payV2(view, des);
                                    } else {
                                        dialog.dismiss();
                                        chongzhiPopwindow.dismiss();
                                        showToast(result.getData().getDes());
                                    }
                                }
                            });

通過向后臺請求支付參數(shù)闪檬,返回之后通過des解密進行調用支付寶的支付接口

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(AccountActivity.this);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());

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

        Thread payThread = new Thread(payRunnable);
        payThread.start();

5 . 通過handler進行處理返回信息

    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {
            switch (message.what) {
                case SDK_PAY_FLAG:
                    PayResultBean payResultBean = new PayResultBean((Map<String, String>) message.obj);
                    if (payResultBean.getResultStatus().equals("9000")) {
                        dialog.dismiss();
                        chongzhiPopwindow.dismiss();
                        //更新聯(lián)賽幣
                        getUserCoin();
                    } else {
                        dialog.dismiss();
                        chongzhiPopwindow.dismiss();
                        Toast.makeText(AccountActivity.this, payResultBean.getMemo(), Toast.LENGTH_SHORT).show();
                    }
                    break;
            }
            return false;
        }
    });

在resulestate =9000的時候說明成功支付,其他數(shù)據(jù)說明如下所示:
9000 訂單支付成功
8000 正在處理中购笆,支付結果未知(有可能已經(jīng)支付成功)粗悯,請查詢商戶訂單列表中訂單的支付狀態(tài)
4000 訂單支付失敗
5000 重復請求
6001 用戶中途取消
6002 網(wǎng)絡連接出錯
6004 支付結果未知(有可能已經(jīng)支付成功),請查詢商戶訂單列表中訂單的支付狀態(tài)
其它 其它支付錯誤

到此同欠,支付寶的接入便成功完成样傍,其中在簽名的時候可能坑比較多,如果有什么問題的話铺遂,歡迎加qq群進行討論衫哥, 570650538

三、微信的接入

在支付的時候微信的坑算是比較多的襟锐,其中微信跟支付寶的接入大同小異撤逢,下面我就來帶大家一塊接入一下,
1.集成sdk,將libammsdk.jar添加到libs目錄下面粮坞,在此需要注意的是有的項目可能集成了友盟+的第三方登錄和分享到微信的功能笛质,那么在編譯的時候可能會造成沖突,這個不用擔心捞蚂,把友盟中相應的jar包刪掉就行了


2.和支付寶一樣,微信在支付的時候同樣需要傳一系列的參數(shù)跷究,同樣appid 和sign等一系列重要的參數(shù)姓迅,均由后臺提供,在返回的時候直接解密獲取請求參數(shù),然后調用微信的支付接口進行支付丁存,在Android 端后臺設置的時候需要一個應用簽名肩杈,其生成方法如下所示,這個如果不正確的話解寝,就會造成支付的失敗扩然,詳細請見
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
3.具體代碼如下,調用支付接口

                                        String des = UtilDES.ebotongDecrypto(result.getData().getDes());
                                        Message message = handler.obtainMessage();
                                        message.what = SDK_WXPAY_FLAG;
                                        message.obj = des;
                                        handler.sendMessage(message);

其中des,是生成的后臺發(fā)送過來的支付請求參數(shù)在此進行解密聋伦,通過handler,進行輪循處理返回的消息夫偶,

 private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {
            switch (message.what) {

                case SDK_WXPAY_FLAG:
                    try {
                        JSONObject json = new JSONObject((String) message.obj);
                        api = WXAPIFactory.createWXAPI(AccountActivity.this, Constants.WX_APPID);
                        api.registerApp(Constants.WX_APPID);
                        PayReq req = new PayReq();
                        req.appId = json.getString("appid");
                        req.partnerId = json.getString("partnerid");
                        req.prepayId = json.getString("prepayid");
                        req.nonceStr = json.getString("noncestr");
                        req.timeStamp = json.getString("timestamp");
                        req.packageValue = json.getString("package");
                        req.sign = json.getString("sign");
                        api.sendReq(req);
                        dialog.dismiss();
                        chongzhiPopwindow.dismiss();
                    } catch (Exception e) {
                        Log.e("PAY_GET", "異常:" + e.getMessage());
                        Toast.makeText(AccountActivity.this, "異常:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                    break;
            }
            return false;
        }
    });

在支付處理的時候,微信和支付寶有點不一樣就是微信會新建一個頁面觉增,支付之后跳轉到相應的頁面進行處理兵拢,
在mainfest里面進行添加結果處理頁面,其中需要注意的是返回結果的activity名稱不能錯逾礁,這是由微信支付api決定的

        <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:screenOrientation="portrait" />

activity里面相應處理代碼:

@ContentView(R.layout.activity_wxpayentry_)
public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler{
    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";

    private IWXAPI api;

    @ViewInject(R.id.tv_wxpay_result)
    private TextView tvPayResult;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setToolbar("支付結果");
        api = WXAPIFactory.createWXAPI(this, Constants.WX_APPID);
        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) {
        int code= baseResp.errCode;
        if (code == 0){
            //顯示充值成功的頁面和需要的操作
            tvPayResult.setText("充值成功");
        }

        if (code == -1){
            //錯誤
            tvPayResult.setText("充值失敗");
        }

        if (code == -2){
            //用戶取消
            tvPayResult.setText("用戶取消");
        }
    }
}

在返回的code值分別為0说铃,-1,-2嘹履,分別代表成功腻扇,失敗,取消砾嫉,在具體項目里面開發(fā)人員可以定義相應的頁面進行處理返回結果

如果對以上有疑問幼苛,或者是想交流的小伙伴們可以加QQ群:570650538

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市焰枢,隨后出現(xiàn)的幾起案子蚓峦,更是在濱河造成了極大的恐慌,老刑警劉巖济锄,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暑椰,死亡現(xiàn)場離奇詭異,居然都是意外死亡荐绝,警方通過查閱死者的電腦和手機一汽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來低滩,“玉大人召夹,你說我怎么就攤上這事∷∧” “怎么了监憎?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長婶溯。 經(jīng)常有香客問我鲸阔,道長偷霉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任褐筛,我火速辦了婚禮类少,結果婚禮上,老公的妹妹穿的比我還像新娘渔扎。我一直安慰自己硫狞,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布晃痴。 她就那樣靜靜地躺著残吩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愧旦。 梳的紋絲不亂的頭發(fā)上世剖,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音笤虫,去河邊找鬼旁瘫。 笑死,一個胖子當著我的面吹牛琼蚯,可吹牛的內容都是我干的酬凳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼遭庶,長吁一口氣:“原來是場噩夢啊……” “哼宁仔!你這毒婦竟也來了?” 一聲冷哼從身側響起峦睡,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤翎苫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榨了,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煎谍,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年龙屉,在試婚紗的時候發(fā)現(xiàn)自己被綠了呐粘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡转捕,死狀恐怖作岖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情五芝,我是刑警寧澤痘儡,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站枢步,受9級特大地震影響沉删,放射性物質發(fā)生泄漏蓄坏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一丑念、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧结蟋,春花似錦脯倚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宝惰,卻和暖如春植榕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尼夺。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工尊残, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淤堵。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓寝衫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拐邪。 傳聞我的和親對象是個殘疾皇子慰毅,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,795評論 25 707
  • 目錄 準備工作 微信登錄和支付 支付寶登錄和支付 對比 準備工作 微信 注冊微信開放平臺,成為開發(fā)者(開發(fā)) 注冊...
    藍灰_q閱讀 28,134評論 9 56
  • 故鄉(xiāng)扎阶,一個離開了才能擁有的地方汹胃。 想起年前,我們都像候鳥一樣东臀,迫不及待地趕回家鄉(xiāng)着饥。可待不了幾天啡邑,你又很想啟程回到你...
    一支筆的陪伴閱讀 335評論 0 6
  • 相信在我們存儲一些數(shù)據(jù)的時候都會遇到一些苦惱贱勃,如果應用一旦被用戶刪除,那么設備中的信息就會被清除掉谤逼。此時贵扰,keyc...
    LuxDark閱讀 1,849評論 3 9
  • 就像白天和黑夜,就算誰缺誰不可流部,就算再怎麼緊密戚绕,卻永遠無法相交
    薔薇閱讀 196評論 0 1