1. 程式人生 > >記一次微信支付爬坑

記一次微信支付爬坑

微信支付-那些年填過的坑

由於最近專案需要用到微信支付,所以需要研究微信支付相關內容,微信支付本身不是什麼問題,只是過程比較繁瑣,前提工作需要準備充足方可開工,不然你會一個坑接著一坑的掉。

由於業務需要,需要pc端掃碼支付(掃碼支付)、微信公眾號端支付(公眾號支付)、app支付三種場景的支付,掃碼支付和公眾號支付都是可以支付到不同商戶,而app由於appid的限制無法支付到不同商戶(這裡的appid和商戶appid不是同一個概念)所以轉而研究h5支付,現在將這三種支付模式以及在支付中遇到的坑詳述如下。

首先說說微信支付時的準備工作。

這兩個地址後續會用到我這裡先給出。

微信支付功能需要到微信開放平臺上面開通之後方可使用,進入微信開放平臺如下圖所示可以看見微信支付選單欄

點選微信支付可以看到微信支付商戶號詳細資訊(這裡是已開通的微信支付)如下圖所示:

微信支付開通這裡就不累述了,申請微信支付按照步驟一步一步進行即可,到這裡算是開通微信支付功能了,算是邁出微信支付第一步後面還有九十九步等著你去趟。

接下來登入微信商戶平臺(在成功申請微信支付之後,微信會給你傳送一份郵件,郵件裡面包含商戶號、商戶登入密碼以及其他資訊),登入微信商戶平臺的地址如下(https://pay.weixin.qq.com )登入名和密碼都可以在郵件中找到,登入之後需要驗證一些列資訊,按照操作即可,這裡需要注意的兩點:

  • 驗證商戶

微信支付申請成功之後微信會給申請時用的公司公戶打一筆錢,一般是幾毛到幾分錢不等,在會計或出納那裡查到驗證即可

  • 設定api安全首先需要安裝操作證書,其次是設定api祕鑰,這個我本人感覺就比較坑,32位api祕鑰需要你手動輸入,而且還不能重複比如223322這種安全碼是不可以的,即使設定成功但在後續簽名時同樣會碰到簽名失敗問題,所以這裡最好是字母和資料組合不重複

接下來需要到

產品中心->開發配置中配置相應支付的支付條件

微信公眾號配置需要配置到你微信開發伺服器對應的域名下,注意這裡的域名必須通過icp備案,不然無法添,掃碼支付和h5支付同樣需要icp備案域名不然無法新增。做完以上步驟算是走完微信支付的一半工作內容,剩下就是碼碼程式碼即可。

掃碼支付有兩種模式,我選擇了第二種支付模式,

圖中紅線圈住的就是調起微信支付的地址,只需要生成二維碼,開啟微信支付掃一掃功能即可完成支付

這裡簽名錯誤可能有三種原因

  • 商戶號和商戶appid錯誤
  • 設定的key也就是api祕鑰不正確,api密碼不正確也有兩種情況
  1. 設定本身有問題,比如設定重複字元111222333之類的
  2. 在簽名時的key不對或者壓根就沒有新增key
  • 引數傳遞有誤。引數一般傳遞錯誤會出現以下幾種情況
  1. 終端IP spbill_create_ip  APP和網頁支付提交使用者端ip,Native支付填呼叫微信支付API的機器IP。
  2.  交易型別 trade_type  JSAPI--公眾號支付、NATIVE--原生掃碼支付、APP--app支付,
  3. 商品ID product_id   trade_type=NATIVE時(即掃碼支付),此引數必傳。此引數為二維碼中包含的商品ID,商戶自行定義。

以上三點在做掃碼支付時需要重視,不然坑你沒商量,到此微信支付掃碼支付算是搞定,後續還需要完善。

接下來講一下公眾號支付

因為公眾號本來就是在微信裡面,所以公眾號支付也相對比較簡單,也不存在分賬問題,只是需要開通一個商戶需要申請一個微信商戶平臺,比較麻煩,後續公司要是有時間可以自行開發微信支付後臺,統一管理商戶,實行劃賬。

微信公眾號支付需要先申請微信服務號,唯有微信服務號才可以開通微信支付功能,其他暫時無法實現。申請微信服務號這裡就不在講述,公眾號支付配置前面也講過了,需要配置支付安全目錄

也就是在開發微信公號時繫結的域名。從下載的demo中找到相對應的程式碼複製貼上,複製貼上,複製貼上即可完成支付那是不可能的。這裡坑就比較多了,首先需要獲取openid,每一個微信公眾號對應的使用者的openid是不一樣的,之前一直存在誤區,還以為一個openid可以應對所有微信公眾號,知道後來才發現並不是想象中那麼美好,微信為了區分使用者,openid和微信公眾號是一一對應的,也就是說一個微信公眾號對應一個openid,這個坑差點沒坑吐我,我還在傻傻的用光放demo提供的案例在支付,直到後來公司前端(穆帥)出手相助,我才發現世界還是挺美好的。

我先將公眾號支付業務流程貼出來

業務流程也比較簡單,我就不詳細講解了。

在所有資訊都正確之後,微信會返回以下引數:

用返回的引數構造如下引數返回給微信公眾號端

引數大小寫,引數順序不可隨意變更(這裡是用c#編寫的程式碼)

注意微信公眾號支付的坑比較多,大致有一下幾點

  • openid獲取不正確,導致簽名失敗
  • 未設定正確的支付授權目錄、導致簽名失敗
  • 未設定正確的api安全碼(key)、導致簽名時報
  • Package格式錯誤 package 的value必須為prepay_id=xxx
  • 返回引數大小寫和官方給出文件不一致,導致簽名錯誤
  • 微信公眾號支付需要兩次簽名,一次是在統一下單時,一次是在給客戶端返回訂單資訊時

以上幾點大致就是在做微信公眾號支付是遇到的坑,可能坑不是很全乎,大家在具體做的時候在具體對待吧

最後一種h5支付

H5支付不像其他那些支付,申請好微信支付動手做就ok了,h5支付需要在微信商戶平臺開通h5支付功能之後才可以動手做,所以這裡就比較坑了,為啥不一次性開通,還的在花費三四天時間開通呢?

在開通h5支付的時候需要提供h5相關頁面,同樣也需要是icp備案過後的域名才行,這裡又坑四五天時間,所以說微信支付功能原本工作量比較小,但是東開通這,西開通那花費時間就不可估量了,由於h5支付在手機app上是不存在分賬的,所以就用h5開發了。注意在申請h5支付的時候所有資訊都必須和之前申請微信公眾號的資訊一致,網站主體、兜售資訊、域名資訊都必須和申請微信公眾號的資訊一致,不然無法通過h5申請,在申請好h5支付之後就可以開始動手做事了。

按照官方給出的demo,調起統一下單介面,返回所需引數,這裡在調起統一下單介面傳遞引數需要注意幾點

  • appid 這裡的appid並不是應用appid 而是微信公眾號appid
  • spbill_create_ip  必須傳正確的使用者端IP,詳見獲取使用者ip指引
  • scene_info  

//安卓移動應用
{"h5_info": {"type":"Android","app_name": "王者榮耀","package_name": "com.tencent.tmgp.sgame"}}

注意 type 為需要填寫ios

 第四、trade_type  H5支付的交易型別為MWEB

在所有資訊都正確之後微信會返回一下引數

其中紅線所圈為調起微信支付的連結地址,在返回改地址之後只需要呼叫該地址完成支付便可,這裡又有一個坑需要注意一下,手機端在調起支付時需要構建referer頭部請求不不然無法調起微信支付,在mui中構建如下程式碼所示:

這裡同樣需要注意:referer的值為在申請h5支付時候的icp備案域名地址,如若填寫不正確,構建不成功

在做h5支付一般會遇見如下問題

  • 網路環境未能通過安全驗證,請稍後再試

1. 商戶側統一下單傳的終端IP(spbill_create_ip)與使用者實際調起支付時微信側檢測到的終端IP不一致導致的,這個問題一般是商戶在統一下單時沒有傳遞正確的終端IP到spbill_create_ip導致,詳細可參見客戶端ip獲取指引

2. 統一下單與調起支付時的網路有變動,如統一下單時是WIFI網路,下單成功後切換成4G網路再調起支付,這樣可能會引發我們的正常攔截,請保持網路環境一致的情況下重新發起支付流程

第二、商家引數格式有誤,請聯絡商家解決

1. 當前調起H5支付的referer為空導致,一般是因為直接訪問頁面調起H5支付,請按正常流程進行頁面跳轉後發起支付,或自行抓包確認referer值是否為空

2. 如果是APP裡調起H5支付,需要在webview中手動設定referer,如(
Map extraHeaders = new HashMap();
extraHeaders.put("Referer", "商戶申請H5時提交的授權域名");//例如 http://www.baidu.com ))

第三、商家存在未配置的引數,請聯絡商家解決

1,當前調起H5支付的域名(微信側從referer中獲取)與申請H5支付時提交的授權域名不一致,如需新增或修改授權域名,請登陸商戶號對應的商戶平臺--"產品中心"--"開發配置"自行配置
2,如果設定了回跳地址redirect_url,請確認設定的回跳地址的域名與申請H5支付時提交的授權域名是否一致

  • 請在微信外開啟訂單,進行支付

  • IOS:簽名驗證失敗
    安卓:系統繁忙,請稍後再試

到此微信支付三種場景的應用算是基本完成,自己挖的坑自己跪著也要填平,剛開始做的時候的確是一頭霧水,後來在各位大神的幫助下恍然大悟,所以說在難得事只要敢於摸索,敢於探究就沒有解決不了的問題。自己做微信支付開發的一點經驗,如若有錯還懇請各位批正。