利用临时二维码实现在电脑浏览器上的微信扫码登陆功能 - EasyWeChat版
2019独角兽企业重金招聘Python工程师标准>>>
这个方法最开始用在还没有“微信开放平台”的时候,现在也有不少网站在用,简单说就是生成一个临时二维码放到服务器,然后微信扫描二维码后将该值传递给服务器进行比对,实现登陆,和手机动态码登陆思路类似。
流程说明
先把我们要实现的步骤说下:
- 用户访问微信登陆页面,程序生成一个临时二维码。
- 用户使用微信扫描刚生成的二维码。
- 扫码后微信发送二维码所含内容给网站程序。
- 客户端每隔N秒(或填写)将第一步的二维码内容和网站从微信接收的二维码内容比对,如果找到则登陆成功。
准备工作
因临时二维码生成和扫码操作需要用到公众账号通讯接口,因此我们先配置它(微信相关页面)。首先在@app/controllers/下新建一个名为WxController.php的控制器文件并且定义一个actionIndex来处理和微信之间的交互,如下面代码:
namespace app\controllers;use Yii;
use yii\web\Controller;
use EasyWeChat\Foundation\Application;// 引入EasyWeChatclass WxController extends Controller {/*** 服务器与微信通讯处理接口* @author abei<abei@nai8.me>*/public function actionIndex(){/** 'WECHAT'=>[* 'appId'=>'xxx',* 'appSecret'=>'xxxxx',* 'token'=>'nai8_me'* ]*/$options = Yii::$app->params['WECHAT'];$app = new Application($options);$response = $app->server->serve();$response->send();}
}
根据微信文档,首先我们需要通过服务器验证。
$response = $app->server->serve();
$response->send();
这段代码就是处理和微信响应的,我们在测试平台填写action的url和token
当配置验证通过后,我们再对微信服务器发过来的各种请求做相应处理,比如传过来一个文本,比如一次二维码扫描,比如一个地理位置,比如等等。关于EasyWechat对于和微信服务器交互的文档可以查看如下地址。
https://easywechat.org/zh-cn/docs/tutorial.html
https://easywechat.org/zh-cn/docs/server.html
接下来我们来处理微信发过来的请求,在本文档里我们要处理的是扫描二维码后的接收事件,当然扫描二维码根据当前微信是否关注公众号返回的是不同的,因篇幅问题,我们只说关注后的情况。
增加功能后的代码如下
namespace app\controllers;use Yii;
use yii\web\Controller;
use EasyWeChat\Foundation\Application;// 引入EasyWeChatclass WxController extends Controller {public $wxApp;/*** 服务器与微信通讯处理接口* @author abei<abei@nai8.me>*/public function actionIndex(){$options = Yii::$app->params['WECHAT'];$app = new Application($options);$server = $app->server;$this->wxApp = $app;$server->setMessageHandler(function ($message) {switch ($message->MsgType) {case 'event':// SCAN & subscribereturn $this->doEvent($message);break;}});$response = $server->serve();$response->send();}/*** 处理事件* @param $message* @author abei<abei@nai8.me>*/protected function doEvent($message){switch ($message->Event) {case 'SCAN':return $this->doScan($message);break;}}/*** 处理具体扫描事件* @param $message* @author abei<abei@nai8.me>*/protected function doScan($message){$key = $message->EventKey;$openId = $message->FromUserName;return $openId;}
}
为防止函数过长,我们拆分为几个小方法处理,同时增加一个叫做$wxApp的变量代表本次交互,串联每个函数。
我们准备工作暂时到这里,下面用到的时候再说。
生成临时二维码
现在我们通过 EasyWeChat 来生成一个临时二维码,那就定义一个叫做 actionQrcode 的函数吧。
namespace app\controllers;use Yii;
use yii\web\Controller;
use EasyWeChat\Foundation\Application;// 引入EasyWeChatclass WxController extends Controller {public $wxApp;...public $enableCsrfValidation = false;/*** 生成一个临时二维码* @author abei<abei@nai8.me>*/public function actionQrcode(){$options = Yii::$app->params['WECHAT'];$app = new Application($options);$qrcode = $app->qrcode;$rand = mt_rand(100000,999999);$result = $qrcode->temporary($rand, 6 * 24 * 3600);$ticket = $result->ticket;// 或者 $result['ticket']$url = $qrcode->url($ticket);return $this->render('qrcode',['url'=>$url,'rand'=>$rand]);}
}
actionQrcode 方法将一个随机的6位数字放到了临时二维码中,这里要说明有两点
- $url 即为二维码图片地址,在视图里直接用img 标签接收即可。
- 除了微信服务器验证为GET请求,其他的事件均为POST请求,但是yii2默认对于POST提交是进行crsf验证的,因此为了有效的接收微信服务器给我们的推送信息,我们需要关闭crsf验证。
public $enableCsrfValidation = false; // 我就是用来关闭crsf验证滴
这样我们就生成了一个含有$rand值的二维码,对于如何使用完成登陆方法很多,我这里使用浏览器请求方式,在actionQrcode的视图内,我填写如下代码
<img src="<?= $url;?>" alt="">
<script>//todo 每隔N秒钟向程序发起一次请求,询问一个叫做wx_qrcode的数据表是否有含有$rand的记录,如果有则php完成登陆,浏览器跳转到比如个人中心等页面
</script>
那么接下来就是这个叫做wx_qrcode的表如何设计以及记录如何产生的问题了。
重要的wx_qrcode表
如果你看了微信文档一定知道,当我们使用微信扫描临时二维码的时候,微信除了告诉我们服务器二维码所代表的$rand随机数字外,还有一个叫做$openId的标识,它代表扫码微信的唯一身份,因此我们设计了wx_qrcode表,里面含有open_id和rand。
思路是这样的
- 扫码后程序接到微信传递过来的open_id和rand随机码,进行会员初始化工作,同时往wx_qrcode表内存此记录。
- 程序接到浏览器请求,根据请求中的rand随机码来查询wx_qrcode,如果找到记录,则找到了open_id,也就找到了此会员,然后使用Yii::$app->user->login()方法进行登录授权,然后删除该记录后返给浏览器登录成功,否则返回失败,继续让浏览器N秒后询问。
也就是说我们需要修改第一步里的微信扫码处理程序,做简单处理。
namespace app\controllers;use Yii;
use yii\web\Controller;
use EasyWeChat\Foundation\Application;// 引入EasyWeChatclass WxController extends Controller {public $wxApp;public $enableCsrfValidation = false;.../*** 处理具体扫描事件* @param $message* @author abei<abei@nai8.me>*/protected function doScan($message){$key = $message->EventKey;$openId = $message->FromUserName;$user = User::find()->where(['open_id'=>$openId])->one();if($user == false){//todo 新建会员}$wxQrcode = new WxQrcode();$wxQrcode->open_id = $openId;$wxQrcode->rand = $key;$wxQrcode->save();}
}
这只是一个思路,各位兄弟根据自己系统的情况需要更加完善这块的逻辑,反正这个扫描的接收,我们需要填充wx_qrcode记录,让浏览器来询问。
ok,接下来我再说下PHP如何处理浏览器咨询的逻辑
public function actionAsk(){$rand = Yii::$app->request->get('key');$check = WxQrcode::find()->where(['rand'=>$rand])->one();if($check){$user = User::find()->where(['open_id'=>$check->open_id)->one();Yii::$app->user->login($user);$check->delete();return Json::encode(['done'=>true]);}else{//todo 不做什么,让浏览器继续问。}}
总结一下
扫码登陆有很多,比如生成二维码后不进行视图的循环,而是扫码后以动态码形式用模板消息等发给微信,微信在页面添加动态码实现验证登陆,就像兄弟连的微信登陆一样。
方法很多,核心就一条,就是利用二维码的内容进行PC和微信之间的传递。
转载于:https://my.oschina.net/abei2017/blog/913935
利用临时二维码实现在电脑浏览器上的微信扫码登陆功能 - EasyWeChat版相关推荐
- QR扫码综合示例教程(二十二)Qt5.15.2+Qt6.2.1(qml)+opencv4.5.4解决扫码聚焦、闪光灯(多线程、微信扫码)
前言: 因笔者前期设备限制,并没有考虑摄像头聚焦.闪光灯相关,有小伙伴问到相关问题,所以笔者就测试了下.结果有点失望,但仍然共享给小伙伴们,以减少走弯路 本教程是在 Qt5.15.2+Qt6.2.1( ...
- 资产管理二维码应用方案:微信扫码实现一物一码管理
固定资产管理的重要性不言而喻,涉及资产分类.采购管理.使用管理.维修管理.资产处置等多个环节.不仅可以帮助企业实现固定资产的最佳利用,也有利于延长固定资产的使用寿命,保护企业的资产安全. 但在固定资产 ...
- Spring学习笔记(二十三)——实现网站微信扫码登录获取微信用户信息Demo
目录 微信扫码登录介绍 开发步骤 微信扫码登录示例 微信开放文档 遇到的问题 使用第三方工具实现网站微信扫码登录 开发前介绍 开发步骤 微信扫码登录获取微信用户信息Demo实现流程 实现效果 实现过程 ...
- 开通微信扫码支付,申请微信扫码支付怎么用
微信扫码支付是在网页里, 生成一个支付二维码, 让用户用微信扫码支付二维码付款的一种方式. 微信扫码支付是PC电脑端, 用户非常方便的一种方式, 如果你的电脑h5网站想要, 让用户在线付款购买你的产品 ...
- 网站微信扫码支付java开发
网站微信扫码支付java开发 一.网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得 二.首先去微信公众平台申请账户 https://mp.weixin.qq.com ** 三 ...
- 【网课平台】Day10.对接第三方:实现微信扫码登录
文章目录 一.需求:微信扫码登录 1.接口文档 2.开发环境准备 3.接入分析 4.接口定义 5.申请令牌 6.查询用户信息 7.保存用户信息 一.需求:微信扫码登录 (和第三方对接的流程) 1.接口 ...
- 前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
整合篇二 前言 整合JWT 用户登录业务介绍 单一服务器模式 SSO(single sign on)模式 SSO登录三种常见的方式 传统用户身份验证 解决方案 JWT令牌 JWT的原则 整合 整合腾讯 ...
- 微信扫码赚钱是什么意思
最近流行微信扫码赚钱,那么,微信扫码是什么意思呢?其实,微信扫码,只要用微信扫二维码就可以赚钱的意思了.下面,具体与大家谈下微信扫描二维码赚钱. 微信扫码赚钱是今年新流行的一个词,具体的微信扫码赚钱是 ...
- 微信公众号生成临时二维码
微信公众号生成临时二维码 微信公众平台生成带参数的二维码官方文档 分为三个部分: 获取access_token.通过ticket换取二维码.生成带参数的二维码 特别注意:需要有生成二维码的权限. 整个 ...
最新文章
- Swift 中使用Alamofire 免证书的设置
- zencart安全辅助小脚本
- 堆叠柱形图上自定义数字_柱形图的类别标签太长太宽,倾斜起来了怎么办?
- java程序的装载与检查_浅谈Java类型装载、连接与初始化
- 机器学习(MACHINE LEARNING)灰色关联分析(GRA)
- 软件测试基础知识——适合初学者
- eclipse中的WEB项目打包部署到tomcat .
- c/c++与java------之JNI学习(一)
- 【渝粤教育】国家开放大学2019年春季 289法理学 参考试题
- 分享一个引起极度舒适的工作桌面
- [css] css的linear-gradient有什么作用呢?
- 指定的参数已超出有效值的范围_整流二极管的特性和重要参数
- Linguistic Data Consortium (LDC)
- Mac下IDEA使用优化
- @程序员,不要再锤产品经理了,锤这个吧!!!
- 意境级讲解二分查找算法、python
- 小额现金贷用户群体分析及风控体系搭建
- Android 计时器
- android 百度地图大头针,百度地图API 地理位置获取和大头针显示当前位置
- 微信小程序(uni-app)
热门文章
- java 日期相差月数_Java 计算两个日期之间相差的月数
- REVERSE-COMPETITION-HGAME2022-Week3
- 会议OA项目(六)--- (待开会议、历史会议、所有会议)
- 诊所病例信息管理系统(Java+Web+SSH+MYSQL)
- 药物从研发到上市需要经历哪些流程?||新药研发
- 标准方程法(正规方程法)
- 如何固定wifi direct的信道进行测试
- 使用VBA将Excel数据导入到Word的表格中
- 科普 | 区块链概念最全解析:区块链的下一个十年什么样?
- 黑猴子的家:JavaWeb 之 Title icon