Android App支付系列(一):微信支付接入詳細指南(附官方支付demo)

寫在前面

一家移動互聯網公司,說到底,要盈利總是需要付費用戶的,自己開發支付系統顯然是不明智的,國內已經有多家成熟的移動支付提供商,騰訊就是其中之一。梳理了下微信支付的接入,今天給大家分享下騰訊旗下的微信支付SDK的接入流程。

Android App支付系列(二):支付寶SDK接入詳細指南

Android開發:使用EasyPay打造全能移動支付框架:集成微信,支付寶,銀聯支付的開源支付框架

接入流程

1.申請開發者資質

地址:https://open.weixin.qq.com/

使用公司管理者/高層帳號登錄微信開放平臺,進入“賬號中心”,進行開發者資質認證,需要填寫公司資料,包括但不限於,公司註冊號,公司營業執照,公司對外辦公電話,公司對公銀行卡信息(卡號,髮卡行)。審覈時間爲一週左右。
備註:因爲從2015年10月1日起,國家實行三證(組織機構代碼證,企業營業執照,稅務登記證)合一,所以組織機構代碼處填寫-工商執照註冊號,同樣,組織機構代碼證,上傳-企業工商營業執照。
備註2:進行開發者資質認證需要支付300元人名幣/年,只有具備開發者資質認證的開發者才能夠使用app支付,授權登錄等接口。

2.申請APP_ID/APP_KEY
每個應用/遊戲要調用微信的接口都需要有一個微信標誌,這個唯一標誌通常成爲APP_ID或者APP_KEY,各開放平臺差異不大
進入管理中心,創建移動應用,每個開發者具有10個應用的創建機會,好在創建的應用可以隨時刪除。已上線的應用就不建議手賤刪除!!
申請appid需要填寫應用信息:應用名稱,包名,簽名(keystore的md5值去分號小寫),icon(28*28 & 108*108),app下載地址等信息,即可分配到一個appid。
備註:測試支付時,務必使用申請時填寫的keystore文件簽名,包名也需要覈對清楚,必然無法調起支付,返回-1錯誤碼。

3.申請支付能力
在管理中心,查看需要集成支付能力的app,找到“微信支付”一欄,點擊右側“申請開通”,填寫一些企業信息後等待審覈,審覈時間爲一週左右,審覈通過後,會得到一個企業商戶號及密碼,對公銀行卡中將收到幾分錢,進入商戶平臺,輸入收到的金錢金額以驗證。驗證通過後即可開始集成支付調用。在這之前,調用支付接口是無法完成支付的。

4.代碼集成微信支付
支付流程圖
這裏寫圖片描述

微信支付流程圖白話版
1.客戶端代碼得到用戶購買的商品信息,將之傳給自己公司app服務器,參數包含但不限於以下:

params.put("appid", appID);// 微信appid,選擇性上傳,服務器寫死亦可
params.put("money", money);// 支付金額,單位:分
params.put("name", goodsName);// 商品名稱
params.put("currencytype", "CNY");// 支付幣種,只能填CNY,代表人民幣

備註:以上是參數字段是我們公司服務器定義,給服務器用以獲取預支付訂單號prePayId用。
備註2:詳細字段請參考:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
2.app服務器調用微信“統一下單”接口,得到prePayId訂單號並返回prePayId給手機客戶端;
3.手機客戶端使用prePayId及商品信息調起微信客戶端進行支付;
3.1用戶操作:輸入密碼進行支付;返回鍵取消支付;網絡無連接支付失敗等;
4.微信客戶端回調支付結果給咱們的APP客戶端;
5.微信服務器異步通知咱們公司app服務器支付結果(服務器的工作,與客戶端無關)

微信支付代碼:

IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext, WX_APPID, true);
mWxApi.registerApp(WX_APPID);
            /**
             * 請求app服務器得到的回調結果
             */
            @Override
            public void onGet(JSONObject jsonObject) {
                if (mWxApi != null) {
                    PayReq req = new PayReq();

                    req.appId = WX_APPID;// 微信開放平臺審覈通過的應用APPID
                    try {
                        req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商戶號
                        req.prepayId = jsonObject.getString("prepayid");// 預支付訂單號,app服務器調用“統一下單”接口獲取
                        req.nonceStr = jsonObject.getString("noncestr");// 隨機字符串,不長於32位,服務器小哥會給咱生成
                        req.timeStamp = jsonObject.getString("timestamp");// 時間戳,app服務器小哥給出
                        req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接寫死,服務器返回的也是這個固定值
                        req.sign = jsonObject.getString("sign");// 簽名,服務器小哥給出,他會根據:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指導得到這個
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    mWxApi.sendReq(req);
                    Log.d("發起微信支付申請");
                }

            }

在app包下新建wxapi包,比如app包名爲com.xiongit.app,那個新建的包路徑爲com.xiongit.app.wxapi,該包下新建WXPayEntryActivity,繼承自任意Activity。該Activity用以接收支付結果回調,清單聲明此Activity的格式爲

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

WXPayEntryActivity代碼示例

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{

    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";

    private IWXAPI api;
    private static final String APP_ID = "your app id";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay_result);

        api = WXAPIFactory.createWXAPI(this, 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 req) {
    }

    /**
     * 得到支付結果回調
     */
    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);// 支付結果碼
    }
}

回調中errCode值列表:

0 支付成功
-1 發生錯誤 可能的原因:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等。
-2 用戶取消 發生場景:用戶不支付了,點擊取消,返回APP。

清單menifest申明所需權限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

備註:支付結果最終以app服務器的得到的異步通知爲準。

微信SDK混淆

-keep class com.tencent.mm.sdk.** {
   *;
}

update 20160704

當支付時,微信尚未登錄,得不到任何回調,如果調起支付時有彈窗進度框,並且你想在得到響應碼後讓它消失是行不通的,需要在跳出的onStop中處理進度條,不然未登錄並且用戶取消了支付時進度條無法消失。

update 20160722

當支付時,WXPayEntryActivity會以透明的形式啓動,所以你可能需要在支付完成得到支付響應碼後手動finish該activity,不然你自己寫的支付頁面的activity需要返回兩次才能退出,因爲第一次按下back鍵實際是finish掉WXPayEntryActivity.第二次纔是你自己的activity.

完事了,祝各位集成微信支付成功!
本文作者xiong_it,鏈接:http://blog.csdn.net/xiong_it
最後附上微信官方支付demo下載:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1,吐槽語:官方demo下載藏的有點深。。。開放平臺居然沒有提供下載,放在微信支付商戶平臺。

發佈了69 篇原創文章 · 獲贊 251 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章