微信公众号-获取用户信息(网页授权获取)实现步骤


Posted in Javascript onOctober 21, 2016

根据微信公众号开发官方文档:

获取用户信息步骤如下:

1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

1 获取code

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

其中:

AppID - 公众号的唯一标识
REDIRECT_URI - 跳转url
SCOPE - 值为snsapi_base(不弹出授权页面,直接跳转,只能获取用户openid) 或snsapi_userinfo (弹 出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
STATE - 开发者可以自定义填写a-zA-Z0-9的参数值

2 通过code换取网页授权access_token

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
state就是上面的STATE参数原样传过来的

实现代码:

<code class="hljs php">$code = I('get.code');
if (empty($code)) {
   //todo 非微信访问
   exit('</code>');
 }else{ //授权后操作 }

在这里我们就可以得到code用作后续的获取access_token。

获取code后,请求以下链接获取access_token:

 https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

appid - 公众号的唯一标识
secret - 密钥
code - 上述所返回的code
grant_type - 值为authorization_code

实现代码:

<code class="hljs bash">$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . C('wechat.AppID') . '&secret=' . C('wechat.AppSecret');
$str = file_get_contents($url);
$str = json_decode($str, true);
$access_token = $str['access_token'];</code>

这里access_token可以做缓存处理,避免造成频繁获取
实现代码,以TP框架为例:

<code class="hljs php">$access_token = S('access_token');
if (empty($access_token)) {
  $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . C('wechat.AppID') . '&secret=' . C('wechat.AppSecret');
  $str = file_get_contents($url);
  $str = json_decode($str, true);
  $access_token = $str['access_token'];
  S('access_token', $access_token, 3600);
}</code>

在获取access_token后,也会一并返回openid(用户唯一标识),微信官方文档的解释是:用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID

openid是唯一标识微信用户的,如果用户不是第一次登陆,可以在得到openid后查询数据库是否有绑定此openid的用户,之后就无需重新获取用户数据,直接获取的数据库user_id设置session,直接登陆访问

3 第三步忽略,只在需要的时间重新获取access_token而已

4 拉取用户信息(需scope为 snsapi_userinfo)

在数据库无此微信号用户的绑定下,就相当于用户首次访问登陆,则通过第四步来获取用户信息(在用户授权情况下,网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了),然后后台创建user并绑定此微

信用户(通过openid)

请求方法

http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

access_token - 上述所获取的access_token
openid - 公众号唯一标识

实现代码:

<code class="hljs php">$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=$access_token&openid=$openid&lang=zh_CN";
$str = file_get_contents($url);
$str = json_decode($str, true);
if (empty($str['errcode'])) {
  //创建user并绑定openid
}else{
  //错误处理
}</code>

以上就是微信公众号获取用户信息的具体步骤。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScript 获取当前时间戳的代码
Aug 05 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
Apr 15 Javascript
Javascript之Number对象介绍
Jun 07 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
jQuery控制元素隐藏和显示
Mar 03 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
Mar 25 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
Feb 01 Javascript
JS中的防抖与节流及作用详解
Apr 01 Javascript
什么时候不能在 Node.js 中使用 Lock Files
Jun 24 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
Oct 21 #Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
Oct 21 #Javascript
Bootstrap如何创建表单
Oct 21 #Javascript
bootstrap table小案例
Oct 21 #Javascript
jquery+Jscex打造游戏力度条
Sep 12 #Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
Oct 21 #Javascript
node.js学习之base64编码解码
Oct 21 #Javascript
You might like
php检测图片木马多进制编程实践
2013/04/11 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
vue文件运行的方法教学
2019/02/12 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
keras导入weights方式
2020/06/12 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
python 如何停止一个死循环的线程
2020/11/24 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
Python读写Excel表格的方法
2021/03/02 Python
一套Delphi的笔试题一
2016/02/14 面试题
销售自我评价
2013/10/22 职场文书
保护环境倡议书500字
2014/05/19 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
员工年度工作总结2015
2015/05/18 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
Python中的变量与常量
2021/11/11 Python
JVM之方法返回地址详解
2022/02/28 Java/Android