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


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 相关文章推荐
JS获取计算机mac地址以及IP的实现方法
Jan 08 Javascript
JQuery中使用ajax传输超大数据的解决方法
Jul 14 Javascript
JavaScript计算某一天是星期几的方法
Aug 05 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
Sep 15 Javascript
jquery分页插件jquery.pagination.js使用方法解析
Apr 01 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
Sep 05 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
Sep 08 Javascript
js Canvas绘制圆形时钟教程
Feb 06 Javascript
setTimeout函数的神奇使用
Feb 26 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
Apr 25 Javascript
Vue渲染过程浅析
Mar 14 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
May 01 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 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
Javascript Object.extend
2010/05/18 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
JS表的模拟方法
2015/02/05 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
JavaScript常用工具方法封装
2019/02/12 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
Python基于滑动平均思想实现缺失数据填充的方法
2019/02/21 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
利用python汇总统计多张Excel
2020/09/22 Python
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
美国在线购物频道:Shop LC
2019/04/21 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
捐款感谢信
2015/01/20 职场文书
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python