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


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 相关文章推荐
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
json实现前后台的相互传值详解
Jan 05 Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 Javascript
bootstrap table复杂操作代码
Nov 01 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
Nov 07 Javascript
基于vue开发的在线付费课程应用过程
Jan 25 Javascript
使用node.js实现微信小程序实时聊天功能
Aug 13 Javascript
vue初始化动画加载的实例
Sep 01 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
Jul 19 Javascript
vue中实现弹出层动画效果的示例代码
Sep 25 Javascript
JavaScript 中判断变量是否为数字的示例代码
Oct 22 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
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python实现股市信息下载的方法
2015/06/15 Python
python中set常用操作汇总
2016/06/30 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
tornado 多进程模式解析
2018/01/15 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
如何定义TensorFlow输入节点
2020/01/23 Python
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
自我鉴定总结
2014/03/24 职场文书
爱护公共设施标语
2014/06/24 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
销售顾问工作计划书
2014/09/15 职场文书
2014年团支部工作总结
2014/11/17 职场文书
2015年导购员工作总结
2015/04/25 职场文书
干部考核工作总结
2015/08/12 职场文书
初二数学教学反思
2016/02/17 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
python四种出行路线规划的实现
2021/06/23 Python
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android
MySQL主从切换的超详细步骤
2022/06/28 MySQL