支付寶/微信支付

微信支付的接入热凹,需要商戶或者公司提前做好一系列的準(zhǔn)備工作泵喘,比如先進(jìn)性開發(fā)者資質(zhì)認(rèn)證(300元/年)、申請APP_ID/APP_KEY般妙、申請支付能力纪铺,最后才能進(jìn)入開發(fā)階段。支付寶支付相比與微信支付碟渺,流程上是相對簡單鲜锚,下面進(jìn)入支付開發(fā)環(huán)節(jié)。

官方開發(fā)文檔入口:
1.支付寶開放平臺 Android集成流程
2.【微信支付】APP支付開發(fā)者文檔

支付寶

1.下載官方的Demo苫拍,把jar包拷貝進(jìn)項目的libs - Add as Library芜繁;
2.從官方Demo中拷貝 PayResult.java 到項目中,支付成功回調(diào)時會用到绒极。在 AndroidManifest.xml 中加入相應(yīng)權(quán)限及如下代碼:

        <!--支付寶-->
        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden">
        </activity>
        <activity
            android:name="com.alipay.sdk.app.H5AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden">
        </activity>

3.從服務(wù)端獲取訂單信息骏令,拉起并傳輸?shù)街Ц秾殘?zhí)行支付,即輸入密碼完成支付的可視化界面垄提;

    final String orderInfo = results.getAli_pay_app().getOrderInfo();   // 訂單信息

    Runnable payRunnable = new Runnable() {

        @Override
        public void run() {
            PayTask alipay = new PayTask(BTDZPayActivity.this);
            Map<String, String> result = alipay.payV2(orderInfo, true);

            Message msg = new Message();
            msg.what = SDK_PAY_FLAG;
            msg.obj = result;
            mHandler.sendMessage(msg);
        }
    };
    // 必須異步調(diào)用
    Thread payThread = new Thread(payRunnable);
    payThread.start();

4.支付寶支付成功回調(diào)榔袋,此時付款成功,需要同步訂單信息铡俐,調(diào)用服務(wù)更新訂單狀態(tài)凰兑;

    private static final int SDK_PAY_FLAG = 1;
    private static final int SDK_AUTH_FLAG = 2;

    @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(BuyEquipActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                        updateOrder();  //調(diào)用自己的服務(wù),通知服務(wù)器
                    } else {
                        // 該筆訂單真實的支付結(jié)果露泊,需要依賴服務(wù)端的異步通知喉镰。
                        Toast.makeText(BTDZPayActivity.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(BTDZPayActivity.this,
                                "授權(quán)成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
                                .show();
                    } else {
                        // 其他狀態(tài)值則為授權(quán)失敗
                        Toast.makeText(BTDZPayActivity.this,
                                "授權(quán)失敗" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();

                    }
                    break;
                }
                default:
                    break;
            }
        }

        ;
    };
    private void updateOrder(){
        //...
        Toast.makeText(TheApplication.getContext(), "購買成功~", Toast.LENGTH_SHORT).show();
        finish();
    }
微信

1.下載官方的Demo,把jar包拷貝進(jìn)項目的libs - Add as Library沉噩;
微信開放平臺上提供的demo是有兩個jar包捺宗,一個是 libammsdk.jar,另一個是 wechat-sdk-android-with-mta-1.0.2.jar川蒙,這兩個其實只需要一個就夠了蚜厉!可以正常編譯和運(yùn)行,但我在打release包時出現(xiàn)這樣一個錯誤:

Error:Execution failed for task ':app:transformClassesWithJarMergingForRelease'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/tencent/mm/opensdk/a/a/a$a.class

發(fā)郵件咨詢了微信的開發(fā)人員【wepayTS(微信支付技術(shù)支持) wepayTS@tencent.com】畜眨,他是這樣回答的:

reply.png

然后我刪掉了 libammsdk.jar昼牛,便可以正常打包了。
2.在拉起支付頁面的onCreate()方法里創(chuàng)建Api;

//private IWXAPI api;
api = WXAPIFactory.createWXAPI(this, GlobalConstant.wxAppId);

3.從服務(wù)端獲取訂單信息康聂,拉起并傳輸?shù)轿⑿艌?zhí)行支付贰健,即輸入密碼完成支付的可視化界面;

    WXPayAppInfo wxPayApp = results.getWx_pay_app();
    PayReq payReq = new PayReq();
    payReq.appId=GlobalConstant.wxAppId;
    payReq.partnerId=wxPayApp.getPartnerid();
    payReq.prepayId=wxPayApp.getPrepayid();
    payReq.packageValue=wxPayApp.getPackage_();
    payReq.nonceStr=wxPayApp.getNoncestr();
    payReq.timeStamp=wxPayApp.getTimestamp();
    payReq.sign=wxPayApp.getSign();
    api.sendReq(payReq);

4.微信支付成功回調(diào)恬汁,和支付寶不同的是伶椿,微信支付成功會跳轉(zhuǎn)到一個可以自定義的可視化界面(Activity),這個頁面是從微信客戶端支付完成回到app時的頁面;
這個頁面需要在項目的package路徑下氓侧,新建wxapi目錄脊另,然后把官方demo里面的 WXPayEntryActivity.java 放進(jìn)去即可。

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //如果不想做支付成功的頁面注釋掉setContentView即可
        //setContentView(R.layout.pay_result);

        api = WXAPIFactory.createWXAPI(this, GlobalConstant.wxAppId);
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {

    }

    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            switch (resp.errCode) {
                case 0://支付成功0
                    //發(fā)送通知支付成功约巷,在其他接收通知頁面執(zhí)行后續(xù)操作
                    WXPayEntryActivity.this.sendBroadcast(new Intent("pay_action"));
                    finish();
                    break;
                case -2://用戶取消
                    Toast.makeText(WXPayEntryActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
                    finish();
                    break;
                case -1:
                    break;
                default:
                    break;
            }
        }
    }
}
    BroadcastReceiver mPayReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            updateOrder();
        }
    };

官方demo里面的 WXPayEntryActivity.java 也有個坑偎痛,直接復(fù)制進(jìn)項目的要注意了!


error.png

以前測試的時候明明支付了独郎,還是一直提示取消支付看彼,看的我是一臉懵逼,我還天真的去問微信開發(fā)人員囚聚,開發(fā)人員也沒解釋出來啥靖榕,最后不知怎么撇的一眼發(fā)現(xiàn)的。
別忘了在 AndroidManifest.xml 中加入相應(yīng)權(quán)限及如下代碼:

        <!--微信-->
        <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"/>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顽铸,一起剝皮案震驚了整個濱河市茁计,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谓松,老刑警劉巖星压,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鬼譬,居然都是意外死亡娜膘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門优质,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竣贪,“玉大人军洼,你說我怎么就攤上這事⊙菰酰” “怎么了匕争?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爷耀。 經(jīng)常有香客問我甘桑,道長,這世上最難降的妖魔是什么歹叮? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任跑杭,我火速辦了婚禮,結(jié)果婚禮上咆耿,老公的妹妹穿的比我還像新娘艘蹋。我一直安慰自己,他們只是感情好票灰,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布女阀。 她就那樣靜靜地躺著,像睡著了一般屑迂。 火紅的嫁衣襯著肌膚如雪浸策。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天惹盼,我揣著相機(jī)與錄音庸汗,去河邊找鬼。 笑死手报,一個胖子當(dāng)著我的面吹牛蚯舱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掩蛤,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼枉昏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揍鸟?” 一聲冷哼從身側(cè)響起兄裂,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阳藻,沒想到半個月后晰奖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腥泥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年匾南,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛔外。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛆楞,死狀恐怖溯乒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情臊岸,我是刑警寧澤橙数,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布尊流,位于F島的核電站帅戒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏崖技。R本人自食惡果不足惜逻住,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迎献。 院中可真熱鬧瞎访,春花似錦、人聲如沸吁恍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冀瓦。三九已至伴奥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翼闽,已是汗流浹背拾徙。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留感局,地道東北人尼啡。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像询微,于是被迫代替她去往敵國和親崖瞭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355