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版相关推荐

  1. QR扫码综合示例教程(二十二)Qt5.15.2+Qt6.2.1(qml)+opencv4.5.4解决扫码聚焦、闪光灯(多线程、微信扫码)

    前言: 因笔者前期设备限制,并没有考虑摄像头聚焦.闪光灯相关,有小伙伴问到相关问题,所以笔者就测试了下.结果有点失望,但仍然共享给小伙伴们,以减少走弯路 本教程是在 Qt5.15.2+Qt6.2.1( ...

  2. 资产管理二维码应用方案:微信扫码实现一物一码管理

    固定资产管理的重要性不言而喻,涉及资产分类.采购管理.使用管理.维修管理.资产处置等多个环节.不仅可以帮助企业实现固定资产的最佳利用,也有利于延长固定资产的使用寿命,保护企业的资产安全. 但在固定资产 ...

  3. Spring学习笔记(二十三)——实现网站微信扫码登录获取微信用户信息Demo

    目录 微信扫码登录介绍 开发步骤 微信扫码登录示例 微信开放文档 遇到的问题 使用第三方工具实现网站微信扫码登录 开发前介绍 开发步骤 微信扫码登录获取微信用户信息Demo实现流程 实现效果 实现过程 ...

  4. 开通微信扫码支付,申请微信扫码支付怎么用

    微信扫码支付是在网页里, 生成一个支付二维码, 让用户用微信扫码支付二维码付款的一种方式. 微信扫码支付是PC电脑端, 用户非常方便的一种方式, 如果你的电脑h5网站想要, 让用户在线付款购买你的产品 ...

  5. 网站微信扫码支付java开发

    网站微信扫码支付java开发 一.网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得 二.首先去微信公众平台申请账户 https://mp.weixin.qq.com ** 三 ...

  6. 【网课平台】Day10.对接第三方:实现微信扫码登录

    文章目录 一.需求:微信扫码登录 1.接口文档 2.开发环境准备 3.接入分析 4.接口定义 5.申请令牌 6.查询用户信息 7.保存用户信息 一.需求:微信扫码登录 (和第三方对接的流程) 1.接口 ...

  7. 前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)

    整合篇二 前言 整合JWT 用户登录业务介绍 单一服务器模式 SSO(single sign on)模式 SSO登录三种常见的方式 传统用户身份验证 解决方案 JWT令牌 JWT的原则 整合 整合腾讯 ...

  8. 微信扫码赚钱是什么意思

    最近流行微信扫码赚钱,那么,微信扫码是什么意思呢?其实,微信扫码,只要用微信扫二维码就可以赚钱的意思了.下面,具体与大家谈下微信扫描二维码赚钱. 微信扫码赚钱是今年新流行的一个词,具体的微信扫码赚钱是 ...

  9. 微信公众号生成临时二维码

    微信公众号生成临时二维码 微信公众平台生成带参数的二维码官方文档 分为三个部分: 获取access_token.通过ticket换取二维码.生成带参数的二维码 特别注意:需要有生成二维码的权限. 整个 ...

最新文章

  1. Swift 中使用Alamofire 免证书的设置
  2. zencart安全辅助小脚本
  3. 堆叠柱形图上自定义数字_柱形图的类别标签太长太宽,倾斜起来了怎么办?
  4. java程序的装载与检查_浅谈Java类型装载、连接与初始化
  5. 机器学习(MACHINE LEARNING)灰色关联分析(GRA)
  6. 软件测试基础知识——适合初学者
  7. eclipse中的WEB项目打包部署到tomcat .
  8. c/c++与java------之JNI学习(一)
  9. 【渝粤教育】国家开放大学2019年春季 289法理学 参考试题
  10. 分享一个引起极度舒适的工作桌面
  11. [css] css的linear-gradient有什么作用呢?
  12. 指定的参数已超出有效值的范围_整流二极管的特性和重要参数
  13. Linguistic Data Consortium (LDC)
  14. Mac下IDEA使用优化
  15. @程序员,不要再锤产品经理了,锤这个吧!!!
  16. 意境级讲解二分查找算法、python
  17. 小额现金贷用户群体分析及风控体系搭建
  18. Android 计时器
  19. android 百度地图大头针,百度地图API 地理位置获取和大头针显示当前位置
  20. 微信小程序(uni-app)

热门文章

  1. java 日期相差月数_Java 计算两个日期之间相差的月数
  2. REVERSE-COMPETITION-HGAME2022-Week3
  3. 会议OA项目(六)--- (待开会议、历史会议、所有会议)
  4. 诊所病例信息管理系统(Java+Web+SSH+MYSQL)
  5. 药物从研发到上市需要经历哪些流程?||新药研发
  6. 标准方程法(正规方程法)
  7. 如何固定wifi direct的信道进行测试
  8. 使用VBA将Excel数据导入到Word的表格中
  9. 科普 | 区块链概念最全解析:区块链的下一个十年什么样?
  10. 黑猴子的家:JavaWeb 之 Title icon