微信公眾號(hào)開發(fā) 自定義菜單跳轉(zhuǎn)頁(yè)面并獲取用戶信息實(shí)例詳解
微信公眾號(hào)開發(fā) 自定義菜單
請(qǐng)先讀完本文再進(jìn)行配置開發(fā)
請(qǐng)先前往微信平臺(tái)開發(fā)者文檔閱讀“網(wǎng)頁(yè)授權(quán)獲取用戶基本信息”的接口說(shuō)明
在微信公眾賬號(hào)開發(fā)中,往往有定義一個(gè)菜單,然后用戶點(diǎn)擊該菜單就進(jìn)入用戶個(gè)人中心的功能,通常應(yīng)用于各個(gè)公眾賬號(hào)中的會(huì)員服務(wù)。
如何在微信自定義菜單中將用戶導(dǎo)航到個(gè)人中心頁(yè)面呢?
首選需要通過(guò)用戶點(diǎn)擊獲取用戶openid,而通過(guò)用戶的點(diǎn)擊跳轉(zhuǎn)獲取用戶openid就必須在菜單中動(dòng)態(tài)綁定用戶的openid,或者在菜單的跳轉(zhuǎn)URL中填寫微信提供的鏈接,官方給了兩個(gè)鏈接類型
一種是Scope為snsapi_base的鏈接
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
另一種是Scope為snsapi_userinfo的鏈接
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
這兩種鏈接的區(qū)別如下
應(yīng)用授權(quán)作用域,snsapi_base (不彈出授權(quán)頁(yè)面,直接跳轉(zhuǎn),只能獲取用戶openid),snsapi_userinfo (彈出授權(quán)頁(yè)面,可通過(guò)openid拿到昵稱、性別、所在地。并且,即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息)
網(wǎng)上很多說(shuō)法是將鏈接的url直接作為微信自定義菜單中view類型中的url(在填寫是url時(shí)需要配置網(wǎng)頁(yè)授權(quán)回調(diào)域名和appid),本人試了一下這種做法然而不能成功
{ "type":"view", "name":"會(huì)員中心", "url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的appid&redirect_uri=你配置接收微信認(rèn)證的地址?response_type=code&scope=snsapi_base&state=1#wechat_redirect" },
返回結(jié)果是創(chuàng)建菜單失敗
創(chuàng)建菜單失敗 errcode:{40033} errmsg:{invalid charset. please check your request, if include \uxxxx will create fail! hint: [91..gA0792vr23]}
我試了一下將后面的地址進(jìn)行urlEncode,還是同樣的錯(cuò)誤。
后來(lái)我想了一個(gè)辦法
在自定義菜單中填寫自己的url,在填寫的url中將用戶重定向到snsapi_base的url中,然后再在snsapi_base中配置獲取用戶openid以及用戶其他信息,最后跳轉(zhuǎn)到一個(gè)頁(yè)面,也就是通常的會(huì)員中心頁(yè)面。
流程如下

請(qǐng)看代碼
{ "type":"view",
"name":"會(huì)員中心",
"url":"http://配置的網(wǎng)址/redirect"}
其中通過(guò)url將用戶跳轉(zhuǎn)到
http://配置的網(wǎng)址/redirect
然后在處理方法中調(diào)用一次重定向即可
//類上的配置
@Controller
@RequestMapping("/wechat")
public class WeChatController{
@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public String weixinRedirect(HttpServletRequest request, HttpServletResponse response) {
return "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的appid&redirect_uri=你的服務(wù)器處理地址?response_type=code&scope=snsapi_base&state=1&connect_redirect=1#wechat_redirect";
}
}
服務(wù)器會(huì)將微信認(rèn)證 跳轉(zhuǎn)到你的服務(wù)器處理地址,也就是上面
redirect_uri=你的服務(wù)器處理地址中的地址
這里配置為
你的服務(wù)器地址/oauth
代碼如下
@RequestMapping(value = "/oauth", method = RequestMethod.GET)
public String weixinOAuth(HttpServletRequest request, HttpServletResponse response, Model model) {
//得到code
String CODE = request.getParameter("code");
String APPID = "你的APPID";
String SECRET = "你的SECRET";
//換取access_token 其中包含了openid
String URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code".replace("APPID", APPID).replace("SECRET", SECRET).replace("CODE", CODE);
//URLConnectionHelper是一個(gè)模擬發(fā)送http請(qǐng)求的類
String jsonStr = URLConnectionHelper.sendGet(URL);
//System.out.println(jsonStr);
//out.print(jsonStr);
JSONObject jsonObj = new JSONObject(jsonStr);
String openid = jsonObj.get("openid").toString();
//有了用戶的opendi就可以的到用戶的信息了
//地址為https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
//得到用戶信息之后返回到一個(gè)頁(yè)面
model.addAttribute("user", wechatUser);
return "vip/userInfo";
}
效果如下


而且這種方式當(dāng)用戶用其他瀏覽器打開時(shí),會(huì)出錯(cuò),保證了只能在微信中使用,保障了安全性。而且地址欄不會(huì)有其他用戶個(gè)人信息的暴露。

如有疑問(wèn),可以查看官網(wǎng),謝謝大家的閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 微信公眾號(hào)支付(一)如何獲取用戶openId
- 微信公眾號(hào)-獲取用戶信息(網(wǎng)頁(yè)授權(quán)獲取)實(shí)現(xiàn)步驟
- .NET微信公眾號(hào)獲取OpenID和用戶信息
- php判斷用戶是否關(guān)注微信公眾號(hào)
- 微信公眾號(hào)判斷用戶是否已關(guān)注php代碼解析
- Java微信公眾號(hào)開發(fā)之通過(guò)微信公眾號(hào)獲取用戶信息
- .NET微信公眾號(hào) 用戶分組管理
- ASP.NET微信公眾號(hào)之用戶分組管理web頁(yè)面
- ASP.NET Core2靜默獲取微信公眾號(hào)的用戶OpenId實(shí)例代碼
- 微信公眾號(hào)實(shí)現(xiàn)掃碼獲取微信用戶信息(網(wǎng)頁(yè)授權(quán))
- 微信公眾號(hào)用戶與網(wǎng)站用戶的綁定解決方案分析
相關(guān)文章
Javascript基礎(chǔ)教程之定義和調(diào)用函數(shù)
這篇文章主要介紹了Javascript基礎(chǔ)教程之定義和調(diào)用函數(shù)的相關(guān)資料,需要的朋友可以參考下2015-01-01
JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記6 初識(shí)js對(duì)象
砌好墻,下面出場(chǎng)的就是房子了,在ECMAScript中,對(duì)象就是我們所說(shuō)的房子,至于你所寫的整個(gè)應(yīng)用程序,那就是一整套建筑群了2012-10-10
Javascript實(shí)例項(xiàng)目放大鏡特效的實(shí)現(xiàn)流程
商城網(wǎng)站包括APP端中把鼠標(biāo)光標(biāo)移動(dòng)到預(yù)覽圖上就會(huì)看到這部分商品圖片放大了,這就是JavaScript實(shí)現(xiàn)的放大鏡特效,今天我們也來(lái)實(shí)現(xiàn)一波2021-11-11
深入理解JavaScript系列(42):設(shè)計(jì)模式之原型模式詳解
這篇文章主要介紹了深入理解JavaScript系列(42):設(shè)計(jì)模式之原型模式詳解,原型模式(prototype)是指用原型實(shí)例指向創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象,需要的朋友可以參考下2015-03-03
javascript實(shí)現(xiàn)存儲(chǔ)hmtl字符串示例
這篇文章主要介紹了javascript實(shí)現(xiàn)存儲(chǔ)hmtl字符串示例,需要的朋友可以參考下2014-04-04

