最近用到过微信用户授权获取用户信息的功能,在这里记录一下。

因为用户授权要用到认证过的服务号才有权限,而线上正在使用公众号,而开发就有些不方便了,这里可以申请一个微信公众测试号。

1.申请一个微信公众测试号

2.配置测试号公网服务器地址

token 可以自己指定,URL就是网站指定地址进行token验证,验证通过就可以使用服务器了

验证代码如下:

#控制器/*** 微信Token 验证*/public function checkSignature(){$signature = request()->input('signature');$timestamp = request()->input('timestamp');$nonce = request()->input('nonce');$echostr = request()->input('echostr');echo $this->WeChat->checkSignature($signature, $timestamp, $nonce, $echostr);}#模型层/*** 微信验证签名* @param $signature* @param $timestamp* @param $nonce* @param $echostr* @return bool*/public function checkSignature($signature, $timestamp, $nonce, $echostr){if (empty($signature) || empty($timestamp) || empty($nonce)) return false;$token = self::$TOKEN; // 网页上设置的token$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr, SORT_STRING);$tmpStr = implode($tmpArr);$tmpStr = sha1($tmpStr);if ($tmpStr == $signature) {return $echostr;} else {return false;}}#路由
Route::any('checkSignature', 'Controller@checkSignature');

3.关注测试号后就可以使用关注的微信号打开授权的页面

4.修改网页授权回调域名

5.网页授权流程分为四步:

(1)引导用户进入授权页面同意授权,获取code

(2)通过code换取网页授权access_token(与基础支持中的access_token不同)

(3)如果需要,开发者可以刷新网页授权access_token,避免过期(可以忽略)

(4)通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

6.具体实现代码

(1)路由

//微信网页授权调试
Route::get('getWeChatCode', 'Controller@getWeChatCode');
//获取微信回调信息
Route::get('weChatCallback', 'Controller@weChatCallback');

(2)控制器


/*** 微信网页授权调试*/public function getWeChatCode(){$object = new WeChat();$callback_url = request()->input('url');$res = $object->getCodeUrl($callback_url);echo "<a href='" . $res . "'>点击</a>";}/*** 获取用户信息*/public function weChatCallback(){$code = request()->input('code');$object = new WeChat();$openInfo = $object->getOpenId($code);if (isset($openInfo['errcode'])) {echo '微信授权登录登录失败' . $openInfo['errmsg'];die;}$userInfo = $object->getUserInfo($openInfo['access_token'], $openInfo['openid']);echo '登录用户信息:';print_r($userInfo);}

(3)微信方法

<?phpclass WeChat
{/*** 微信公众平台微信验证签名* @var string*/protected static $TOKEN = 'xxxxxxxx';/*** 微信公众平台appid* @var string*/protected static $appId = 'xxxxxxx';/*** 微信公众平台app secret* @var string*/protected static $appSecret = 'xxxxxxxx';/*** 微信验证签名* @param $signature* @param $timestamp* @param $nonce* @param $echostr* @return bool*/public function checkSignature($signature, $timestamp, $nonce, $echostr){if (empty($signature) || empty($timestamp) || empty($nonce)) return false;$token = self::$TOKEN;$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr, SORT_STRING);$tmpStr = implode($tmpArr);$tmpStr = sha1($tmpStr);if ($tmpStr == $signature) {return $echostr;} else {return false;}}/*** 通过公众平台key获取网页授权页面* 可通过回调获取code参数* @param $callback_url:回调地址* @return string*/public function getCodeUrl($callback_url){$callback = urlencode($callback_url);$AppId = self::$appId;$get_code_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$AppId}&redirect_uri={$callback}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";return $get_code_url;}/*** 通过公众平台key* 获取用户openId access_token* @param $code* @return bool|string*/public function getOpenId($code){$AppId = self::$appId;$AppSecret = self::$appSecret;$get_openid_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$AppId}&secret={$AppSecret}&code={$code}&grant_type=authorization_code";$res = file_get_contents($get_openid_url);return djson($res);}/*** 获取微信用户信息* @param $access_token* @param $openId* @return bool|mixed*/public function getUserInfo($access_token, $openId){$url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openId}&lang=zh_CN";$res = $this->linkCurl($url, 'GET');$res = json_decode($res, true);return $res;}/*** 请求接口返回内容* @param $url :请求的URL地址* @param $method :请求方式POST|GET* @param $params :请求的参数* @param $header : 请求头* @return bool|string*/protected function linkCurl($url, $method, $params = array(), $header = array()){$ch = curl_init();curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HTTPHEADER, $header);curl_setopt($ch, CURLOPT_FAILONERROR, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);if (strpos("$" . $url, "https://") == 1) {curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);}curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);curl_setopt($ch, CURLOPT_TIMEOUT, 60);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);if ($method == "POST") {curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $params);} else if ($params) {curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($params));}$response = curl_exec($ch);if ($response === false) {return false;}curl_close($ch);return $response;}
}

7.编辑访问路径,在关注的微信中打开

如果非微信打开:

打开效果

第一次授权显示页面为:

多次授权就会显示以下图片

得到用户信息

注意:

code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

PHP 微信网页授权获取用户信息相关推荐

  1. Spring Boot 微信-网页授权获取用户信息

    微信-验证服务器有效性 微信-网页授权获取用户信息 网页授权获取用户信息步骤 第一步:用户同意授权,获取code 第二步:通过code换取网页授权access_token 第三步:拉取用户信息(需sc ...

  2. 微信网页授权获取用户信息实战代码

    微信授权的整体思路: 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信 ...

  3. 微信用户绑定java实例_OAuth2.0微信网页授权获取用户信息实现全过程(JAVA版本)...

    一.前言 为什么需要OAuth2.0网页授权接口,主要是为了获取微信用户的基本信息(比如用户绑定,用户统计等等) 特别注意:只有认证的服务号有此接口权限 那么订阅号如何实现这个功能呢?可以通过另一个服 ...

  4. laravel-admin微信网页授权获取用户信息过程

    最近在重构我们平台得前端页面以及逻辑,再此记录一下微信网页版授权获取用户资料得过程 第一步,安装 composer require "overtrue/laravel-wechat:~3.0 ...

  5. 连小白都能看懂的微信开发之 微信自定义菜单 + 获取网页授权 + 获取用户信息

    微信自定义菜单+获取网页授权+获取用户信息 今天项目需要一个需求,就是添加一个菜单接口,并且还可以获取用于的信息,从而根据用户的信息去做一些业务的查询.通过百度和自己查看文档大致的解决办法如下: 注意 ...

  6. 微信网页授权获取用户基本信息 --- 20/03/16

    ThinkPHP5实现微信网页授权获取用户基本信息 本次使用的appID与appSecret为公众号 一:准备工作 登录微信公众平台,左侧菜单下拉至开发选中基本配置 启用开发者密码(AppSecret ...

  7. PHP开发之-微信网页授权获取用户基本信息

    如何通过网页授权获取用户基本信息(国家,省,市,昵称)相关信息 必要条件: 1)公众号认证 2)有网页授权获取用户基本信息的权限接口 注意:最近有朋友说:在公众平台申请的测试号,会出现无法取到用户信息 ...

  8. PHP通过微信网页授权获取用户基本信息

    微信网页授权获取用户基本信息: <?php$appid = '你的appid'; $secret = '你的secret';if (isset($_GET['code'])) {$code = ...

  9. 支付宝 网页授权 获取用户信息

    ****** 支付宝 网页授权 获取用户信息(昵称,头像等)****** 最近有个项目 需要获取到支付宝的头像和昵称作为互动数据,作为php新人,对于看文档来说 很是痛苦,网上也没有很多关于支付宝网页 ...

最新文章

  1. Android列表控件选项中添加进度框ProgressBar实现
  2. 实际上module(data) 等价于module.forward(data)的原因分析
  3. “大院大所”合作对接活动专场推介会侧记
  4. php显示TABLE数据
  5. python打包zip文件_python 解压文件,合并文件 打包成zip格式文件 生成MD5值
  6. 天翼云从业认证(4.1)上云迁移实战
  7. 软件工程方法学要素含义_日期时间数据的要素工程
  8. jquery序列化serialize()方法空格变为+问题解决参考方法
  9. 1177: 按要求排序(指针专题)_L2算法基础第10课 排序中
  10. 企业软件定制开发的流程,有五点是需要注意的!
  11. 百万级访问量网站的技术准备工作
  12. 浅学DSP原理及应用
  13. 服务机器人分类和发展趋势分析
  14. 鸿蒙os自定义主题,通过鸿蒙自定义属性,来创造一个可以为所欲为的自定义标题组件...
  15. (附源码)springboot物联网智能管理平台 毕业设计 211120
  16. 数据可视化UI设计素材资源文件sketch大屏可视化数据展示
  17. 迅雷因版权问题不能访问
  18. 中国保温杯市场销售渠道分析与营销模式报告(2021-2026年)
  19. 字符串写入到json文件
  20. CF337A Maze 解题报告

热门文章

  1. H5响应式建站有什么技术优势
  2. 进程间通信IPC-共享内存
  3. 智能车自动控制快速停车_控制您的智能手机的自动照片上传
  4. 最小二乘、加权最小二乘(WLS)、迭代加权最小二乘(迭代重加全最小二乘)(IRLS)
  5. 为何要学编程?如何学编程?用什么语言最好?有什么好书?
  6. Bnd教程(1):如何用命令行安装bnd
  7. 关于七牛云存储问题汇总(持续更新)
  8. js中方法调用加括号和不加括号的区别
  9. Go第三篇之大话容器
  10. 移动端UI框架大比拼