微信自定義菜單+獲取網(wǎng)頁(yè)授權(quán)+獲取用戶(hù)信息
今天項(xiàng)目需要一個(gè)需求冒窍,就是添加一個(gè)菜單接口景鼠,并且還可以獲取用于的信息霞势,從而根據(jù)用戶(hù)的信息去做一些業(yè)務(wù)的查詢(xún)油额。通過(guò)百度和自己查看文檔大致的解決辦法如下:
注意
在自定義自己菜單前催植,若跳轉(zhuǎn)自己服務(wù)器里面的url時(shí)候肮蛹,首先得設(shè)置自己點(diǎn)擊菜單時(shí)的回調(diào)域名
不能以http或者h(yuǎn)ttps開(kāi)頭必須是www.xx.com類(lèi)似于這樣子的字符串形式
1 首先來(lái)自定義菜單創(chuàng)建接口
按照文檔的要求一步一步來(lái):
1.1 首選是自定義接口的一些限制和說(shuō)明,這里就不多說(shuō)了创南,看文檔就可以明白伦忠。
這直接看文檔即可 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013
1.2 然后是發(fā)送接口請(qǐng)求,自定義自己的菜單稿辙。
接口調(diào)用請(qǐng)求說(shuō)明
http請(qǐng)求方式:POST(請(qǐng)使用https協(xié)議) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
詳情看文檔即可昆码,沒(méi)什么好說(shuō)的。發(fā)送請(qǐng)求和json即可邻储。
本人的請(qǐng)求如下:
json數(shù)據(jù)
{
"menu": {
"button": [
{
"type": "scancode_push",
"name": "掃碼",
"key": "rselfmenu_0_1",
"sub_button": []
},
{
"type": "view",
"name": "我的發(fā)票記錄",
"url": "http://www.udeam.com/cc",
"sub_button": []
}
]
}
}
注意:
不要直接復(fù)制官網(wǎng)的json數(shù)據(jù)未桥,應(yīng)當(dāng)去掉 "menu": 這一層json , 可能會(huì)出現(xiàn) 以下錯(cuò)誤:
{
"errcode": 40016,
"errmsg": "invalid button size hint: [hTpqGa02101977]"
}
成功返回: {"errcode":0,"errmsg":"ok"}
錯(cuò)誤時(shí)的返回JSON數(shù)據(jù)包如下(示例為無(wú)效菜單名長(zhǎng)度): {"errcode":40018,"errmsg":"invalid button name size"} 或者其他錯(cuò)誤等芥备。
2 自定義菜單查詢(xún)接口
請(qǐng)求說(shuō)明
http請(qǐng)求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
返回說(shuō)明(無(wú)個(gè)性化菜單時(shí))
菜單界面
3 自定義菜單刪除接口
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141015
4 controller
@GetMapping("cc")
public String cc(HttpServletRequest request) throws IOException {
return "suceess"; //我自己的頁(yè)面
}
啟動(dòng)運(yùn)行
但是我們這樣子僅僅只是單獨(dú)的挑了個(gè)頁(yè)面無(wú)法獲取到用戶(hù)的一些信息冬耿,如debug所示!
無(wú)法獲取到code所以萌壳,在跳轉(zhuǎn)第三方網(wǎng)頁(yè)的時(shí)候需要授權(quán)后才能獲取到用戶(hù)的一些基本信息亦镶。
** 獲取用戶(hù)信息的前提是網(wǎng)頁(yè)授權(quán)這里沒(méi)有進(jìn)行網(wǎng)頁(yè)授權(quán),從而獲取code值也為null**
5 微信網(wǎng)頁(yè)授權(quán)
利用微信網(wǎng)頁(yè)授權(quán)機(jī)制來(lái)進(jìn)行重定向到自定義的一個(gè)url
如果用戶(hù)在微信客戶(hù)端中訪問(wèn)第三方網(wǎng)頁(yè)袱瓮,公眾號(hào)可以通過(guò)微信網(wǎng)頁(yè)授權(quán)機(jī)制缤骨,來(lái)獲取用戶(hù)基本信息,進(jìn)而實(shí)現(xiàn)業(yè)務(wù)邏輯尺借。
**關(guān)于網(wǎng)頁(yè)授權(quán)回調(diào)域名的說(shuō)明**
1绊起、在微信公眾號(hào)請(qǐng)求用戶(hù)網(wǎng)頁(yè)授權(quán)之前,開(kāi)發(fā)者需要先到公眾平臺(tái)官網(wǎng)中的“開(kāi)發(fā) - 接口權(quán)限 - 網(wǎng)頁(yè)服務(wù) - 網(wǎng)頁(yè)帳號(hào) - 網(wǎng)頁(yè)授權(quán)獲取用戶(hù)基本信息”的配置選項(xiàng)中燎斩,修改授權(quán)回調(diào)域名虱歪。請(qǐng)注意蜂绎,這里填寫(xiě)的是域名(是一個(gè)字符串),而不是URL笋鄙,因此請(qǐng)勿加 http:// 等協(xié)議頭师枣;
2、授權(quán)回調(diào)域名配置規(guī)范為全域名萧落,比如需要網(wǎng)頁(yè)授權(quán)的域名為:www.qq.com践美,配置以后此域名下面的頁(yè)面<http://www.qq.com/music.html> 、 <http://www.qq.com/login.html> 都可以進(jìn)行OAuth2.0鑒權(quán)找岖。但[http://pay.qq.com](http://pay.qq.com/) 陨倡、 [http://music.qq.com](http://music.qq.com/) 、 [http://qq.com無(wú)法進(jìn)行OAuth2.0鑒權(quán)](http://qq.xn--comoauth2-735sh62dwk9eysua.xn--0-k76bu98j/)
3许布、如果公眾號(hào)登錄授權(quán)給了第三方開(kāi)發(fā)者來(lái)進(jìn)行管理玫膀,則不必做任何設(shè)置,由第三方代替公眾號(hào)實(shí)現(xiàn)網(wǎng)頁(yè)授權(quán)即可
**關(guān)于網(wǎng)頁(yè)授權(quán)的兩種scope的區(qū)別說(shuō)明**
1爹脾、以snsapi_base為scope發(fā)起的網(wǎng)頁(yè)授權(quán)帖旨,是用來(lái)獲取進(jìn)入頁(yè)面的用戶(hù)的openid的,并且是靜默授權(quán)并自動(dòng)跳轉(zhuǎn)到回調(diào)頁(yè)的灵妨。用戶(hù)感知的就是直接進(jìn)入了回調(diào)頁(yè)(往往是業(yè)務(wù)頁(yè)面)
2解阅、以snsapi_userinfo為scope發(fā)起的網(wǎng)頁(yè)授權(quán),是用來(lái)獲取用戶(hù)的基本信息的泌霍。但這種授權(quán)需要用戶(hù)手動(dòng)同意货抄,并且由于用戶(hù)同意過(guò),所以無(wú)須關(guān)注朱转,就可在授權(quán)后獲取該用戶(hù)的基本信息蟹地。
3、用戶(hù)管理類(lèi)接口中的“獲取用戶(hù)基本信息接口”藤为,是在用戶(hù)和公眾號(hào)產(chǎn)生消息交互或關(guān)注后事件推送后怪与,才能根據(jù)用戶(hù)OpenID來(lái)獲取用戶(hù)基本信息。這個(gè)接口缅疟,包括其他微信接口分别,都是需要該用戶(hù)(即openid)關(guān)注了公眾號(hào)后,才能調(diào)用成功的存淫。
然后根據(jù)自己的場(chǎng)景選擇授權(quán)并且獲取用戶(hù)的信息
關(guān)于特殊場(chǎng)景下的靜默授權(quán)
1耘斩、上面已經(jīng)提到没宾,對(duì)于以snsapi_base為scope的網(wǎng)頁(yè)授權(quán)轧简,就靜默授權(quán)的,用戶(hù)無(wú)感知踏拜;
2、對(duì)于已關(guān)注公眾號(hào)的用戶(hù)荚虚,如果用戶(hù)從公眾號(hào)的會(huì)話或者自定義菜單進(jìn)入本公眾號(hào)的網(wǎng)頁(yè)授權(quán)頁(yè)薛夜,即使是scope為snsapi_userinfo,也是靜默授權(quán)曲管,用戶(hù)無(wú)感知。
具體而言硕糊,網(wǎng)頁(yè)授權(quán)流程分為四步:
1院水、引導(dǎo)用戶(hù)進(jìn)入授權(quán)頁(yè)面同意授權(quán),獲取code
2简十、通過(guò)code換取網(wǎng)頁(yè)授權(quán)access_token(與基礎(chǔ)支持中的access_token不同)
3檬某、如果需要,開(kāi)發(fā)者可以刷新網(wǎng)頁(yè)授權(quán)access_token螟蝙,避免過(guò)期
4恢恼、通過(guò)網(wǎng)頁(yè)授權(quán)access_token和openid獲取用戶(hù)基本信息(支持UnionID機(jī)制)
具體代碼以及步驟如下:
第一步
點(diǎn)擊菜單的url直接重定向到下面這個(gè)url即可,目的 “引導(dǎo)用戶(hù)進(jìn)入授權(quán)頁(yè)面同意授權(quán)胰默,獲取code ”
https://open.weixin.qq.com/connect/oauth2/authorize?appid= + “自己的appid” + &redirect_uri= +“ 自己的url ”+ &response_type=code&scope=snsapi_base&state=1#wechat_redirect"
@GetMapping("cc")
public String cc(HttpServletRequest request) throws IOException {
String code = request.getParameter("code");
return "redirect:/https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxx&redirect_uri=http://www.xxx.com/aaa&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
}
第二步
獲取到code之后场斑,就可以根據(jù)獲取用戶(hù)信息(這里詳細(xì)見(jiàn)微信網(wǎng)頁(yè)授權(quán)四步驟文檔)
然后在controller 根據(jù)自己的需求執(zhí)行其他邏輯。
@GetMapping("aaa")//重定向的url 也就是上面controller重定向的微信url里面重定向自己的url(http://www.xxx.com/aaa)
public String aa(HttpServletRequest request) throws IOException {
String code = request.getParameter("code");
return "success";
}
debug 結(jié)果
第三步
獲取到授權(quán)后code牵署,然后可以根據(jù) 網(wǎng)頁(yè)授權(quán)(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842)第2.3.4步步驟獲取用戶(hù)的信息漏隐,從而自己的實(shí)現(xiàn)業(yè)務(wù)邏輯。
注:
另外看到網(wǎng)上一部分大佬們直接將 將鏈接的url直接作為微信自定義菜單中view類(lèi)型中的url 中奴迅。
結(jié)果我在postman中發(fā)了一次請(qǐng)求青责,直接報(bào)url長(zhǎng)度錯(cuò)誤,所以放棄了這種方案取具!