Android App支付系列(一):微信支付接入詳細(xì)指南(附官方支付demo)
寫在前面
一家移動互聯(lián)網(wǎng)公司,說到底,要盈利總是需要付費用戶的,自己開發(fā)支付系統(tǒng)顯然是不明智的,國內(nèi)已經(jīng)有多家成熟的移動支付提供商,騰訊就是其中之一。梳理了下微信支付的接入,今天給大家分享下騰訊旗下的微信支付SDK的接入流程。
接入流程
1.申請開發(fā)者資質(zhì)
地址:https://open.weixin.qq.com/
使用公司管理者/高層帳號登錄微信開放平臺,進(jìn)入“賬號中心”,進(jìn)行開發(fā)者資質(zhì)認(rèn)證,需要填寫公司資料,包括但不限于,公司注冊號,公司營業(yè)執(zhí)照,公司對外辦公電話,公司對公銀行卡信息(卡號,發(fā)卡行)。審核時間為一周左右。
備注:因為從2015年10月1日起,國家實行三證(組織機構(gòu)代碼證,企業(yè)營業(yè)執(zhí)照,稅務(wù)登記證)合一,所以組織機構(gòu)代碼處填寫-工商執(zhí)照注冊號,同樣,組織機構(gòu)代碼證,上傳-企業(yè)工商營業(yè)執(zhí)照。
備注2:進(jìn)行開發(fā)者資質(zhì)認(rèn)證需要支付300元人名幣/年,只有具備開發(fā)者資質(zhì)認(rèn)證的開發(fā)者才能夠使用app支付,授權(quán)登錄等接口。
2.申請APP_ID/APP_KEY
每個應(yīng)用/游戲要調(diào)用微信的接口都需要有一個微信標(biāo)志,這個唯一標(biāo)志通常成為APP_ID或者APP_KEY,各開放平臺差異不大
進(jìn)入管理中心,創(chuàng)建移動應(yīng)用,每個開發(fā)者具有10個應(yīng)用的創(chuàng)建機會,好在創(chuàng)建的應(yīng)用可以隨時刪除。已上線的應(yīng)用就不建議手賤刪除!!
申請appid需要填寫應(yīng)用信息:應(yīng)用名稱,包名,簽名(keystore的md5值去分號小寫),icon(28*28 & 108*108),app下載地址等信息,即可分配到一個appid。
備注:測試支付時,務(wù)必使用申請時填寫的keystore文件簽名,包名也需要核對清楚,必然無法調(diào)起支付,返回-1錯誤碼。
3.申請支付能力
在管理中心,查看需要集成支付能力的app,找到“微信支付”一欄,點擊右側(cè)“申請開通”,填寫一些企業(yè)信息后等待審核,審核時間為一周左右,審核通過后,會得到一個企業(yè)商戶號及密碼,對公銀行卡中將收到幾分錢,進(jìn)入商戶平臺,輸入收到的金錢金額以驗證。驗證通過后即可開始集成支付調(diào)用。在這之前,調(diào)用支付接口是無法完成支付的。
4.代碼集成微信支付
支付流程圖
微信支付流程圖白話版:
1.客戶端代碼得到用戶購買的商品信息,將之傳給自己公司app服務(wù)器,參數(shù)包含但不限于以下:
params.put("appid", appID);// 微信appid,選擇性上傳,服務(wù)器寫死亦可 params.put("money", money);// 支付金額,單位:分 params.put("name", goodsName);// 商品名稱 params.put("currencytype", "CNY");// 支付幣種,只能填CNY,代表人民幣
備注:以上是參數(shù)字段是我們公司服務(wù)器定義,給服務(wù)器用以獲取預(yù)支付訂單號prePayId用。
備注2:詳細(xì)字段請參考:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
2.app服務(wù)器調(diào)用微信“統(tǒng)一下單”接口,得到prePayId訂單號并返回prePayId給手機客戶端;
3.手機客戶端使用prePayId及商品信息調(diào)起微信客戶端進(jìn)行支付;
3.1用戶操作:輸入密碼進(jìn)行支付;返回鍵取消支付;網(wǎng)絡(luò)無連接支付失敗等;
4.微信客戶端回調(diào)支付結(jié)果給咱們的APP客戶端;
5.微信服務(wù)器異步通知咱們公司app服務(wù)器支付結(jié)果(服務(wù)器的工作,與客戶端無關(guān))
微信支付代碼:
IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext, WX_APPID, true); mWxApi.registerApp(WX_APPID); /** * 請求app服務(wù)器得到的回調(diào)結(jié)果 */ @Override public void onGet(JSONObject jsonObject) { if (mWxApi != null) { PayReq req = new PayReq(); req.appId = WX_APPID;// 微信開放平臺審核通過的應(yīng)用APPID try { req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商戶號 req.prepayId = jsonObject.getString("prepayid");// 預(yù)支付訂單號,app服務(wù)器調(diào)用“統(tǒng)一下單”接口獲取 req.nonceStr = jsonObject.getString("noncestr");// 隨機字符串,不長于32位,服務(wù)器小哥會給咱生成 req.timeStamp = jsonObject.getString("timestamp");// 時間戳,app服務(wù)器小哥給出 req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接寫死,服務(wù)器返回的也是這個固定值 req.sign = jsonObject.getString("sign");// 簽名,服務(wù)器小哥給出,他會根據(jù):https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指導(dǎo)得到這個 } catch (JSONException e) { e.printStackTrace(); } mWxApi.sendReq(req); Log.d("發(fā)起微信支付申請"); } }
在app包下新建wxapi包,比如app包名為com.xiongit.app,那個新建的包路徑為com.xiongit.app.wxapi,該包下新建WXPayEntryActivity,繼承自任意Activity。該Activity用以接收支付結(jié)果回調(diào),清單聲明此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) { } /** * 得到支付結(jié)果回調(diào) */ @Override public void onResp(BaseResp resp) { Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);// 支付結(jié)果碼 } }
回調(diào)中errCode值列表:
0 支付成功
-1 發(fā)生錯誤 可能的原因:簽名錯誤、未注冊APPID、項目設(shè)置APPID不正確、注冊的APPID與設(shè)置的不匹配、其他異常等。
-2 用戶取消 發(fā)生場景:用戶不支付了,點擊取消,返回APP。
清單menifest申明所需權(quán)限
<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"/>
備注:支付結(jié)果最終以app服務(wù)器的得到的異步通知為準(zhǔn)。
微信SDK混淆
-keep class com.tencent.mm.sdk.** { *; }
update 20160704
當(dāng)支付時,微信尚未登錄,得不到任何回調(diào),如果調(diào)起支付時有彈窗進(jìn)度框,并且你想在得到響應(yīng)碼后讓它消失是行不通的,需要在跳出的onStop中處理進(jìn)度條,不然未登錄并且用戶取消了支付時進(jìn)度條無法消失。
update 20160722
當(dāng)支付時,WXPayEntryActivity會以透明的形式啟動,所以你可能需要在支付完成得到支付響應(yīng)碼后手動finish該activity,不然你自己寫的支付頁面的activity需要返回兩次才能退出,因為第一次按下back鍵實際是finish掉WXPayEntryActivity.第二次才是你自己的activity.
完事了,祝各位集成微信支付成功!
最后附上微信官方支付demo下載:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1,吐槽語:官方demo下載藏的有點深。。。開放平臺居然沒有提供下載,放在微信支付商戶平臺。
相關(guān)文章
adnroid已安裝應(yīng)用中檢測某應(yīng)用是否安裝的代碼實例
這篇文章主要介紹了Android怎么檢測一個應(yīng)用是否安裝的方法,大家參考使用吧2013-11-11Android使用Notification實現(xiàn)普通通知欄(一)
這篇文章主要為大家詳細(xì)介紹了Android使用Notification實現(xiàn)普通通知欄,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12Android之獲取手機內(nèi)部及sdcard存儲空間的方法
今天小編就為大家分享一篇Android之獲取手機內(nèi)部及sdcard存儲空間的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Android 中圖片和按鈕按下狀態(tài)變化實例代碼解析
這篇文章通過實例代碼給大家總結(jié)了android 中圖片和按鈕按下狀態(tài)變化問題,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-06-06ionic App 解決android端在真機上tab處于頂部的問題
這篇文章主要介紹了ionic App 解決android端在真機上tab處于頂部的問題的相關(guān)資料,需要的朋友可以參考下2017-06-06