自認(rèn)為小程序開(kāi)發(fā)基礎(chǔ)篇已經(jīng)“掃”完了,結(jié)果今天嘗試做小程序帶參數(shù)二維碼功能時(shí)尷尬了,瞬間鄙視自己的技術(shù)水平。本文雖說(shuō)探討的是微信小程序帶參數(shù)二維碼的問(wèn)題,但更多解決的是HTTP請(qǐng) ...

自認(rèn)為小程序開(kāi)發(fā)基礎(chǔ)篇已經(jīng)“掃”完了,結(jié)果今天嘗試做小程序帶參數(shù)二維碼功能時(shí)尷尬了,瞬間鄙視自己的技術(shù)水平。本文雖說(shuō)探討的是微信小程序帶參數(shù)二維碼的問(wèn)題,但更多解決的是HTTP請(qǐng)求中Post請(qǐng)求狀態(tài)下的傳參問(wèn)題。適合不限于小程序開(kāi)發(fā)的java、php、android、ios等初級(jí)開(kāi)發(fā)者,高手請(qǐng)繞道,感謝開(kāi)發(fā)者@鮑紅星對(duì)我的提問(wèn)。
本文大概
1888
字
讀完共需
6
分鐘
本節(jié)目標(biāo):完成帶參數(shù)的小程序二維碼。實(shí)現(xiàn)步驟如下:
一、打開(kāi)API:


二、根據(jù)文檔提示,跳轉(zhuǎn)到獲取access_token界面【https://mp.weixin.qq.com/wiki?id=mp1421140183】關(guān)于access_token簡(jiǎn)單來(lái)說(shuō)是公眾號(hào)的全局唯一接口調(diào)用憑據(jù),公眾號(hào)調(diào)用各接口時(shí)都需使用access_token。access_token的存儲(chǔ)至少要保留512個(gè)字符空間。access_token的有效期目前為2個(gè)小時(shí),需定時(shí)刷新,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效;他是對(duì)企業(yè)appid和appsecrect的一種保護(hù),通常交由企業(yè)后端帶上appid和appsecrect兩個(gè)參數(shù)去請(qǐng)求微信后臺(tái)得到token,接下來(lái)token將成為企業(yè)后端、前端、微信后端交互的唯一憑證。獲取方法api提示比較清晰:


我是在web開(kāi)發(fā)工具自己去請(qǐng)求的token,也很正常的獲取到了。接下來(lái)就是比較牛(Dan)逼(Teng)的地方了。
三、根據(jù)token和小程序api的提示,獲得帶參數(shù)的二維碼,代碼如下:

但是,結(jié)果讓我失望了

反復(fù)報(bào)錯(cuò)類(lèi)型為token無(wú)效,參數(shù)錯(cuò)誤之類(lèi)的信息【微信開(kāi)發(fā)錯(cuò)誤請(qǐng)求碼鏈接:https://mp.weixin.qq.com/wiki/17/fa4e1434e57290788bde25603fa2fcbd.html】由于api沒(méi)有說(shuō)明是否為get或者post,于是乎我換成get請(qǐng)求,結(jié)果依然是token無(wú)效。

各種檢驗(yàn)參數(shù)和請(qǐng)求方法嘗試,都無(wú)果......
最后大膽嘗試了一個(gè)從來(lái)沒(méi)有寫(xiě)過(guò)的post寫(xiě)法,請(qǐng)看下圖:

很榮幸,這種寫(xiě)法我成功請(qǐng)求到了帶參數(shù)的二維碼了!但是有很多不解!

Ok,微信小程序得到帶參數(shù)的二維碼應(yīng)該用post請(qǐng)求,access_token必須直接跟在url后面【貌似JSSDK開(kāi)發(fā)也是這么個(gè)情況】。這是本文的重要結(jié)論
問(wèn)題是解決了,疑問(wèn)依然存在——對(duì)HTTP的get和post請(qǐng)求有誤解
之前的認(rèn)識(shí):
GET方法:使用GET方法時(shí),查詢(xún)字符串(鍵值對(duì))被附加在URL地址后面一起發(fā)送到服務(wù)器,如:http://haolong?id=12&name="張三"
特點(diǎn):GET請(qǐng)求能夠被緩存;GET請(qǐng)求會(huì)保存在瀏覽器的瀏覽記錄中;以GET請(qǐng)求的URL能夠保存為瀏覽器書(shū)簽;GET請(qǐng)求有長(zhǎng)度限制;GET請(qǐng)求主要用以獲取數(shù)據(jù)
POST方法:使用POST方法時(shí),查詢(xún)字符串在POST信息中單獨(dú)存在,和HTTP請(qǐng)求一起發(fā)送到服務(wù)器:data{name1=value1&name2=value2},然后把整個(gè)data傳值
特點(diǎn):POST請(qǐng)求不能被緩存下來(lái);POST請(qǐng)求不會(huì)保存在瀏覽器瀏覽記錄中;以POST請(qǐng)求的URL無(wú)法保存為瀏覽器書(shū)簽;POST請(qǐng)求沒(méi)有長(zhǎng)度限制
重點(diǎn)是:習(xí)慣性地在get請(qǐng)求狀態(tài)下參數(shù)是拼接到url后面的,而post請(qǐng)求狀態(tài)下參數(shù)是先由body封裝,然后傳到后臺(tái)。
而上圖中post請(qǐng)求狀態(tài)下,既有url后面直接拼接字段,也有data組里面封裝,這是為什么呢?
感謝@花生和@三胖的解釋
不是所有的Post請(qǐng)求參數(shù)就一定會(huì)放在body體類(lèi),看后臺(tái)代碼怎么處理,后臺(tái)要這樣寫(xiě)規(guī)定了是POST 請(qǐng)求且參數(shù)必須封裝在body體內(nèi),如下圖

而下方:雖然規(guī)定了是POST請(qǐng)求但是他獲取參數(shù)是通過(guò)url 傳參的

get或post情況下,是否在url后面直接傳參是非必須的,是根據(jù)后臺(tái)開(kāi)發(fā)人員或需求限制決定的。一般POST 請(qǐng)求都是去后臺(tái)修改數(shù)據(jù)的 ,既然規(guī)定了POST 請(qǐng)求最好就將參數(shù)放在body體里相對(duì)安全;get一般都是查詢(xún)數(shù)據(jù);用url 穿參數(shù)的比較多因?yàn)榧词贡┞读藚?shù)也就是被查詢(xún);不會(huì)被修改數(shù)據(jù)。
在小程序帶參數(shù)二維碼這塊是微信后臺(tái)開(kāi)發(fā)做過(guò)此種限制,所以如果按照之前的套路將token放到data組中的話(huà),微信后臺(tái)是判斷你沒(méi)有傳token參數(shù),二維碼也就請(qǐng)求不到了。由于API也未明確指出,特寫(xiě)此文分享給大家。
參數(shù)攜帶可以在path字段中,與get寫(xiě)法類(lèi)似傳參:pages/index?query=1
pages/index:頁(yè)面路徑
query=1:參數(shù)的鍵值對(duì),多個(gè)參數(shù)用&隔開(kāi)
該字段的值:1可以在指定頁(yè)面的onload方法中,用options參數(shù)獲?。簍his.setData({query:options.query})
請(qǐng)求成功回來(lái)的帶參數(shù)二維碼是二進(jìn)制buffer格式,需要提交給后端處理轉(zhuǎn)換成圖片,最后返回給前端保存。
另外:通過(guò)該接口,僅能生成已發(fā)布的小程序的二維碼,并不代表未發(fā)布的小程序不能生成帶參數(shù)二維碼;未發(fā)布小程序可以生成開(kāi)發(fā)版的帶參二維碼。 帶參二維碼只有 100000 個(gè),請(qǐng)謹(jǐn)慎調(diào)用,POST參數(shù)需要轉(zhuǎn)成 json 字符串,不支持 form 表單提交。
辛苦勞作一番,卻發(fā)現(xiàn)已經(jīng)有現(xiàn)成的第三方工具可以便捷得到帶參數(shù)的小程序二維碼,比如:HotApp、草料、阿拉丁等,但是需要輸入appid和appsecrect等敏感信息,酌情使用。