第一种使用EasyWeChat拉起登录

使用 composer 安装 EasyWeChat

$ composer require overtrue/wechat:~5.0 -vvv

或者在composer.json文件renquire里面添加

"overtrue/wechat": "4.2.11",

接着 composer update 就可以了

use EasyWeChat\Factory;class Login extends Api
{protected $app;protected $oauth;protected $config;protected $noNeedLogin = ['getCode', 'loginRes'];protected $noNeedRight = ['*'];// 基本配置public function _initialize(){parent::_initialize();// 这里的配置信息可以写入基本配置里面,这里只是为了练手$this->config = ['app_id' => "wx04ff******edd2a1",'secret' => "581671ce************5c4f634b321e",// 下面为可选项// 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名'response_type' => 'array','log' => ['level' => 'debug','file'  =>  ROOT_PATH . '/public/logs/wxOfficialAccountsLogin.log'],'oauth' => ['scopes'   => ['snsapi_userinfo'],'callback' => $this->request->domain() . '/api/Login/loginRes'],];$this->app = Factory::officialAccount($this->config);$this->oauth = $this->app->oauth;}/*** 网页授权获取code*/public function getCode(){// TODO 前期测试用于清空值 session('wechat_user',NULL);if (!session('wechat_user')) {return $this->oauth->redirect()->send();}else {$this->success('授权登录成功(缓存)', session('wechat_user'));}}/*** 授权登录*/public function loginRes(){$code = $this->request->param('code');if(!$code){$this->error(__('缺少参数code!'));}$wechat_user = $this->oauth->user();$result = json_decode(json_encode($wechat_user),true);/* $result 输出结果* Array ([id] => oaWII632e55s0ZuqCRQHsYQkMgFE[name] => 霍文霆[nickname] => 霍文霆[avatar] => https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJn6TuXOPKCAsrDl8SfriaZcaetY04blVTKVE0deman5ApWIOe6uPOXfK8Rq5MhEETaS1ulIE4whXQ/132[email] =>[original] => Array ([openid] => oaWII632e55s0ZuqCRQHsYQkMgFE[nickname] => 霍文霆[sex] => 1[language] => zh_CN[city] =>[province] => 安徽[country] => 中国[headimgurl] => https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJn6TuXOPKCAsrDl8SfriaZcaetY04blVTKVE0deman5ApWIOe6uPOXfK8Rq5MhEETaS1ulIE4whXQ/132[privilege] => Array ( ))[token] => 44_XMZF2a0HHwE7Z268c_Qoi44a75hIvvw9lQi6I072ws2lop22xcYXMHoKWoA_NOo0hFH18aeXDrLejOBPf75A0Q[access_token] => 44_XMZF2a0HHwE7Z268c_Qoi44a75hIvvw9lQi6I072ws2lop22xcYXMHoKWoA_NOo0hFH18aeXDrLejOBPf75A0Q[refresh_token] => 44_SAM1LhD3MrQZ-xYc6uDP6fvglzDhl82wI_k2GM8wbUlG-6AcR22pXflwMTIg5fTwmYYFRYZuGhzD3ZuHE894VA[provider] => WeChat)*/// 分参extract($result);if (!empty($result)) {$user = User::get(['openid' => $original['openid']]);if ($user) {if ($user->status != 'normal') {$this->error(__('Account is locked'));}// 每次调用都会更新一次用户基本数据---例如用户修改头像和昵称,这样就会实时更新数据了$user->nickname = base64_decode(base64_encode($original['nickname']));$user->avatar = $original['headimgurl'];$user->save();// 直接登陆$ret = $this->auth->direct($user->id);} else {$ret = $this->auth->wxOfficialAccountsLogin($original);}if ($ret) {$wechat_user = $this->auth->getUserInfo();// 把用户登录信息写入session中,这样就不需要每次都发起请求了session('wechat_user', $wechat_user);$this->success('授权登录成功', $wechat_user);} else {$this->error('授权登录失败了!');}}else{$this->error(__('授权登录失败了!'));}}/* loginRes() 输出结果* {"code":1,"msg":"授权登录成功","time":"1620469689","data":{"id":3,"nickname":"霍文霆","avatar":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTJn6TuXOPKCAsrDl8SfriaZcaetY04blVTKVE0deman5ApWIOe6uPOXfK8Rq5MhEETaS1ulIE4whXQ\/132","mobile":"","score":0,"token":"f3f0ce45-8dd5-4935-b292-8c5e4c66124f","user_id":3,"createtime":1620469690,"expiretime":1623061690,"expires_in":2592000}}*/// TODO 不难看出此时 loginRes() 和 session('wechat_user') 的输出结果是一样的,我也就达到目的了/* session('wechat_user') 输出结果* {"code":1,"msg":"授权登录成功(缓存)","time":"1620469875","data":{"id":3,"nickname":"霍文霆","avatar":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTJn6TuXOPKCAsrDl8SfriaZcaetY04blVTKVE0deman5ApWIOe6uPOXfK8Rq5MhEETaS1ulIE4whXQ\/132","mobile":"","score":0,"token":"f3f0ce45-8dd5-4935-b292-8c5e4c66124f","user_id":3,"createtime":1620469690,"expiretime":1623061690,"expires_in":2592000}}*/
}

第二种使用原生写法拉起登录

class Login extends Api
{protected $appid;protected $appSecret;protected $getCodeUrl;protected $getTokenUrl;protected $getUserUrl;protected $redirectUrl;protected $noNeedLogin = ['getCode','loginRes'];protected $noNeedRight = ['*'];// 基本配置public function _initialize(){parent::_initialize();$this->appid = "wx04ff******edd2a1";$this->appSecret = "581671ce0b**********5c4f634b321e";$this->getCodeUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect';$this->getTokenUrl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code';$this->getUserUrl = 'https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN';$this->redirectUrl = urlencode($this->request->domain() . '/api/Login/loginRes');}/*** 网页授权获取code*/public function getCode(){// TODO 前期测试用于清空值 session('wechat_user',NULL);if (!session('wechat_user')) {$url = sprintf($this->getCodeUrl, $this->appid, $this->redirectUrl);header("Location:" . $url);}else {$this->success('授权登录成功', session('wechat_user'));}}/*** 授权登录*/public function loginRes(){$code = $this->request->get('code');  // 获取codeif(!$code){$this->error(__('缺少参数code!'));}$getTokenUrl = sprintf($this->getTokenUrl, $this->appid, $this->appSecret, $code);// 获取access_token和openid$result = json_decode(file_get_contents($getTokenUrl),true);/* $result 输出结果* Array ([access_token]  => 44_ixUtEZiza2rDbtiP2JGJKwPdNi_VA6iODMCvvRIJ-k34TbU5XR04d74ekw37QfFthPzAS2bnPaycazBXl8AInQ[expires_in]    => 7200[refresh_token] => 44_LGyUp6YLNAdL2F8CppUXbjsxhnQpk1yvkAKZNnqSzDLN2itrfvPUY3mwFCsHHBbPF28GYyl1tMSxOuoj9sdQJg[openid]        => oaWII632e55s0ZuqCRQHsYQkMgFE[scope]         => snsapi_userinfo)*/if(!$result){$this->error('获取access_token和openid失败了');}// 分参extract($result);$getUserUrl = sprintf($this->getUserUrl, $access_token, $openid);// 获取用户信息$userInfo = json_decode(file_get_contents($getUserUrl),true);/* $userInfo 输出结果* Array ([openid] => oaWII632e55s0ZuqCRQHsYQkMgFE[nickname] => 霍文霆[sex] => 1[language] => zh_CN[city] =>[province] => 安徽[country] => 中国[headimgurl] => https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJn6TuXOPKCAsrDl8SfriaZcaetY04blVTKVE0deman5ApWIOe6uPOXfK8Rq5MhEETaS1ulIE4whXQ/132[privilege] => Array ())*/// 分参extract($userInfo);if (!empty($userInfo)) {$user = User::get(['openid' => $openid]);if ($user) {if ($user->status != 'normal') {$this->error(__('Account is locked'));}// 每次调用都会更新一次用户基本数据---例如用户修改头像和昵称,这样就会实时更新数据了$user->nickname = base64_decode(base64_encode($nickname));$user->avatar = $headimgurl;$user->save();// 直接登陆$ret = $this->auth->direct($user->id);} else {$ret = $this->auth->wxOfficialAccountsLogin($userInfo);}if ($ret) {$wechat_user = $this->auth->getUserInfo();// 把用户登录信息写入session中,这样就不需要每次都发起请求了session('wechat_user', $wechat_user);$this->success('授权登录成功', $wechat_user);} else {$this->error('授权登录失败了!');}}else{$this->error(__('获取用户信息失败了'));}}/* loginRes() 输出结果* {"code":1,"msg":"授权登录成功","time":"1620468028","data":{"id":2,"nickname":"霍文霆","avatar":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTJn6TuXOPKCAsrDl8SfriaZcaetY04blVTKVE0deman5ApWIOe6uPOXfK8Rq5MhEETaS1ulIE4whXQ\/132","mobile":"","score":0,"token":"d4e89893-c4fa-4d70-a373-92bd7c454250","user_id":2,"createtime":1620468029,"expiretime":1623060029,"expires_in":2592000}}*/// TODO 不难看出此时 loginRes() 和 session('wechat_user') 的输出结果是一样的,我也就达到目的了/* session('wechat_user') 输出结果* {"code":1,"msg":"授权登录成功","time":"1620468151","data":{"id":2,"nickname":"霍文霆","avatar":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTJn6TuXOPKCAsrDl8SfriaZcaetY04blVTKVE0deman5ApWIOe6uPOXfK8Rq5MhEETaS1ulIE4whXQ\/132","mobile":"","score":0,"token":"d4e89893-c4fa-4d70-a373-92bd7c454250","user_id":2,"createtime":1620468029,"expiretime":1623060029,"expires_in":2592000}}*/
}

在 app\common\library 添加如下方法,我是基于fastadmin开发的,也可以改写我的数据写入方式

    /*** 微信公众号H5注册用户* @param string $username 用户名* @param string $password 密码* @param string $email    邮箱* @param string $mobile   手机号* @param array  $extend   扩展参数* @return boolean*/public function wxOfficialAccountsLogin($result){// 分参extract($result);$params = ['openid'    => $openid,'nickname'  => base64_decode(base64_encode($nickname)),'avatar'    => $headimgurl,'jointime'  => time(),'joinip'    => request()->ip(),'logintime' => time(),'loginip'   => request()->ip(),'prevtime'  => time(),'status'    => 'normal'];Db::startTrans();try {$user = User::create($params, true);$this->_user = User::get($user->id);//设置Token$this->_token = Random::uuid();Token::set($this->_token, $user->id, $this->keeptime);Db::commit();} catch (Exception $e) {$this->setError($e->getMessage());Db::rollback();return false;}return true;}

基于TP5、EasyWeChat、fastadmin微信公众号网页授权登录相关推荐

  1. 微信公众号网页授权登录的超简单实现步骤

    微信开放平台为第三方移动程序提供分享.传播的接口, 使用户可将第三方程序的内容发布给好友或分享至朋友圈, 下面这篇文章主要给大家介绍了关于微信公众号网页授权登录的超简单实现方法, 需要的朋友可以参考下 ...

  2. PHP微信公众号网页授权登录 扫码登录 获取用户基本信息

    前言 现在微信登录是一个网站.APP的标配,所以微信授权登录是我们应该要掌握的.微信授权登录有4种方式: 1.通过微信开放平台 2.通过认证的微信服务号 3.通过认证的微信订阅号 4.通过微信小程序曲 ...

  3. 微信公众号网页授权登录完整步骤版学不会你打我....

    微信点击授权登录 全过程版本轻松完成 第一步 注册微信测试号 具体操作步骤 第一步:用户同意授权,获取code 第二步:通过code换取网页授权access_token 第三步:拉取用户信息(需sco ...

  4. 微信公众号网页授权登录多域名的解决方法

    最近在项目中,由于我们只有一个公众号,但有多个业务系统,就想可以都让同一个公众号授权登录,方便用户的管理.但问题来了,我们都知道微信公众号授权域名只能填写两个,如果我们有多个呢,该如何解决呢. 在网上 ...

  5. [JAVA实现]微信公众号网页授权登录,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  6. [JAVA实现]微信公众号网页授权登录

    网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的.现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你. 请看流程图!看懂图,就懂了一半了: 其实整体流程大体只需三步:用户点 ...

  7. 微信公众号网页授权登录多域名的解决

    由于微信网页开发,需要获取用户信息,所以就需要网页授权,但是在微信公众平台公众号只能设置一个回调域名,现在 只有一个公众号,但是我多个业务不同的域名,并都需要拿到用户信息,这时一个回调域名肯定是不能解 ...

  8. 【微信开发】[JAVA实现]微信公众号网页授权登录

    网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的.现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你. 请看流程图!看懂图,就懂了一半了: 其实整体流程大体只需三步:用户点 ...

  9. 微信公众号网页授权40163问题【php】

    微信公众号网页授权40163问题 tp5为例,emmmm-一直报40163或40029问题,翻遍了各大网站都没找到合适我的办法. 如图: 解决之后如图: 因为重定向所以请求了两次code,所以一直报4 ...

最新文章

  1. .net OCX 无法获取“****”控件的窗口句柄,不支持无窗口的ActiveX控 新解决方法...
  2. [Lua]50行代码的解释器,用来演示lambda calculus
  3. 最高效的回文数(C语言实现)
  4. 窗口分析函数_9_计算组内总和的占比
  5. Vue012_ 自定义插件
  6. GitHub Actions 支持 skip ci 了
  7. left join 效率_人力资源HR的人才测评工具,极大提高招聘效率
  8. mysql主备切换 自动_核电生产管理信息系统EAM完成首次备用环境切换演练
  9. AndroidStudio_Android中使用Handler实现非阻塞线程间通讯_跨线程更新UI_耗时处理完成后主动通知更新UI_在同一个activity用---Android原生开发工作笔记219
  10. JavaScript 霸榜、TypeScript 爆发、开源吞噬世界,GitHub 年度报告正式发布!
  11. 浏览其中的【navigator】对象的【userAgent】判断浏览器。
  12. QQ资料清空php源码,[php源码][QQ玫瑰小镇]一键收铲种,php网页版
  13. jdbc如何使用oracle数据库连接池,使用JDBC连接池技术连接Oracle数据库
  14. PKM2 - PKManager 基于内容的个人知识管理工具 5M 绿色免费
  15. Ansys Maxwell三相变压器制作方法教程
  16. 猎豹网校梁兴珍老师的python课程很不错
  17. 根据IP地址获取地理位置
  18. html语言中的双冒号,css单冒号和双冒号用法和区别
  19. EasyNVR网页摄像机直播方案H5前端构建之:如何播放HLS
  20. linux c 时间微秒,linux下C语言获取微秒级时间

热门文章

  1. Python选修课第一届Turtle绘图大赛田康林赵冰珂组
  2. MySQL学习-修改表结构
  3. 罗克韦尔自动化收购工业自动化系统模拟与仿真的领先软件开发商Emulate3D
  4. ![CDATA[]]和转义字符
  5. 01-Spring的初体验:spring工厂的化过程
  6. 视频的上传及购买播放
  7. jQuery方法解析(一)append
  8. 二维vector的输入
  9. 【java之汉字转拼音】
  10. java script总结1