首页 > 其他分享 >手把手教你给网站增加微信扫码登录功能

手把手教你给网站增加微信扫码登录功能

时间:2023-11-02 17:11:37浏览次数:36  
标签:扫码 return 微信 hasUser key 手把手 data id

在网站开发中,我们经常会遇到需要给网站增加微信扫码登录的功能,一般来说有两种方式可以实现,一种是使用微信开放平台,另一种是使用微信认证服务号的参数二维码,网上以第一种居多,我们今天来说下第二种方式。 首先准备一个【已认证】的微信服务号 将公众号添加至【柠聚开发者平台】中,如图1:

image

然后将生成的回调URL添加至微信公众平台中,如图:

image

这样基础配置就完了,下面我们开始码代码。 首先获取带参数二维码:接口文档见:获取带参数二维码-柠聚开发者平台-柠聚开发者平台 (21ds.cn)

function getWxQrcode($scene)
{
    $apiUrl = 'https://21ds.cn/mpWeixinApi/getQrcode';
    $postData['scene_str'] = $scene;
    $postData['action_name'] = 'QR_STR_SCENE';
    $postData['expire_seconds'] = 120;
    $postData['dev_key'] = 'DEV-xxxxxx';
    $postData['mw_id'] = 'MW4xxxxxx';
    $postData['sign'] = devSignGeneral($postData, 'Wxaxwsxssss');
    $http = new \Yurun\Util\HttpRequest;
    $response = $http->post($apiUrl, $postData);
    $result = json_decode($response->body(), true);
    if ($result['code'] == 200) {
        return $result['data'];
    }
    return [];
}

定义完请求函数后,我们调用这个函数获取到二维码返回给前端:(注:我们在定义参数二维码的scene值时,增加了demo::,这个主要是用来获取到scene事件时寻找请求api接口的,从而可以实现一个微信服务号对接多个网站的二维码登录)

public function get_wechat_login_qrcode(){
    $uuid = createId();
    (new RedisCache)->getSetQrcodeLoginUUID($uuid, 1, 120);
    $data = getWxQrcode('demo::' . $uuid);
    if (empty($data)) {
      return json(['code' => -1, 'msg' => '二维码获取失败']);
    }
    $return['qrcode'] = $data['qrcode_pic'];
    $return['url'] = $data['url'];
    $return['token'] = $uuid;
    return json(['code' => 200, 'msg' => 'success', 'data' => $return]);
  }

其中,getSetQrcodeLoginUUID这个函数用来存储登录状态,函数代码为:

public function getSetQrcodeLoginUUID($key, $data = '', $expireTime = 300)
    {
        $tokenInfo = '';
        if (!empty($data) && !empty($key)) {
            self::$redis->set('demo:loginUUID:' . $key, $data, $expireTime);
        } else {
            $cacheTTL = self::$redis->ttl('demo:loginUUID:' . $key);
            if ($cacheTTL === -1 || $cacheTTL > $expireTime) {
                self::$redis->del('demo:loginUUID:' . $key);
            }
            if (self::$redis->exists('demo:loginUUID:' . $key) > 0) {
                $data_s = self::$redis->get('libs:loginUUID:' . $key);
                $tokenInfo = $data_s;
            }
            return $tokenInfo;
        }
    }

访问get_wechat_login_qrcode函数后,可以获取的“qrcode”及”url”参数,其中qrcode是二维码图片,url是一个链接,可以用来生成二维码图片,根据自己的需要自主选择使用哪个参数即可。 获取到二维码图片后,使用微信扫描二维码后,用户需要关注微信服务号(如未关注过)或者直接进入了微信服务号窗口,此时,将触发微信的事件通知,通知会寻找在图1的“事件通知API”定义的demo的通知接口,如在事件通知api中,我们定义了一个:demo::https://www.demo.com.cn/notify/wechat_login 接口,柠聚开发者平台将post事件通知到此接口,定义的接口文档参见:接收事件通知-柠聚开发者平台-柠聚开发者平台 (21ds.cn) 然后我们根据事件的key值便可进行业务处理了,以下为demo代码:

// 使用带参数二维码扫码登录接口
  public function wechat_login()
  {
    if (request()->isPost()) {
      $rule = [
        'event_key'  => 'require',
        'open_id'  => 'require',
      ];
      $data = [
        'event_key'  => input('param.event_key', '', 'trim'),
        'open_id'  => input('param.open_id', '', 'trim'),
      ];
      $validate = Validate::rule($rule);
      $result   = $validate->check($data);
      if (!$result) {
        return Result::Success(['content' => $validate->getError()], 'fail');
      }
      $event_key = $data['event_key'];
      $open_id = $data['open_id'];
      $event_key = str_replace('demo::', '', $event_key);
      if (empty($open_id)) {
        return Result::Success(['content' => '必要参数为空'], 'fail');
      }
      $hasUser = demoUserModel::where('wechat_open_id', $open_id)->find();
      if (empty($hasUser)) {
        (new RedisCache)->getSetQrcodeLoginUUID($event_key, -3, 120);
         return Result::Success(['content' => '您还未绑定平台账号,请【使用账号密码】登录平台并绑定后再试'], 'fail');
      }
      if ($hasUser['status'] != 1) {
        return Result::Success(['content' => '用户状态异常或被封禁,请联系上级管理进行处理。'], 'fail');
      }
      //更新会员状态
      $param = [
        'login_times' => $hasUser['login_times'] + 1,
        'login_ip' => $ip,
        'login_time' => $time,
      ];
      demoUserModel::where('id', $hasUser['id'])->update($param);
      $payload['uid']       = $hasUser['id'];
      $payload['password']       = $hasUser['password'];
      $payload['loginTime'] = $time;
      $token = think_encrypt(json_encode($payload));
      $tokenArr['userToken'] = $token;
      //用户登录有效期
      $loginExpireTime = 86400;
      $loginRefreshExpireTime = 86400;
      // 存储用户token
      $this->redis->set('token-' . $hasUser['id'], $token, $loginExpireTime);
      $tokenArr['Expire'] = $loginExpireTime * 1000;
      $tokenArr['isSuper'] = $hasUser['is_admin'];
      $tokenArr['username'] = $hasUser['username'];
      $tokenArr['avatar'] = $hasUser['avatar'];
      (new RedisCache)->getSetQrcodeLoginUUID($event_key, json_encode($tokenArr, true));
      return Result::Success(['content' => $hasUser['username'] . ' 通过扫码登录【XXXXX网站】成功'], '登录成功,页面将自动跳转……');
    }
    return Result::Success(['content' => '请求不正常'], 'fail');
  }

至此,我们完成了微信扫码登录的整套流程。

 

标签:扫码,return,微信,hasUser,key,手把手,data,id
From: https://www.cnblogs.com/devqianlong/p/17805820.html

相关文章

  • (1)微信UI自动化-篇章开启(C#)
    ​近期看到很多人用HOOK钩子的方式来拦截微信的消息来实现微信的外挂操作。我觉得在当下的互联网环境下反编译别人的软件进行注入已属于违规甚至非法操作,但是使用软件本身的UI对象进行自动化来辅助办公是一种趋势和潮流,比较重复的工作交给计算机是最合适的。解放双手!!!所以我利用业......
  • (2)PC微信UI自动化-微信窗体自动化初始化(C#)
    ​ 我们接下来的操作的对象是微信窗体,分成这几个步骤可以将微信窗体进行自动化操作前的初始化(1)通过窗体名称找到微信句柄指针。(2)通过窗体指针找到微信的进程ID。(3)使用进程ID初始化自动化组件服务。(4)设置微信窗体的状态为激活。(1)找到PC端微信窗体并获取微信窗体的句柄数据......
  • (4)PC端微信UI自动化-微信联系人采集(C#)
    ​ 在进行一系列操作之前,我们需要采集到微信中的联系人和群聊信息软件运行效果演示  接下来我们如何采集到微信中的联系人列表呢?(1)找到通讯录按钮UI元素执行点击操作。(2)找到联系人面板并执行面板滚动操作(3)滚动过程中获取面板List对象中的ListItem项中的各个子元素......
  • (3)微信UI自动化-热键管理(C#)
    ​    进行微信自动化前,因为采集或者发送消息任务执行需要时间,并且微信窗体会将焦点长期占有,导致我们对软件失去控制,所以我们需要使用热键的方式将任务停止。我们这里采用热键是​编辑。(1)编写一个热键管理类 这个类定义了捕获热键消息的ID,注册热键,注销热键的功能。usi......
  • 2023-11-02 微信小程序的button的border如何清除?==》清除其伪类after即可
    给微信小程序的button的border设置为0或者none,依旧无法清除,这是因为button的border是用了伪类after来实现的,清除该伪类即可,你也可以参考我的css:.button{padding:0;margin:0;background:transparent!important;&::after{border:0;}}......
  • uniapp微信小程序自定义隐私权限弹窗
    插件地址:https://ext.dcloud.net.cn/plugin?id=14576#detail 样式小改动<template><viewclass="xh-privacy"><!--默认主题--><view:style="'background:'+background+';'"class="the......
  • 手机通讯录好备份,那微信通讯录怎么备份出来
    6-8众所周知的是,手机通讯录是很好备份的,但是微信不行,手机本身就带有备份功能,换手机可以快速地迁移通讯录,比如下面这个就是小米手机自带的备份功能,简单好用但是现在生意可都在微信上做了,微信又有封号、交接工作的可能,微信上的通讯录怎么导出来,就是个大问题,因为微信本身就不提供这种......
  • 有什么可以自动保存微信收到的图片和视频的方法么
    8-1在一些有外勤工作的公司里,经常会需要在外面工作的同事把工作情况的图片发到指定微信或者指定的微信群里,以记录工作进展等,或者打卡等,对于外勤人员来说,也就发个图片的事,但是对于在公司里收图片的人来说,可能是个麻烦的活。因为有可能每天要保存上千张图片,或者视频,要是都靠人工保存......
  • PC企业微信hook接口,通过查询添加外部联系人教程
    简要描述通过查询添加为联系人(外部联系人)操作码102008请求说明参数名必选类型说明type是int类型addType是string类型14微信用户1企业用户user_id是string用户idcontent是string添加请求语openid是string标识syncKey是string同步key请求示例{"type":102008,"data":{"a......
  • CodeWhisperer 初体验-手把手教导 给你飞一般的体验!
    文章作者:燛衣CodeWhisperer有以下几个主要用途:解决编程问题:CodeWhisperer可以帮助您解决遇到的编程问题。您可以描述您的问题或需求,CodeWhisperer将尽力提供相关的解决方案、代码示例或建议。无论您是遇到了语法错误、逻辑问题还是需要优化代码,CodeWhisperer都可以为您提......