最近項目進入中后期,開始接入支付。要求是使用微信支付,呵呵,好笑的是不知老板從哪里聽來的,居然和我說只要是熟手,接個微信支付兩小時搞定,我只能再次呵呵。先不說支付處理邏輯,而且公司本來也沒現成的接入模塊,再加上我對國內SDK的文檔水平,我只能說,前途必定是暗坑無數,還兩小時,除非是有現成接入模塊,外加不用寫支付后處理邏輯,配配參數了事的那種,否則哪有那么簡單。(如有大神兩小時內從無到有做完整個接入,加游戲相關處理邏輯,而且調式完成,請收下我的膝蓋!)
好了,扯遠了。進入正題。首先,這篇文章介紹的是H5游戲“移動”端接入。為什么要在這強調移動端,因為這里就有一個微信的暗坑!
支付方式
微信支付方式分類很混亂,我歸納如下
圖中,斜體的代表微信官方對其支付的渠道分類,紅色的因為我沒接過掃碼,和刷卡,不確定我這樣分類是否正確,所以下面就不討論掃碼和刷卡形式了。
可以看到,其實微信支付分量大類,一類是移動端APP支付,這個很好理解。另一大類就是公眾號支付,我們平時使用的一些第三方APP,網站中的微信支付,其實都是公眾號支付(貌似現在還有個微信買單,也是在公眾號之下的支付)。公眾號支付,其實都是通過H5網頁形式實現(掃碼,刷卡,不在討論范圍,以下同)。然后同樣是訪問H5網頁形式支付,微信分成兩種,一種是再微信內,也就是使用微信瀏覽器支付,另一種是微信外,也就是非微信瀏覽器然后調起微信客戶端APP進行支付。
講了這么多,是想告訴大家,選擇正確的支付方式,很重要,很重要,很重要!
實踐中遇到的問題
我接入的時候,就因為沒有太過注意,而導致被微信狠狠坑了一把
坑1:非APP支付和開放平台沒有關系
在接H5之前,我們剛好接過一個APP支付,所以接H5時,沒有多想,去微信開放平台注冊相關的信息,又是提交資料,又是等待審核,不亦樂乎。結果審核一通過,傻眼了,沒有支付接口,只有登錄接口。然后看支付文檔,發現支付時好多參數都是和公眾號有關的,然后又以為是要先申請公眾號支付,然后進行某種綁定,然后再屁顛顛的去申請公眾號支付,提交資料,等待審核。通過后開始接API。知道API調用后才發現,暈倒!實際H5網頁支付根本就不用申請開放平台。開放平台申請的appid,密鑰,在支付這塊根本沒用。
開放平台的AppId和密鑰只對授權登錄,獲取openId有用,而且只有在你不接支付的時候,才可以使用開放平台的授權登錄,因為支付的時候,用戶的openId是要靠公眾號授權的
也就是說,如果你要接支付,那么其實根本不用去開放平台申請一個網站應用,因為支付時的openid根本不是由這個應用的appid和密鑰獲取,而是用公眾號的appid和密鑰獲取。也許是我對開發文檔理解不夠透徹,但我真的想吐槽,微信不能在開放平台申請之前就告訴我沒有支付接口嗎,不能在開放文檔中清楚的提醒我們,網站應用實際是用公眾號支付,不能清楚的告訴我們網站應用的openid不能用來公眾號支付么?
坑2:trade_type
前面已經說了,如果要做網頁支付,只能用公眾號H5方式,不用在開放平台申請網站應用。然后,其實這事沒完,剛跳出一個巨坑,瞬間又進入一個坑(只能說我們同行的寫文檔水平都真的一般,國內國外的通病,反正大部分文檔寫的只有自己看的懂,別人看的雲里霧里和我們沒關系,我也是這樣吧,所以努力把文檔寫的明白點)。
我當時看,不是H5支付么,那么就去到微信支付商戶平台看文檔,我們從如下圖入口進入
然后看到如下的界面
注意紅框標出來的話,這里的意思是,如果你要獲得H5支付能力,還要進一步申請!發送到指定郵箱,這個申請算是半開放的那種。我當時雖然看到這段話,但是沒有多想,急不可待去看API調用了,事實證明,在這個文檔里的一系列接入方式其實和真正的微信接入方式非常相似,但是它會讓你把trade_type填成MWEB,結果,就杯具了,顯示”商戶無該產品開通權限”。網上有不少人遇到這個問題,答案都是讓大家檢查代碼,檢查公眾號設置,但往往設置,代碼都是對的。其實就是這個東西惹的禍,因為在你沒有進一步申請之前,MWEB這個方式是不能通過的。另外,這個文檔在獲取登錄openid時的code時的連接也是不同的。
MWEB對應非微信瀏覽器的公眾號H5支付,而微信瀏覽器的公眾號支付的trade_type時JSAPI。
而第一個連接是對應MWEB方式,第二個連接對應JSAPI方式。
這里我還是想吐槽下,為什么不能把紅框的話加個粗什么的突出說明呢,為什么就不能再進一步解釋下呢,或者將H5支付,和公眾號支付分開申請。
坑3:兩個不同的access_token
這個坑不是很大,不過不仔細,仍然會給我們造成很大麻煩。在微信中,存在兩個不同類型的access_token,普通類型access_token,和網頁授權登錄access_token。
不同的接口,所需要使用的token類型不同,但是很自然的是API文檔並沒有在每個接口出明確提醒我們應該使用什么類型的token(很好,大家給程序員呱唧呱唧!),一切看你的天資,理解很領悟。
微信只在某個和API接口不太相關的文檔頁面,偷偷告訴你,有兩個不同的類型,使用環境不一致。
我也沒有辦法給出全部的接口對應的是什么類型,畢竟我沒有把微信所有接口都接一遍,不過相信通過我的文章,我相應大家至少可以看出門道,拋磚引玉。就支付流程而言,授權登錄時,獲得的token是后者網頁授權登錄access_token,需要為每個用戶都獲取一個不同的token值。而在使用支付相關接口時,由於支付相關的功能,是由我們(第三方平台服務器)發起的,所以微信需要對我們的后台授予一個憑證,這個是普通類型access_token。我們的服務器將向微信發起請求,並獲得一個token,以保證我們的服務器可以正常訪問微信API,這個token,對於我們的服務器而言,只有一個。
無論是普通類型還是網頁授權類型的token,都是有時效的,超過時效,這個授權就失效了,我們需要重新請求。
到這里就先把大概的坑,和一些概念介紹下,接下來就開始從頭一步步接入支付了