今天逛知乎看到了这个问题,就来聊聊怎么扫码登陆网页绑定个人信息~
首先当用户打开一个网页的时候,我们需要生成一张二维码,
使用微信的获取带参数的二维码接口
接口地址: 生成带参数的微信二维码
分为临时和永久两种,当然我们这里使用临时的就可以了.
调用接口
1 2 3 4 |
http请求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST数据格式:json POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}} |
返回结果
1 |
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"} |
然后调用接口获取二维码
1 2 3 |
HTTP GET请求(请使用https协议) https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET 提醒:TICKET记得进行UrlEncode |
这样我们得到了二维码的图片,展示给用户
用户扫码以后,我们会得到一个扫码事件,事件的标识是SCAN,借用之前的一部分代码演示一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
case 'event': //点击等事件 $Event = $weObj->getRevData(); $userId = $weObj->getRevFrom();//获取用户 if($Event['Event'] == 'SCAN') { //来自场景扫描 $text = $this->actionEventData($Event,$userId); $weObj->text($text)->reply(); }elseif($Event['Event'] == 'subscribe'){ //新用户关注 if(empty($Event['EventKey'])) { //新用户关注 $text = C('Subscribe'); }else{ $text = $this->actionEventData($Event,$userId,1);//扫码进来的新用户关注事件 } $weObj->text($text)->reply(); }elseif($Event['Event'] == 'unsubscribe'){ //取消关注 //$weObj->text('取消关注了')->reply(); }elseif($Event['Event'] == 'CLICK'){ //自定义的点击事件 if (substr($Event['EventKey'],0,3) == 'BT_') { $wechatText = new wechatText(); $result = $wechatText->actionBtn(substr($Event['EventKey'],3,100),$userId); if($result['code'] > 0){ if ($result['type'] == 'imgArticle') { $weObj->news($result['text'])->reply(); }else{ $weObj->text($result['text'])->reply(); } } } }else{ exit('success');//不用回复数据 } break; |
如果: $Event[‘Event’] == ‘SCAN’,那就是来自场景扫描,然后我们获取扫描带过来的信息,也就是那个32位的字符串,
这样,如果这个串和获取二维码时候那个字符串是一样的,那肯定就是同一个人,因为扫描时候,我们同时获取到了用户的openid等等信息,根据openid,可以获取用户的其他信息,这样,我们把用户的openid存入数据库,下次扫码进来,我们直接比对openid就是了,这样一次完整的登陆就ok了!
因为做过与这个类似的功能,所以扫码登陆页应该是这个样子,如果文中有错误或者不严谨的地方,欢迎指正!