在App中對(duì)接微信和支付寶

目錄

準(zhǔn)備工作

微信登錄和支付

支付寶登錄和支付

對(duì)比

準(zhǔn)備工作

微信

注冊(cè)微信開放平臺(tái),成為開發(fā)者(開發(fā))

微信開放平臺(tái)

注冊(cè)你的App,會(huì)給你一個(gè)AppId和AppSecret

AppID和AppSecret

注冊(cè)微信商戶平臺(tái),成為商戶(收錢)

微信商戶平臺(tái)

會(huì)給你一個(gè)商戶ID

商戶ID

共有三個(gè)ID:AppID、AppSecret、PID

支付寶

注冊(cè)螞蟻金服開放平臺(tái),成為開發(fā)者(開發(fā))

開放平臺(tái)

開放平臺(tái)會(huì)給你的App一個(gè)AppId(支付寶沒(méi)有AppSecret)

AppId

注冊(cè)螞蟻金服商家中心,成為商家(收錢)

商家中心

商家中心會(huì)給你一個(gè)商家ID

商家ID

共有兩個(gè)ID:AppID、PID

微信登錄和支付

開放平臺(tái)創(chuàng)建應(yīng)用

首先,你在微信開放平臺(tái)上要有自己的應(yīng)用

應(yīng)用上開放平臺(tái)

平臺(tái)會(huì)讓你上傳你的App的logo,名稱,簡(jiǎn)述什么的,因?yàn)檫@些在你調(diào)用微信App的時(shí)候用得著。

微信登錄

微信第三方授權(quán)登錄

首先,要在開放平臺(tái)中為你的App申請(qǐng)相關(guān)接口(微信登錄是默認(rèn)開放給你的)

開放平臺(tái)申請(qǐng)接口功能

然后,就是代碼工作了。

我是用ShareSDK套件統(tǒng)一實(shí)現(xiàn)的微信登錄,集成ShareSDK的方法見(jiàn)在App中集成ShareSDK

登錄過(guò)程就是調(diào)用ShareSDK的函數(shù),傳入微信登錄的參數(shù)

調(diào)起ShareSDK登錄

然后,用一個(gè)listener去監(jiān)聽登錄授權(quán)

登錄授權(quán)

這個(gè)listener會(huì)監(jiān)聽到一個(gè)Platform對(duì)象,從Plateform對(duì)象中可以取出用戶id、昵稱、頭像等

取出用戶信息

so easy

多么美好

微信支付

微信第三方支付

支付的基本流程

實(shí)現(xiàn)微信支付,流程上比登錄復(fù)雜多了,具體流程如下:

1.授權(quán)

微信第三方支付是需要去開放平臺(tái)申請(qǐng)權(quán)限的:

申請(qǐng)微信支付

2.簽約

相關(guān)的商家需要去在線簽約:

簽約

3.文檔

微信在官方文檔中提供了很多種支付方式,我們使用的是其中的App支付:

多種支付方式

查看微信App支付官方文檔

根據(jù)官方文檔,支付流程如下:

微信支付流程

看起來(lái)很復(fù)雜,其實(shí)大概分這么幾步:

1.你的業(yè)務(wù)服務(wù)器和微信后臺(tái)交互生成訂單,微信后臺(tái)給業(yè)務(wù)服務(wù)器一個(gè)預(yù)交易訂單號(hào)

(微信后臺(tái)準(zhǔn)備好支付數(shù)據(jù))

2.你的業(yè)務(wù)服務(wù)器給你的App預(yù)交易訂單號(hào)

(你的后臺(tái)通知你的App去調(diào)起微信支付)

3.你的App調(diào)起微信App支付,把預(yù)交易訂單號(hào)傳給微信App

(你的App發(fā)起微信App支付)

4.微信App告知你的App支付完成,微信后臺(tái)告知你的業(yè)務(wù)服務(wù)器支付完成

(App對(duì)App,后臺(tái)對(duì)后臺(tái))

整個(gè)故事情節(jié)大概是這樣的

支付故事情節(jié)

需要注意的是,微信官方文檔有這么一句話:

注意一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)。

就是說(shuō),你的App只負(fù)責(zé)觸發(fā)下一步業(yè)務(wù)流程,是否支付成功要以你的業(yè)務(wù)服務(wù)器收到的通知為準(zhǔn)。

支付的具體實(shí)現(xiàn)

代碼實(shí)現(xiàn)上,微信的官方文檔說(shuō)的挺明白的,照做吧:

1.在gradle里添加引用

添加引用

2.初始化一個(gè)IWXAPI實(shí)例

初始化IWXAPI

3.利用IWXAPI實(shí)例去請(qǐng)求調(diào)起支付

調(diào)起支付

4.實(shí)現(xiàn)一個(gè)給微信支付回調(diào)的Activity

回調(diào)Activity

在支付完成時(shí),微信App會(huì)自動(dòng)打開這個(gè)回調(diào)Activity,如果你沒(méi)有定義這個(gè)Activity的外觀,你會(huì)發(fā)現(xiàn),手機(jī)白屏了

白屏

你可以好好畫畫這個(gè)Activity的界面,也可以不去管它,在完成下面的操作后,直接關(guān)掉。

這個(gè)回調(diào)Activity,主要功能是接收微信反饋的支付結(jié)束事件

接收支付反饋

反饋的BaseResp對(duì)象沒(méi)啥有用信息,因?yàn)槲⑿诺腁pp支付接口純粹是個(gè)觸發(fā)器,只能用來(lái)通知支付結(jié)束,你從它的反饋信息里,無(wú)法得到訂單號(hào)。

那業(yè)務(wù)服務(wù)器怎么知道是哪個(gè)訂單完成了支付呢?

你的App和業(yè)務(wù)服務(wù)器自己想辦法吧。

我能怎么辦,我也很無(wú)奈啊

支付寶登錄和支付

【高能預(yù)警】支付寶的文檔,真的超級(jí)爛!超級(jí)爛!超級(jí)爛!可以信任它的支付,不可以信任它的文檔!

【嚴(yán)正警告】除了你抓到的真實(shí)數(shù)據(jù),不要相信支付寶的官方文檔和Demo代碼,要小心支付寶!要小心支付寶!要小心支付寶!

開放平臺(tái)創(chuàng)建應(yīng)用

首先,你在螞蟻金服開放平臺(tái)上要有自己的應(yīng)用

應(yīng)用上開放平臺(tái)

平臺(tái)會(huì)讓你上傳你的App的logo,名稱,簡(jiǎn)述什么的,因?yàn)檫@些在你調(diào)用支付寶App的時(shí)候用得著。

支付寶登錄

支付寶第三方登錄

ShareSDK里沒(méi)有集成支付寶登錄,我們需要自己實(shí)現(xiàn)。

登錄的基本流程

1.授權(quán)

首先,你要去開放平臺(tái)請(qǐng)求授權(quán)

進(jìn)入螞蟻金服開放平臺(tái)

每個(gè)App有對(duì)應(yīng)的授權(quán)功能列表

在開放平臺(tái)為你的App申請(qǐng)授權(quán)

點(diǎn)擊圖中右上角的“繼續(xù)添加”,可以看到支付寶提供的接口列表,其中有很多迷惑性的名字,要選擇恰當(dāng)?shù)慕涌诜?wù),我們需要選擇的是App支付寶登錄

選擇恰當(dāng)?shù)慕涌诜?wù)

2.簽約

很多服務(wù),是需要簽約之后才能生效的

簽約后生效

簽約過(guò)程需要一定的周期,而且需要公司相關(guān)人員出面

簽約流程

3.文檔

是的,雖然支付寶的文檔很爛,但是,原始文檔還是要看的,App支付寶登錄產(chǎn)品介紹

把里面的流程圖摘出來(lái)

支付寶授權(quán)登錄流程

眼花了是不是?梳理一下步驟:

1.你的App調(diào)起支付寶App授權(quán),用戶確認(rèn)后,支付寶App返回一個(gè)openid和authcode

(支付寶App認(rèn)可你,給你兩樣?xùn)|西,一個(gè)是用戶id,一個(gè)是安全信物)

2.你拿著authcode向支付寶后臺(tái)服務(wù)換一個(gè)token

(因?yàn)槟阌邪踩盼铮灾Ц秾毢笈_(tái)也認(rèn)可你)

3.有了這個(gè)token,其實(shí)你就有權(quán)限去做很多事情了,比如,再去支付寶后臺(tái)查查用戶的昵稱,頭像什么的,對(duì)應(yīng)的接口是支付寶用戶信息查詢接口(這是一個(gè)后臺(tái)接口,我也是在后臺(tái)做的查詢)

(因?yàn)橹Ц秾毢笈_(tái)認(rèn)可你,所以你可以去后臺(tái)查詢用戶的昵稱和頭像)

整個(gè)流程涉及到你和支付寶雙方的App,雙方的后臺(tái)服務(wù)器,故事情節(jié)大概可以這樣理解

登錄故事情節(jié)

這個(gè)故事還有另外一個(gè)版本:

支付寶:“你要用戶ID,還要登錄?好啊,沒(méi)問(wèn)題”

支付寶:“神馬?你要用戶昵稱和頭像?保安!保安!保安!...”

登錄的具體實(shí)現(xiàn)

在調(diào)起支付寶App登錄時(shí),其實(shí)就是從我們的App里調(diào)用支付寶App一個(gè)接口函數(shù)的過(guò)程,大概分三步:

1.準(zhǔn)備函數(shù)的參數(shù)(按照規(guī)定的格式,拼出一個(gè)請(qǐng)求的String)

2.調(diào)用函數(shù)(支付寶接口中AuthTask的authV2)

3.接收函數(shù)的返回值(一個(gè)Map),從中取出authcode和用戶openid

步驟很簡(jiǎn)單吧,支付寶還貼心的提供了demo代碼,具體流程是這樣的

1.用開放平臺(tái)給你的AppId,商戶PId,RSA私鑰一起,拼出請(qǐng)求的String

拼出授權(quán)參數(shù)

最終拼出來(lái)的authInfo大概長(zhǎng)這個(gè)樣子

authInfo

2.調(diào)用AuthTask的authV2函數(shù)

調(diào)用授權(quán)函數(shù)

3.把返回的Map映射為AuthResult函數(shù),從中取出authcode和用戶id

獲取返回值

當(dāng)然這個(gè)過(guò)程是異步的,看起來(lái)很簡(jiǎn)單是吧?可是,當(dāng)我們仔細(xì)觀摩支付寶官方Demo代碼的時(shí)候,我們就會(huì)發(fā)現(xiàn)...

坑...

demo代碼里有這樣一段話

一段提示

也就是說(shuō),第一步是錯(cuò)的,你不要自己去拼參數(shù),因?yàn)槟愕?b>App不能持有RSA私鑰!

為什么?因?yàn)椴话踩。琑SA私鑰放在App里,攻擊者很容易通過(guò)逆向你的App來(lái)搞出你的RSA私鑰,所以這幾乎就相當(dāng)于面向社會(huì)公開了你的銀行卡密碼啊

那你怎么獲取這個(gè)參數(shù)呢?也就是這個(gè)authInfo呢?

authInfo

我們看authInfo里面的這些字段,其實(shí)就是sign需要用到RSA加密,而sign又是安全不可逆的,所以我們可以向我們自己的業(yè)務(wù)服務(wù)要這個(gè)sign。

那么業(yè)務(wù)服務(wù)器是怎樣生成的這個(gè)sign呢?

業(yè)務(wù)服務(wù)器保存有RSA嘍...

業(yè)務(wù)服務(wù)器,請(qǐng)你一定要安全啊...

萬(wàn)古長(zhǎng)青

支付寶支付

支付寶第三方支付

支付的基本流程

1.授權(quán)(參考登錄)

2.簽約(參考登錄)

3.文檔(參考登錄,這次的官方文檔位置在App支付

根據(jù)官方文檔,App支付的流程是這樣的:

支付流程

我再來(lái)梳理一下步驟,梳理一下步驟:

1.你的業(yè)務(wù)服務(wù)器做好訂單信息,安全簽名后發(fā)給你的App

(你的業(yè)務(wù)服務(wù)器負(fù)責(zé)RSA加密)

2.你的App拿著訂單信息,去請(qǐng)求支付寶App支付

(支付寶App解密訂單信息,確認(rèn)訂單安全)

3.支付寶App通知你的App支付完成;同時(shí),支付寶后臺(tái)服務(wù)通知你的業(yè)務(wù)服務(wù)器支付完成)

(App對(duì)App,后臺(tái)對(duì)后臺(tái))

整個(gè)流程涉及到你和支付寶雙方的App,雙方的后臺(tái)服務(wù)器,故事情節(jié)大概可以這樣理解

支付故事情節(jié)

需要注意的是,支付寶官方文檔里有這么一句話:

同步返回的數(shù)據(jù),只是一個(gè)簡(jiǎn)單的結(jié)果通知,商戶確定該筆交易付款是否成功需要依賴服務(wù)端收到支付寶異步通知的結(jié)果進(jìn)行判斷

這句話的意思就是說(shuō),雖然你的App也會(huì)收到反饋,但是必須以業(yè)務(wù)服務(wù)器為準(zhǔn)

你的App收到支付成功的反饋,其實(shí)是用來(lái)觸發(fā)下一步業(yè)務(wù)操作的

支付的具體實(shí)現(xiàn)

支付的具體實(shí)現(xiàn)如下:

1.業(yè)務(wù)服務(wù)器發(fā)訂單信息到你的App,你可能會(huì)給服務(wù)器開放一個(gè)這樣的接口:

public void payAli(String orderinfo) {...}

2.你的App調(diào)用支付寶的接口

Map result = alipay.payV2(orderInfo, true);

3.你的App收到支付結(jié)束的通知,從支付寶App的返回值中尋找自己需要的數(shù)據(jù)

支付寶App返回信息

然后,你就可以告訴你的業(yè)務(wù)服務(wù)器:

“哥,支付寶App剛剛跟我說(shuō),他們給過(guò)錢了”

你的業(yè)務(wù)服務(wù)器很可能會(huì)問(wèn)你:

“給錢的是靠墻的那桌,還是靠窗的那桌?”

你說(shuō):

“我...我找找”

然后,你就會(huì)栽進(jìn)坑里...

自求多福

要小心支付寶!

關(guān)于支付結(jié)果的一個(gè)坑

前面說(shuō)過(guò),App支付時(shí),需要異步調(diào)起一個(gè)PayTask執(zhí)行支付操作,真正執(zhí)行支付的是這行代碼:

Map result = alipay.payV2(orderInfo, true); //執(zhí)行支付操作

result就是支付寶反饋給App的支付結(jié)果,在(成功/失敗/超時(shí)/取消)支付操作后,我們把這個(gè)Map通過(guò)Message傳遞給Handler,Handler里會(huì)把這個(gè)Map映射為PayResult對(duì)象,根據(jù)PayResult去處理后續(xù)邏輯。

根據(jù)支付寶官方文檔及Demo代碼,我們通過(guò)PayResult對(duì)象的ResultStatus(=9000)就可以判斷是否支付成功,交易訂單號(hào)也可以從PayResult中找到,但是這里有個(gè)潛在的大坑:如何獲取交易訂單號(hào),支付寶并沒(méi)有做完全的說(shuō)明,事實(shí)上:

--當(dāng)交易成功時(shí),我們要從PayResult的result字段中獲取成功交易信息(但是,交易失敗時(shí)result字段為空,而且官方文檔沒(méi)有提到這一點(diǎn)

--當(dāng)交易失敗時(shí),我們要從PayResult的memo字段中獲取原始交易信息(但是,官方文檔沒(méi)有確認(rèn)這一點(diǎn))

--當(dāng)交易取消時(shí),PayResult的result字段為空,memo字段值為“操作已取消”

而且我們不能根據(jù)這個(gè)現(xiàn)象做決策,還記得嗎,要小心支付寶!要小心支付寶!要小心支付寶!

對(duì)自己負(fù)責(zé)任的做法是,在支付的一開始,就要對(duì)支付寶的不靠譜有所防備,我的做法是,在異步執(zhí)行PayTask的時(shí)候,我自己把原始支付信息記錄下來(lái),因?yàn)樵贾Ц缎畔⑹俏覀冏约旱暮笈_(tái)業(yè)務(wù)服務(wù)器發(fā)給我們的,在與支付寶的合作中,只有我們自己人是可信賴的,所以原始信息是可信賴的,我從原始信息中取出交易訂單號(hào),放進(jìn)Map里,哪個(gè)Map?這個(gè)Map:

Map result = alipay.payV2(orderInfo, true); //執(zhí)行支付操作

在這行代碼下,我會(huì)向Map中增加一條信息,就是我們自己的后臺(tái)業(yè)務(wù)服務(wù)器發(fā)給我的原始支付信息。

這樣的話,原始支付信息會(huì)在Map中,隨著Message一起發(fā)給處理支付結(jié)果的Handler。

Handler仍然會(huì)把Map轉(zhuǎn)換為PayResult

而我會(huì)這樣獲取交易訂單號(hào):

1.先從PayResult的result字段中,嘗試解析支付寶的成功交易信息

成功交易信息

2.如果上一步取到的結(jié)果為空,就從Map中取出我們的原始交易信息

原始交易信息

實(shí)際上就是加一層保險(xiǎn),以確保可以獲取到交易訂單號(hào)

如果有人問(wèn),為什么不根據(jù)交易成功或失敗,分別從PayResult的result或memo中獲取交易信息?

我只能說(shuō),too naive,這可是文檔超級(jí)爛的支付寶,你可以信任它的支付,不可以信任它的文檔

我最后說(shuō)一遍,要小心支付寶!要小心支付寶!要小心支付寶!

關(guān)于支付寶沙箱

支付寶在螞蟻金服的官方開放平臺(tái)提供了一個(gè)貌似很有用的沙箱環(huán)境,可以在沙箱中模擬支付行為。

支付寶沙箱環(huán)境

這個(gè)沙箱呢,其實(shí)還是挺有用的,這個(gè)測(cè)試環(huán)境會(huì)提供一套虛擬的賬戶,用來(lái)模擬交易行為,幫助檢查你的接口寫得有沒(méi)有問(wèn)題(支付寶:反正給你沙箱了,文檔我就隨便寫寫吧)。

支付寶沙箱的測(cè)試賬號(hào)

另外,你順便還可以在沙箱里體驗(yàn)一下,擁有1/10個(gè)億,是什么感覺(jué)...

1/10個(gè)小目標(biāo)

當(dāng)然,支付寶沙箱提供了對(duì)應(yīng)的沙箱App

支付寶沙箱的沙箱版App

不過(guò),等你興沖沖去下載的時(shí)候,你會(huì)發(fā)現(xiàn),沙箱App只提供Android版,而且...

沙箱版App基本沒(méi)什么功能

這個(gè)沙箱App,基本沒(méi)啥用啊!沒(méi)啥用啊!!沒(méi)啥用啊!

坑,無(wú)處不在...

沒(méi)錯(cuò),如果你要在App中對(duì)接支付寶登錄和支付寶支付,沙箱環(huán)境跟你是沒(méi)有關(guān)系的,后臺(tái)能用上沙箱環(huán)境,至于App端么...

還是老老實(shí)實(shí)等真實(shí)線上環(huán)境搭好,用1分錢大法來(lái)測(cè)試吧...

1分錢大法

對(duì)比

ID

微信需要三個(gè)ID:AppID、AppSecret、PID

支付寶需要亮哥ID:AppID、PID

多平臺(tái)跳轉(zhuǎn)

微信過(guò)于分散,從開放平臺(tái)就不容易跳轉(zhuǎn)到商戶平臺(tái)

螞蟻金服集中的比較好,各平臺(tái)互相跳轉(zhuǎn)地很舒服

引用

微信使用gradle引用;支付寶使用jar包引用

登錄

微信登錄已經(jīng)集成在ShareSDK了;支付寶沒(méi)有集成

支付

雙方都要求以服務(wù)器收到的信息為準(zhǔn),但是微信要求的更徹底,微信的返回值連訂單號(hào)都沒(méi)有

調(diào)微信App支付時(shí),你的App不知道訂單號(hào)(預(yù)交易訂單號(hào)不是訂單號(hào));調(diào)支付寶App支付時(shí),你的App知道訂單號(hào)(而且知道詳細(xì)的交易信息)

微信App是通過(guò)接口回調(diào)異步反饋的;支付寶App是通過(guò)函數(shù)返回值異步反饋的

微信主要通過(guò)后臺(tái)對(duì)后臺(tái)的方式傳遞訂單和支付信息;支付寶則是主要通過(guò)App

(如果說(shuō)支付行為好像是上樓簽合同的話,在微信App支付里,你的后臺(tái)是那個(gè)上樓送合同的人,你的App只是個(gè)按電梯開關(guān)的;在支付寶App支付,你的App是那個(gè)拿著合同上樓的人)

微信先通過(guò)后臺(tái)完成支付,然后通知App;支付寶先通過(guò)App完成支付,然后后臺(tái)跟進(jìn)

微信支付成功會(huì)跳轉(zhuǎn)Activity(要自己寫);支付寶是純邏輯處理

分享

都在ShareSDK中集成了

文檔

微信的文檔結(jié)構(gòu)是這樣的

微信文檔

支付寶的文檔結(jié)構(gòu)是這樣的

支付寶文檔

看起來(lái)好像差不多,但是你真正用過(guò)之后就會(huì)發(fā)現(xiàn),這就是兩種文檔,它們之間的區(qū)別是這樣的:

文檔之間的區(qū)別
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,556評(píng)論 25 708
  • 自己總結(jié)的微信支付寶支付流程和注意點(diǎn): 準(zhǔn)備工作: 需要公司的營(yíng)業(yè)執(zhí)照,稅務(wù)信息,等老板的身份證信息等,我記得,用...
    Www劉閱讀 18,590評(píng)論 2 50
  • 實(shí)現(xiàn)支付寶支付的準(zhǔn)備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后,支付寶會(huì)提供一些必要的數(shù)據(jù)給我們 商戶...
    Anson楊春安閱讀 8,263評(píng)論 0 6
  • 準(zhǔn)備工作: 需要公司的營(yíng)業(yè)執(zhí)照,稅務(wù)信息,等老板的身份證信息等,我記得,用這些材料,去支付寶注冊(cè)一個(gè)商家賬戶(審核...
    Hevin_Chen閱讀 6,824評(píng)論 0 9
  • 文/一木釘 早上,打開微課,無(wú)戒早已上線。這會(huì)兒,才知道這兩天的周末時(shí)光,好像發(fā)生了什么大事件,而我這個(gè)忙于家務(wù)和...
    一木釘閱讀 642評(píng)論 8 12