微信授权登录

news/2024/11/15 21:29:03/文章来源:https://www.cnblogs.com/Ajue/p/18202442

Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`

微信授权登录

日期:2019-4-5 阿珏 折腾代码 浏览:1874次 评论:1条

文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

微信的授权登录和QQ、新浪等平台的授权登录都大同小异,均采用OauthOAuth2.0鉴权方式。
微信授权分为两种:
  1. 静默授权
  2. 弹窗授权,需要用户手动同意
两种scope的区别说明
  1. 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
  2. 以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

具体而言,网页授权流程分为四步:
  1. 引导用户进入授权页面同意授权,获取code
  2. 通过code换取网页授权access_token(与基础支持中的access_token不同)
  3. 如果需要,开发者可以刷新网页授权access_token,避免过期
  4. 通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
以下是封装的微信操作类,需要用到两个数据表,用于保存access_token、ticket,由于他们具有一定有效期,且每天请求数有上限,所以开发者需自行保存
<?php
/**
*   微信操作表
*   wxtoken 表结构
*   id
*   access_token
*   addtime
*   wxticket 表结构
*   id
*   ticket
*   addtime
*/
class WX {private $appid;private $appserect;private $curl;private $msg;protected $errs = array('-1' => '系统繁忙,此时请开发者稍候再试','0' => '请求成功','40001' => 'AppSecret错误或者AppSecret不属于这个公众号,请开发者确认AppSecret的正确性','40002' => '请确保grant_type字段值为client_credential','40164' => '调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置。',);function __construct($appid, $appserect) {$this->appid = $appid;$this->appserect = $appserect;$this->curl = new Curl();}/*微信网页授权登录  需要在公众号设置 - 功能设置 - 网页授权域名第一步:用户同意授权,获取codescope : snsapi_base 只能获取openid 直接跳转snsapi_userinfo*/public function getCode($redirect_uri, $scope = 'snsapi_userinfo',$state = '1') {$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appid}&redirect_uri={$redirect_uri}&response_type=code&scope={$scope}&state={$state}#wechat_redirect";header("Location:{$url}");exit;}/*第二步:通过code换取网页授权access_token*/public function getAccessTokenByCode($code) {$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appid}&secret={$this->appserect}&code={$code}&grant_type=authorization_code";// exit($url);// $curl = new Curl();$result = $this->curl->doGet($url);if (!$result) {// $this->curl->getError()$this->msg = "获取token失败";return false;}$result = json_decode($result, true);if ($result['errcode']) {$this->msg = $result['errmsg'];return false;}return $result;}// 第三步:刷新access_token(如果需要) 通过code 获取openid $type 0静默授权 1弹窗授权public function getUserInfo($code, $type = 0, $lang = 'zh_CN ') {$result = $this->getAccessTokenByCode($code);if (!$result) {return false;}$member = C::t(PT_USER)->getByOpenid($result['openid']);if ($member) {return $member;} else {if ($type) {$url = "https://api.weixin.qq.com/sns/userinfo?access_token={$result['access_token']}&openid={$result['openid']}&lang={$lang}";// $return = $this->curl->doGet($url);// 这接口有病 强制显示文件头$return = file_get_contents($url);if (!$return) {$this->msg = '获取用户信息失败';return false;}$return = json_decode($return, true);if (!$return) {$this->msg = '获取用户信息返回失败';return false;}// file_put_contents('ccc.txt',print_r($return,true),FILE_APPEND);$data = array('openid' => $return['openid'],'name' => $return['nickname'],'sex' => $return['sex'],'province' => $return['province'],'city' => $return['city'],'country' => $return['country'],'img' => $return['headimgurl'],'bindtel' => 0,);} else {$data = array('openid' => $result['openid'],'username' => "微信用户_" . random(6,1));}$name = rand(100000, 1000000000);$e = $name . "@qq.com";$password = $e;$id = UserAddEdit(0, $data['username'], $password, $e,10,0,"", $msg);if ($id <= 0) {$this->msg = $msg;return false;}C::t(PT_USER)->update($data, $id);$member = C::t(PT_USER)->get($id);return $member;}}/*公众号 安全中心 设置IP白名单公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。*/public function getAccessToken($type) {$addtime = TIMESTAMP - 7200;$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appserect}";$row = C::t(PT_WXTOKEN)->getNew($addtime, $type);if ($row) {return $row['access_token'];} else {$result = $this->curl->doGet($url);if (!$result) {$this->msg = "无法获取令牌内容";return false;}$result = json_decode($result, true);if (!$result) {$this->msg = "解析令牌内容失败";return false;}if ($result['access_token']) {C::t(PT_WXTOKEN)->addToken($result['access_token'], $type);return $result['access_token'];} else {$this->msg = "获取令牌失败";return false;}}}// 获取js票据  需要在公众号设置 - 功能设置 - JS接口安全域名设置public function getJsTicket() {$addtime = TIMESTAMP - 7200;$row = C::t(PT_WXTICKET)->getNew($addtime);if ($row) {return $row['ticket'];} else {$token = $this->getAccessToken();if (!$token) {return false;}$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$token}&type=jsapi";$result = $this->curl->doGet($url);if (!$result) {$this->msg = "无法获取js票据";return false;}$result = json_decode($result, true);if (!$result) {$this->msg = "解析js票据内容失败";return false;}if ($result['ticket']) {C::t(PT_WXTICKET)->addTicket($result['ticket']);return $result['ticket'];} else {$this->msg = "获取js票据失败";return false;}}}// js sdk 票据签名 当前网页的URL,不包含#及其后面部分public function jsSign($data) {// 1.所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)ksort($data);// 2.URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1 采用原始值,不进行URL 转义$string1 = $this->ToUrlParams($data);// echo "string1:{$string1}<br/>";// 3.对string1做sha1加密$sign = sha1($string1);// echo "signature:{$sign}<br/>";return $sign;}// 获取消息内容public function getMsg() {return $this->msg;}/*** 格式化参数格式化成url参数*/public function ToUrlParams($data) {$buff = "";foreach ($data as $k => $v) {if ($k != "sign" && $v != "" && !is_array($v)) {$buff .= $k . "=" . $v . "&";}}$buff = trim($buff, "&");return $buff;}
}
?>
// 微信登录
function wxlogin() {global $_G,$identifier,$config,$wx;if (!$_G['uid']) {if ($_GET['state']) {//回调$member = $wx->getUserInfo($_GET['code']);if (!$member) {exit($wx->getMsg());}if (!function_exists("setloginstatus")) {include_once libfile('function/member');}// 设置登录状态$wxsetloginstatus($member, 2592000);checkfollowfeed();$_G['uid'] = $member['uid'];$_G['member'] = $member;} else {//请求授权 对参数编码$redirect = urlencode(getProtocol() . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);$wx->getCode($redirect, 'snsapi_base');}}
}
function getProtocol() {return is_HTTPS() ? 'https://' : 'http://';
}
function is_HTTPS() {  if ($_SERVER['HTTPS'] === 1 || $_SERVER['HTTPS'] === 'on' || $_SERVER['SERVER_PORT'] == 443) {return true;}return false;
}

本博客所有文章如无特别注明均为原创。作者:阿珏复制或转载请以超链接形式注明转自阿珏博客
原文地址《微信授权登录

网友评论:

头条新闻 2年前 (2019-04-11)
文章不错支持一下吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709327.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产邪神手办开箱

“邪神”正是用于描述这些表情崩坏到离谱,细节不堪到令人发指的手办。 说起“邪神”,大家也许第一感觉就是“邪神四姐妹”,其实都是让人膜拜的存在,四大邪神的威名万世传扬,不仅可以辟邪,而且摆出来非常长脸有没有,杀人不见血的强大武器Tips:当你看到这个提示的时候,说…

免费的云渲染平台有哪些?哪些平台性价比较高?

随着3D建模和渲染技术的发展,云渲染平台已成为很多设计师的重要工具。这些平台通过提供高性能的远程渲染服务,帮助用户加速渲染过程。但是市场上云渲染平台很多,有哪些是免费的吗?有哪些平台性价比较高? 1、免费的云渲染平台有哪些? 目前,市场上不存在完全不需要支付任何…

这下真鸽了

完了完了,这下真鸽了,上上个月的年终总结还在夸自己去年每个月都有勤奋的发博客,然而flag果然是用来打破的。Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 这下真鸽了 日期:2019…

VUE,HbuilderX开发H5页面,配置调试,部署以及JWT,Token。调用本机netcore接口

花了一周时间,测试了各种方式。对于VUE开发H5页面,然后部署到Nginx服务。再调用本地的HTTPS接口。1、本地开发及使用IE或Chrome进行开发调试,并调用本地接口同步开发。本地Netcore,开发按原有方式进行。Hbuilderx,开发并调用本地接口。设置时,不要使用Https进行。直接用h…

某东h5st4.7 加密参数(二)

接着上一篇文章,由于最近比较忙,没有时间看。今天有时间看看上一篇没有说完的其他加密参数。仅供学习交流! 1、fp的生成,搜索关键词 fingerprint ,即可查看到生成位置调试可以找到生成位置2、请求获取tk algo中参数expandParams,如下图调试可以获取到参数expandParams从…

最初,进入二次元是什么时候?

最初,进入二次元是什么时候呢?或许是一部吸引人的动漫,是一位帅气漂亮的人物,也许是一次不经意的一撇,也许是一位朋友的强烈推荐,Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`…

mit6.828笔记 - lab4 Part B:写时复制Fork

Part B Copy-on-Write Fork Unix 提供 fork() 系统调用作为主要的进程创建基元。fork()系统调用复制调用进程(父进程)的地址空间,创建一个新进程(子进程)。 不过,在调用 fork() 之后,子进程往往会立即调用 exec(),用新程序替换子进程的内存。例如,shell 通常就是这么…

萌音影视 - 在线影视应用

萌音影视 - 在线影视应用 基于优雅的 laravel 框架和一点都不妹子的 妹子UI 的在线影视应用Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 萌音影视 - 在线影视应用 日期:2018-9-25 …

这本轻小说真厉害!

《我的青春恋爱物语果然有问题》连续三年蝉联这本轻小说真厉害的榜首!因为大春物实力太作弊,当年大老师不仅在男生分类第一,就连全部角色排名也获得了第一位。Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内…

放学后茶会

如果要给回忆的碎片 取名保存起来 我想 “宝物”再合适不过Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 放学后茶会 日期:2018-9-14 阿珏 二次元 浏览:1829次 评论:3条ねぇ呐如…

经纬恒润第三代重载自动驾驶平板车

为了应对港口无人化运营在实质化落地过程的挑战,经纬恒润借助自身在无人驾驶领域的深厚积累与实践,改款升级了新一代重载自动驾驶平板车。 随着无人驾驶在封闭场地和干线道路场景的加速落地,港口作为无人化运营的先行者,其场景的复杂度、特殊性对无人化运营的技术提出…

.NET6中使用Log4net记录日志(二)记录日志到SqlServer数据库

使用Log4net记录日志到SqlServer数据库1、引用NuGet包(System.Data.SqlClient) 2、创建SqlServer数据库表(ProgramLog)CREATE TABLE ProgramLog (Id INT IDENTITY(1,1) PRIMARY KEY,[Date] DATETIME,--记录时间[Level] NVARCHAR(128),--日志级别[RunTime] VARCHAR(128),--执…