前提: 1、小程序已經注冊完畢,各種服務器環境、https等已經配置好。 2、你們是前后台合作,后台給主要給我們提供相應的數據、因為有些接口請求后台做要比我們做要簡單,其實我更認為是小程序只有1M,更多的東西給后台吧
正題: 一、參考: 1、http://www.cnblogs.com/jcscript/p/6126722.html 2、http://www.weixinapphome.com/topic/28 注釋:第二個是根據第一個做的一篇文章,這兩個都是前端實現支付發起和調用的 我的而是把支付發起和支付分開到前后分別處理。請繼續。。。
我標記了3點需要我們注意: 第一:1、屬性package的參數值是package:'prepay_id=wx211262323463265451' 第二:2、這個簽名需要我們注意,簽名方式是把所有參數拼接成url格式再進行MD5編碼 第三:3、這個是支付的文檔,請細看
對於上面的問題我們來一個一個解決:我們要先看第三步打開支付流程的文檔:https://pay.weixin.qq.com/wiki/d ... api.php?chapter=9_1
其實我們可以看到所有流程都在這里!那么我們就按照這個流程一步步走。 1、小程序內調用登錄接口,獲取到用戶的openid,api參見公共api【小程序登錄API】 上面已經說過要前后台結合,所以開發小程序的你這時就要做第一步了,文檔在:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject
 
首先用 wx.login(OBJECT)獲取code,code用來換取openid,獲取openid的事情我是我們后台來做,我用request帶上獲取的code去get就好了
1
2
3
4
5
6
7
|
function
getopenid(code, cb) {
requestGet(
'UserOpenid'
, { code: code },
function
(res) {
if
(
typeof
cb ==
"function"
) {
cb(res);
}
})
}
|
res的返回結果就是我們的openid,到這里我們第一步完成了。 2、商戶server調用支付統一下單,api參見公共api【統一下單API:https://pay.weixin.qq.com/wiki/d ... api.php?chapter=9_1】 這個我們看一下:
這個里面的東西很多很多,如果是你自己完成前后端的話那就好好看,磨刀不誤砍柴工,有一點看不到可能導致一直解決不了這個流程,畢竟微信的文檔 有那么一點亂亂的趕腳。 這個如果像我一樣是后端做的那就不用你操心了,但是你想了解的話也不難,看上面我最開始給出的兩個地址,這兩個文章都是吧全部流程做在前端(小程序)這里的 其實沒必要,這個在看資料的時候發現其實微信是提供java,net,php三種語言的封裝包的,那么就是說后台只要吧這個東西下載下來把對應的參數填寫修改就可以了, 但是最終是什么樣子的,如果可以的話我會補上這個代碼,后台的代碼不在我這,諒解! 這個我們一樣只要request用post請求得到結果就可以了,這次我們需要的結果就是支付perpay_id
我的這個請求時只返回了一個perpay_id但是我們可以看統一下單接口返回的數據
他給我們不僅返回了perpay_id,還有隨機字符串和簽名,我說這個點的原因是我沒有用這個所以是不是我們直接在接下來要用的隨機字符串和簽名就是直接用這兩個就可以了呢(我沒有驗證后台沒有給我返回,具體是什么樣子的待驗證)。跳過這一點,我們只要這個perpay_id一樣可以成功。 到現在我們來看一下
第一步的我們已經完成了,只有第二步paySign這個簽名了。對應微信的流程是: 3、商戶server調用再次簽名,api參見公共api【再次簽名:https://pay.weixin.qq.com/wiki/d ... api.php?chapter=7_7】 這個簽名我們來看看是有點令人苦惱的,我們來看看上面說的兩個文章的踩坑總結: 第一篇:
第二篇:
總的來說看這個簽名的坑是最多的。 我結合一下來描述一下吧: 首先我們看第三步(綠色)部分的地址
再看微信小程序API中wx.requestPayment(OBJECT)接口的文檔
我特別標注的紅色框部分可能會讓你恍然大悟了,有些“坑”可能是我們看東西的方式不對啊,對於appid和key文檔上有明確的說明要帶上 由此我們也可以看出,對於支付流程我們正確的打開方式是下圖
要遵循上面圖片的步驟和連接頁面進行看和做。 好了,扯遠了:來看簽名
1
2
3
4
|
function
MixedencryMD5(res_paydata,randomString,timeStamp) {
return
"appId="
+ config.appid +
"&nonceStr="
+ randomString +
"&package=prepay_id="
+ res_paydata +
"&signType=MD5"
+
"&timeStamp="
+ timeStamp +
"&key="
+ config.key;
}
|
這個是正確的順序,在具體簽名方法說明中,可以看出key是在簽名參數按照ASCII大小排序完再拼接上去的, 上面的參數函數
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
function
timeStamp() {
return
parseInt(
new
Date().getTime() / 1000) +
''
}
function
randomString() {
var
chars =
'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
;
var
maxPos = chars.length;
var
pwd =
''
;
for
(
var
i = 0; i < 32; i++) {
pwd += chars.charAt(Math.floor(Math.random() * maxPos));
}
return
pwd;
}
|
最后就是吧這個拼接的字符串進行MD5加密,Md5加密的js在網上搜一下就好了,如果怕不對自己可以在線驗證。 至此我們 timeStamp 時間戳,nonceStr 隨機數,package 支付id,paySign 簽名,是不是都有了?對的,這樣就結束了
上圖就是調用支付的最后步驟了,注意一點時間戳和隨機字符串,保證生成一次,因為在 wx.requestPayment(OBJECT)中我們要用,在拼接的字符串中同樣要用,這兩個要保證一樣微信去MD5加密的時候才能得到和你自己MD5加密一樣的結果。
祝大家,一次成功!!有什么不對的請指正,文章引用上如有侵犯請留言我會及時修正,謝謝! |