侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

微信开发之网页授权获取用户信息(二)

微信(小程序)  /  管理员 发布于 3年前   203

在公众号的配置过程中,许多开发者会在菜单中加入HTML5页面,有时在页面内需要访问页面的用户信息,此时就需要网页授权获取用户基本信息

提醒大家:本文介绍讲述的内容是基于yii2.0框架

1、设置授权回调域名:开发 ---> 接口权限

  找到“网页授权获取用户基本信息”,点击后面对应的“修改”,在弹框响应位置填写授权回调域名即可,此处的域名不需要加http:// (关于网页授权回调域名的说明详情可参考公众平台开发者文档)


2、获取授权

  关于OAuth2.0博主参考的是方倍工作室的博文http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html(PS:方倍是一个微信开发大神,其中的微信开发内容还是比较详细的,推荐参考),其中详细剖析了微信官方文档的相关内容,也提供了获取授权的更详细思路和方案。

  实际上,获取用户信息的关键在于获取用户的openid。博主想要实现用户点击公众号菜单打开页面即可自动授权,从而针对该用户进行数据库操作,于是有下面两种方式: 

  (1)利用自定义菜单请求授权页面

    自定义菜单后面会单独写一篇博文,在这里先简述一下通过自定义菜单进行授权,该方法需要高级接口权限,且局限于关注公众号的用户直接从菜单进入页面。

$menu = '{"button":[{"type": "view","name": "商城","url": "https://open.weixin.qq.com/connect/oauth/authorize?appid=xxx&redirect_uri=http://tx.heivr.com/index.php&response_type=code&scope=snsapi_base&state=#wechat_redirect"},{"name":"快递服务","sub_button":[{"type":"click","name":"发快递","key":"express"},{"type":"click","name":"快递查询","key":"ww"}]},]}'; 

需要授权的view直接在url处填写微信提供的授权请求地址,其中:

•appid:填写微信公众平台基本配置中的AppID;
•redirect_uri:填写授权完成后跳转的页面地址,即自己的html5页面;
•state:跳转至回调页面所带参数;
•response_type:网页授权的两种scope,微信官方文档中说明如下:

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
按照此方法点击“商城”即可接收到返回的openid,继而进行下一步用户信息的获取。 

(2)利用JS自动请求授权页面

这个方法相对而言比较笨拙,步骤略复杂,但目前能解决需求还没有研究简化方法,且由于页面的跳转多数情况下访问页面的时间会增加,但相比于前一个方法,该方法可以获取到非关注用户的基本信息。有些程序可能涉及到页面分享,程序没有强制关注但其他用户通过分享直接进入页面也需要记录用户信息,此时可以考虑该方法。(微信开发相关的代码博主封装成工具类调用,这里先贴用到的部分,以后整理完成会全部贴出来并附下载链接)

该方法的思路为:js请求链接获取code ---> 利用code换取openid ---> 得到用户基本信息

a. 编辑配置

为了方便把用到的一些微信参数单独写入一个类,方便修改添加及调用

b. https请求工具

create_url($params);}else{$request = $requests;}}else{$request = $requests;}$this->ch = curl_init($request);curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, );// 设置不显示结果,储存入变量curl_setopt($this->ch, CURLOPT_TIMEOUT, self::TIMEOUT); // 设置超时限制防止死循环// 判断是否以https方式访问if ($https) {curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, ); // 对认证证书来源的检查curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, ); // 从证书中检查SSL加密算法是否存在}if ($method == 'post') { // 以post方式提交//curl_setopt($this->ch, CURLOPT_SAFE_UPLOAD, false); //php .文件上传必加内容,.不需要curl_setopt($this->ch, CURLOPT_POST, ); // 发送一个常规的Post请求curl_setopt($this->ch, CURLOPT_POSTFIELDS, $params); // Post提交的数据包curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, );}$tmpInfo = curl_exec($this->ch); // 执行操作if (curl_errno($this->ch)) {echo 'Errno:'.curl_error($this->ch);//捕抓异常}curl_close($this->ch); // 关闭CURL会话//var_dump($tmpInfo);exit;return $tmpInfo; // 返回数据}/*** 生成url*/public function create_url($data) {$temp = '?';foreach ($data as $key => $item) {$temp = $temp . $key . '=' . $item . '&';}return substr($temp, , -);}}

关于curl_setopt($this->ch, CURLOPT_SAFE_UPLOAD, false)会在微信图片资源上传博文中详细讲述它出现的心酸史,这里暂时用不到,不做解释

c. 授权基类

conf = $re->setConfig();} /*** 生成用户授权的地址* @param string 自定义需要保持的信息* @param sting 请求的路由* @param bool 是否是通过公众平台方式认真*/public function authorize_addr($route, $state='', $mp=false) {if ($mp) {$data = ['appid' => $this->conf['appid'],'secret' => $this->conf['token'],'grant_type' => 'client_credential'];$url = $this->conf['mp_authorize_url'];} else {$data = ['appid' => $this->conf['appid'], //公众号唯一标识'redirect_uri' => urlencode($this->conf['redirect_uri'] . $route), //授权后重定向的回调链接地址'response_type' => 'code', //返回类型,此处填写code'scope'=>$this->conf['scope'], //应用授权作用域'state'=>$state, //重定向后带上state参数,开发者可以填写任意参数'#wechat_redirect'=>'' //直接在微信打开链接,可不填,做页面重定向时必须带此参数];$url = $this->conf['authorize_url'];}$send = new HttpsTool;//var_dump($url . $send->create_url($data));exit;return $url . $send->create_url($data);}/*** 获取 access token* @param string 用于换取access token的code,微信提供*/public function access_token($code) {$data = ['appid' => $this->conf['appid'],'secret' => $this->conf['secret'],'code' => $code,'grant_type' => 'authorization_code'];// 生成授权url$url = $this->conf['access_token_url'];$send = new HttpsTool;return $send->send_request($url, $data);}/*** 获取用户信息* @param string access token* @param string 用户的open id*/public function userinfo($token, $openid) {$data = ['access_token' => $token,'openid' => $openid,'lang' => $this->conf['lang']];// 生成授权url$url = $this->conf['userinfo_url'];$send = new HttpsTool;return $send->send_request($url, $data);}}

d. 授权基类调用及用户数据处理(在控制器调用前,先对用户数据存入或更新)

authorize_addr($route, $state);$code = isset($_GET['code']) ? $_GET['code'] : '';return [$request,$code];}/*** 获取用户信息并写入数据库(之后加参数传给code)*/public function info($code) {$re = new OauthTool;//获取access token$access = $re->access_token($code);$token = json_decode($access,true);//header("Content-type: text/html; "); //获取用户信息if(count($token) != ) {$response = $re->userinfo($token['access_token'], $token['openid']);$user = json_decode($response,true);//用户昵称转换//$user['nickname'] = EmojiTool::emoji_trans($user['nickname']);if($model = User::findOne(['openid' => $user['openid'] ])) { //用户已存在更新数据$model->attributes = $user;$model->modify_time = time();$model->save(false);}else{ //用户不存在写入$model = new User;$model->attributes = $user;$model->create_time = time();$model->save(false);}}return isset($model->id) ? $model->id : '';}} 

e. 控制器调用(这里只贴其中一个方法)

/*** 产品列表* @return object 所有可用产品信息*/public function actionIndex(){//判断页面是否自动刷新if(isset($_GET['state'])) {$refresh = ;}else{$refresh = ;}//获取用户code$user = new UserinfoClass;$request = $user->getCode('r=store/index', );//该用户userid$userid = $user->info($request[]);$model = new Product;$list = $model->find()->where(['status' => ])->all();return $this->render('index',['list' => $list, 'refresh' => $refresh, 'userid' => $userid, 'request' => $request]);}

程序要求用户打开产品列表即获取用户信息并存入数据库,其中设计了几个变量作用如下:

$refresh:判断页面是否刷新,由于首次打开页面未进行oauth验证时才自动请求验证,避免反复刷新,这里用回调的state参数作为判断依据且设state=1(若有特定参数需要可将state赋值为所需值);

$request:即为验证请求地址

f. 视图自动刷新

只需要在视图中添加以下js代码即可

以上内容给大家介绍了微信开发之网页授权获取用户信息(二)的全部叙述,希望本文分享能够给大家带来帮助。

您可能感兴趣的文章:

  • Thinkphp5微信小程序获取用户信息接口的实例详解
  • Java微信公众号开发之通过微信公众号获取用户信息
  • Java微信公众平台开发(12) 微信用户信息的获取
  • php 微信开发获取用户信息如何实现
  • 微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
  • .NET微信公众号获取OpenID和用户信息
  • 微信公众号-获取用户信息(网页授权获取)实现步骤
  • PHP版微信第三方实现一键登录及获取用户信息的方法
  • 实例分析基于PHP微信网页获取用户信息


  • 上一条:
    微信小程序canvas截取任意形状的实现代码
    下一条:
    微信小程序聊天功能的示例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 小程序开发之跳转微信直播示例api(0个评论)
    • 在uni_app中开发小程序之常用功能示例代码汇总(0个评论)
    • 小程序开发之多端框架:taro(0个评论)
    • 微信小程序前端使用七牛云官方SDK上传七牛云代码示例(0个评论)
    • 百度小程序审核未通过,真机审核存在点击返回键退出小程序...解决方式之一tabBar(0个评论)
    • 近期文章
    • 如何优雅处理async await错误推荐:await-to-js库(0个评论)
    • lodash工具库(0个评论)
    • 在Laravel项目中使用中间件方式统计用户在线时长功能代码示例(0个评论)
    • 在Laravel中构建业务流程模型(0个评论)
    • windows系统中安装FFMpeg及在phpstudy环境php7.3 + php-ffmpeg扩展的使用流程步骤(0个评论)
    • 在go语言中对浮点的数组、切片(slice)进行正向排序和反向排序(0个评论)
    • 在go语言中对整数数组、切片(slice)进行排序和反向排序(0个评论)
    • 在go语言中对字符串数组、切片(slice)进行排序和反向排序(0个评论)
    • 最新国内免注册ChatGPT体验站_ChatGPT镜像站访问链接地址2023/3/28持续更新(0个评论)
    • 在Laravel项目中的实现无密码认证之:发送邮箱链接授权(0个评论)
    • 近期评论
    • 博主 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..
    • xiaoB 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..
    • BUG4 在

      你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..
    • 博主 在

      go语言+beego框架中获取get,post请求的所有参数中评论 @ t1  直接在router.go文件中配就ok..
    • Jade 在

      如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
    • 2017-10
    • 2018-01
    • 2020-03
    • 2021-06
    • 2021-10
    • 2022-03
    • 2023-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客