感覺很多程序都是只要一有關錢這一方面,就磨磨唧唧,文檔也寫的簡直了!
前排提示:微信文檔坑很多,在沒有前輩或者有經驗的情況下,千萬不要死懟代碼,以及一個人思考,最好遇到問題直接去找微信客服,發郵箱就發郵箱嘛~~~
微信openId那一塊,磨磨唧唧的弄完后,明明APP還沒有支持會員系統,就已經叫我去弄微信支付充值會員了~~~(什么鬼~~~)
看了兩天微信文檔,結果翻來翻去就那兩種方法,簡直無奈啊~~~
其一:JS-SDK,文檔接口https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

這種方式跟微信分享那一塊差不多,先插入JS文件http://res.wx.qq.com/open/js/jweixin-1.2.0.js,這個是動態網站,直接添加就是了!
然后自己先弄一個簽名,簽名怎么弄呢,其實問下文檔附錄1寫的很清楚的!如圖

簽名需要jsapi_ticket,而jsapi_ticket需要通過access_token獲取,access_token的獲取方式就是一個坑了,微信授權那有一個access_token,而基本配置那也有一個access_token,兩個token,我們獲取的當然不會是授權的那個了(什么!你說為什么不是授權的那個?TM我測試的十幾次,我當然知道了~~~~~~)
基本配置那的access_token獲取方式非常簡單,知道APPID,和APP密碼(開發者ID和開發者密碼),調用微信提供的API接口就可以返回你需要的access_token了!
文檔接口:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

咋一看是不是很簡單,然后呢,這又是一個坑!access_token獲取是不能在前台上獲取的,因為在前台獲取的話,APPID和appsecret都能被人看到的,為了安全起見,也就是保險,這個只能在后台獲取,接口參數這些也很簡單,跟后台吱呼一聲,讓他寫個接口,然后我們這邊調用獲取到access_token后就更簡單了,直接調微信接口按照參數把access_token寫進去就能獲取到我們需要的jsapi_ticket了!
接口格式: https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

然后值得注意的就是access_token和jsapi_ticket的存在時間都是7200秒也就是2小時。最好是叫后台獲取到access_token后在服務器端緩存一下,不然會造成數據流失異常(但是這個異常我到現在都沒有遇到過~~~~)!
有了jsapi_ticket后,我們就要進入另一個微信坑了,簡直就是天坑啊,簡直了~~~~

話不多說,直接上圖,簽名~~~,前端簽名這個東東是真的惱火,但是這塊倒也不是很難,現在網上找幾個封裝好了的時間軸方法,隨機數方法,然后按照ASCII從小到大排序,基本上也可以獲取的到。
接下來就是另一個坑人游戲了,統一下單!
文檔入口:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
統一下單最開始我還以為也是前端調用接口,然后獲取的,直到無論如何都獲取不到后,各種度娘文檔論壇發現都是后台獲取的,然后我一臉懵逼的交給了后台,才發現,原來事情並不是那么簡單!

看到沒有!看到我話紅線的地方沒有?上面寫的什么?開戶成功后,要想進行微信支付,必須要接入沙箱測試,驗收完沙箱的所有用例后,才能進行審核,審核完畢后才可以進行正式的上/下交易~~~~
這說明了什么,說明必須要用沙箱測試,用沙箱測試制造假的key用假的key調用統一下單,調用完下單后,收到微信返回的數據sign,然后用sign再進行一次簽名,然后再將簽名給前台,然后...........然后就一臉懵逼了.......
用沙箱是的的確確調用統一下單能夠成功返回的,但是呢,但是統一下單返回數據中最重要的prepay_id參數用於是錯的,永遠只有22位,少了后面的total_fee以及一些其他參數的拼裝集合!

然后我和后台java就一臉懵逼了,各種測試,各種鼓膜,各種度娘,永遠是錯,一直到我這邊實在熬不住了去找微信客服,然后微信客服又叫我發郵件去他們那邊的技術相關~~~然后收到了一條回信!!

這是什么意思???什么鬼,微信文檔寫着必須走沙箱,測試全部通過才能走正式,微信技術支持說,管毛的沙箱,直接走正式環境~~~~~~辣子的時間啊,辣子的腦細胞啊~~~~~
一場鬧劇鬧了整整一周的時間,我能說什么~~~
然后統一下單需要注意的一點

是微信公眾號支付的話openId是必須傳入的,否則微信無法確認是公眾號對應的是哪一個用戶!
還有就是我們前端這邊,第一步完成后,第二部傳入的prepay_id的格式必須是package:"=***********";
只要格式不對,就一定會報錯!

然后這里的paySign也是一個坑,這里的paySign很容易讓人誤解是統一下單中的sign返回參數,其實不然,統一下單返回的參數中,我們只用得到prepay_id這個,
其他的對於我們前台來說,一個也沒用,這里的paySign是支付簽名,由后台用統一下單的簽名方式生成!千萬不要搞錯

然后我們這邊的微信簽名接口對應的參數,全部都是最后一次后台簽名paySign中對應的參數!
這些全部獲取好了,直接按照微信文檔格式寫就OK~~~~
這是第一種方式,而第二種方式確實沒什么區別,只是不需要那么繁瑣,直接調用然后完成就OK!但是最后需要的參數,跟第一種方式也是一樣的,后台代碼不會有改變!

第二種只是接口名不一樣,然后要傳入的參數多一個APPID其他的全部都跟第一種需要的參數和獲取方法一模一樣!
這邊是我寫的:

畫紅線的地方是絕對需要再三檢查的,只要格式有一丁點不對勁,都一定會錯。
然后我這里有一個非常好檢查錯誤的方法,微信公眾號支付一定要用IOS來測試。

IOS會根據如圖從上到下的順序報錯~~~~~~~
最后再說一次,千萬不要用沙箱測試,那玩意有毒,用了永遠報錯,直接走正式環境~~~~~