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


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的方法制作一个简单的导航栏
Jun 23 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
Dec 16 Javascript
浅谈Sticky组件的改进实现
Mar 22 Javascript
跨域请求的完美解决方法(JSONP, CORS)
Jun 12 Javascript
easyui tree带checkbox实现单选的简单实例
Nov 07 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 Javascript
js鼠标移动时禁止选中文字
Feb 19 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
Mar 28 jQuery
解决Vue+Element ui开发中碰到的IE问题
Sep 03 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
Feb 22 Javascript
js中值引用和地址引用实例分析
Jun 21 Javascript
微信小程序实现拨打电话功能的示例代码
Jun 28 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
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
js实现简单模态框实例
2018/11/16 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
jQuery实现本地存储
2020/12/22 jQuery
JS实现公告上线滚动效果
2021/01/10 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
简单实现python爬虫功能
2015/12/31 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
django 连接数据库 sqlite的例子
2019/08/14 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
公司委托书格式范本
2014/09/16 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
如何写辞职书
2015/02/26 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
Python中json.dumps()函数的使用解析
2021/05/17 Python
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers