Android開發(fā)第三方APP接入微信支付

前言

在APP中接入微信支付其實(shí)很簡(jiǎn)單,大部分工作主要都是后臺(tái)完成桐筏,客戶端只需要調(diào)用后臺(tái)拇砰,得到后臺(tái)返回的字符串后在調(diào)用微信的api即可。但是會(huì)有些坑牧氮,稍不注意就會(huì)掉坑里瑰枫,下面會(huì)講到。

一. 接入流程

交互圖

商戶系統(tǒng)和微信支付系統(tǒng)主要交互說(shuō)明:

  1. 用戶在商戶APP中選擇商品,提交訂單商蕴,選擇微信支付芝发。
  2. 商戶后臺(tái)收到用戶支付單,調(diào)用微信支付統(tǒng)一下單接口(后臺(tái)處理部宿,客戶端不需要做)
  3. 統(tǒng)一下單接口返回正常的prepay_id瓢湃,再按簽名規(guī)范重新生成簽名后赫蛇,將數(shù)據(jù)傳輸給APP。參與簽名的字段名為appId落蝙,partnerId,prepayId筏勒,nonceStr管行,timeStamp,package捐顷。注意:package的值格式為Sign=WXPay 》显蓿客戶端拿到這些字段后就可以發(fā)起支付了叮姑。

二. APP端開發(fā)步驟

  1. 導(dǎo)入sdk包。微信支付sdk包
  2. 在調(diào)用api之前需要向微信注冊(cè)你的appid耘沼,代碼如下:
    { IWXAPI api; api= WXAPIFactory.createWXAPI(this, null); IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
    //xxx為你的appid
    msgApi.registerApp("xxx");}
  3. 調(diào)用微信api
    調(diào)后臺(tái)接口旷祸,將后臺(tái)返回的字段做如下處理:
    { PayReq req = new PayReq();
    req.packageValue = "package"; req.sign = "sign"; req.timeStamp = "timestamp"; req.appId = "appid"; req.nonceStr = "noncestr"; req.partnerId = "partnerid"; req.prepayId = "prepayid"; api.sendReq(req); }
    這些字段最好是在后臺(tái)獲取托享,不要放在本地。
  4. 在AndroidManifest.xml中配置以下權(quán)限:
    <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"/>
    開發(fā)者可參考 微信支付官方demo
  5. 支付結(jié)果回調(diào)
    參照微信支付demo赃绊,在net.sourceforge.simcpux.wxapi包路徑中實(shí)現(xiàn) WXPayEntryActivity類(包名或類名不一致會(huì)造成無(wú)法回調(diào))羡榴,在WXPayEntryActivity類中實(shí)現(xiàn)onResp函數(shù),支付完成后校仑,微信APP會(huì)返回到商戶APP并回調(diào)onResp函數(shù)迄沫,開發(fā)者需要在該函數(shù)中接收通知,判斷返回錯(cuò)誤碼羊瘩,如果支付成功則去后臺(tái)查詢支付結(jié)果再展示用戶實(shí)際支付結(jié)果。注意一定不能以客戶端返回作為用戶支付的結(jié)果逝她,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)。代碼示例如下:
    publicvoidonResp(BaseRespresp){ if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){ Log.d(TAG,"onPayFinish,errCode="+resp.errCode); AlertDialog.Builderbuilder=newAlertDialog.Builder(this); builder.setTitle(R.string.app_tip); }
    然后在配置文件中注冊(cè)WXPayEntryActivity
    <activity android:name=".wxapi.WXPayEntryActivity" android:label="@string/app_name" android:exported="true" android:launchMode= "singleTop" />
    返回值:
    0 :成功
    -1 :失敗近刘,可能原因:簽名錯(cuò)誤宁昭、未注冊(cè)APPID、項(xiàng)目設(shè)置APPID不正確疆拘、注冊(cè)的APPID與設(shè)置的不匹配寂曹、其他異常等。
    -2 :用戶取消漱挚,無(wú)需處理渺氧。發(fā)生場(chǎng)景:用戶不支付了,點(diǎn)擊取消白华,返回APP贩耐。

三. 開發(fā)中所遇到的問題

  1. 回調(diào)結(jié)果返回-1,首先檢查appid是否正確管搪,然后就是簽名問題了铡买,app的簽名必須是正式打包好的簽名,而且必須和微信開放平臺(tái)填的一樣奇钞。


應(yīng)用簽名的keystore要固定蛇券,否則簽名會(huì)不一樣。
安裝打包好的apk就可以調(diào)用微信了塘慕,但是在編譯器run的時(shí)候卻又還是返回-1蒂胞,這是因?yàn)榫幾g器run的是debug版的簽名,和正式的不一樣當(dāng)然會(huì)錯(cuò)了蛤织,但是每次調(diào)試都要打包一次嗎鸿染?這豈不是很麻煩...其實(shí)只要在build.gradle配置幾行代碼即可搞定:
signingConfigs{ release{storeFile file("C:/Users/dell/Desktop/xxx.jks") //該路徑為keystore的保存路徑 //以下3個(gè)根據(jù)你的keystore自行配置 storePassword "xxx" keyAlias "xxx" keyPassword "xxx"}

buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'} debug{ signingConfig signingConfigs.release}
這樣一來(lái)就可直接run了,非常方便調(diào)試

2 回調(diào)類名和包名

  • 回調(diào)類名必須是WXPayEntryActivity摊鸡,而且在該類中要實(shí)現(xiàn)IWXAPIEventHandler接口
  • 包名必須是你app包名+wxapi蚕冬。例如com.test.main.wxapi
  • WXPayEntryActivity必須放到該路徑下。
  • 如果與上述條件不一致很可能造成支付后無(wú)法回調(diào)猎提。如果你不想回調(diào)旁蔼,那么上述包名和類名可不創(chuàng)建,微信支付后會(huì)默認(rèn)返回當(dāng)前支付頁(yè)面蚓炬。如果想要支付成功后跳轉(zhuǎn)到別的頁(yè)面(例如訂單頁(yè))躺屁,那么則要?jiǎng)?chuàng)建。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驯击,一起剝皮案震驚了整個(gè)濱河市耐亏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暇矫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槽奕,死亡現(xiàn)場(chǎng)離奇詭異房轿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夯接,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門盔几,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凭需,“玉大人,你說(shuō)我怎么就攤上這事顺献】莶溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵肿轨,是天一觀的道長(zhǎng)蕊程。 經(jīng)常有香客問我,道長(zhǎng)驹暑,這世上最難降的妖魔是什么辨赐? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任掀序,我火速辦了婚禮,結(jié)果婚禮上不恭,老公的妹妹穿的比我還像新娘财饥。我一直安慰自己浑娜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布暴拄。 她就那樣靜靜地躺著,像睡著了一般乖篷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豁鲤,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天鲸沮,我揣著相機(jī)與錄音,去河邊找鬼楣号。 笑死怒坯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的视译。 我是一名探鬼主播归敬,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弄慰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陆爽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤别威,失蹤者是張志新(化名)和其女友劉穎省古,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豺妓,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琳拭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年白嘁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片絮缅。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耕魄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屎开,到底是詐尸還是另有隱情奄抽,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布额划,位于F島的核電站档泽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏馆匿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一阿逃、第九天 我趴在偏房一處隱蔽的房頂上張望恃锉。 院中可真熱鬧,春花似錦破托、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春敌呈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吭练。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鲫咽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谷异,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓箩绍,卻偏偏與公主長(zhǎng)得像尺上,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怎抛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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