微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解


Posted in Javascript onDecember 08, 2016

微信公众号开发 自定义菜单

请先读完本文再进行配置开发

请先前往微信平台开发者文档阅读“网页授权获取用户基本信息”的接口说明

在微信公众账号开发中,往往有定义一个菜单,然后用户点击该菜单就进入用户个人中心的功能,通常应用于各个公众账号中的会员服务。

如何在微信自定义菜单中将用户导航到个人中心页面呢?

首选需要通过用户点击获取用户openid,而通过用户的点击跳转获取用户openid就必须在菜单中动态绑定用户的openid,或者在菜单的跳转URL中填写微信提供的链接,官方给了两个链接类型

一种是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

这两种链接的区别如下

应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)

网上很多说法是将链接的url直接作为微信自定义菜单中view类型中的url(在填写是url时需要配置网页授权回调域名和appid),本人试了一下这种做法然而不能成功

{ "type":"view", "name":"会员中心", "url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的appid&redirect_uri=你配置接收微信认证的地址?response_type=code&scope=snsapi_base&state=1#wechat_redirect" },

返回结果是创建菜单失败

创建菜单失败 errcode:{40033} errmsg:{invalid charset. please check your request, if include \uxxxx will create fail! hint: [91..gA0792vr23]}

我试了一下将后面的地址进行urlEncode,还是同样的错误。

后来我想了一个办法

在自定义菜单中填写自己的url,在填写的url中将用户重定向到snsapi_base的url中,然后再在snsapi_base中配置获取用户openid以及用户其他信息,最后跳转到一个页面,也就是通常的会员中心页面。

流程如下

微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解

请看代码

{ "type":"view",

"name":"会员中心",

"url":"http://配置的网址/redirect"}

其中通过url将用户跳转到

http://配置的网址/redirect

然后在处理方法中调用一次重定向即可

//类上的配置
@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=你的服务器处理地址?response_type=code&scope=snsapi_base&state=1&connect_redirect=1#wechat_redirect";
    }
}

服务器会将微信认证 跳转到你的服务器处理地址,也就是上面

redirect_uri=你的服务器处理地址中的地址

这里配置为

你的服务器地址/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是一个模拟发送http请求的类
    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
    //得到用户信息之后返回到一个页面
    model.addAttribute("user", wechatUser);
    return "vip/userInfo";
  }

效果如下

微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解

微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解

而且这种方式当用户用其他浏览器打开时,会出错,保证了只能在微信中使用,保障了安全性。而且地址栏不会有其他用户个人信息的暴露。

微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解

如有疑问,可以查看官网,谢谢大家的阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
网页前端优化之滚动延时加载图片示例
Jul 13 Javascript
jQuery+HTML5加入购物车代码分享
Oct 29 Javascript
Bootstrap组件(一)之菜单
May 11 Javascript
浅谈jQuery中ajaxPrefilter的应用
Aug 01 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
Sep 24 Javascript
canvas学习之API整理笔记(一)
Dec 29 Javascript
详解Angular的8个主要构造块
Jun 20 Javascript
微信小程序的mpvue框架快速上手指南
May 15 Javascript
优雅的处理vue项目异常实战记录
Jun 05 Javascript
webpack4 optimization使用总结
Nov 10 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
Aug 09 Javascript
node.js学习之交互式解释器REPL详解
Dec 08 #Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
Dec 08 #Javascript
JS中用childNodes获取子元素换行会产生一个子元素
Dec 08 #Javascript
微信公众号 摇一摇周边功能开发
Dec 08 #Javascript
Vue概念及常见命令介绍(1)
Dec 08 #Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
Dec 08 #Javascript
jquery二级目录选中当前页的css样式
Dec 08 #Javascript
You might like
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
php对数组排序代码分享
2014/02/24 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
原生JavaScript制作计算器
2016/10/16 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
canvas 绘制圆形时钟
2017/02/22 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
python ip正则式
2009/05/07 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
Python常用特殊方法实例总结
2019/03/22 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
写给纪委的违纪检讨书
2015/05/05 职场文书
歌剧魅影观后感
2015/06/05 职场文书