首页 > 编程语言 >PHP对接微信公众号 进行登录操作

PHP对接微信公众号 进行登录操作

时间:2024-06-03 23:11:16浏览次数:24  
标签:微信 对接 二维码 用户 token EventKey PHP data 事件

1.准备好公众号的appid和appsecret,以及IP白名单

2.php代码写入


 
    public function login_wx()
    {
        
        $data = Db::name('config')->where('config_key','WECHAT_CONFIG')->find();
        $value = json_decode($data['value'],true);
        $appid = $value['appid'];
        $appsecret =  $value['appsecret'];
        
        $sceneId = uniqid();
        $token = bin2hex(random_bytes(16));
 


      
        $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $access_token = $this->getAccessToken($appid, $appsecret);
        $ticket = $this->getQRTicket($access_token,'604800',$sceneId);
        $qrCodeURL = $this->getQRCode($ticket);
 
        $data = [
          'sceneid'=>$sceneId,  
          'token'=>$token,
           'ctime'=>time(),
           'dtime'=>time() + 300,
        ];
        $res = Db::name('wxlogin')->insert($data);
        
        $returns = [
          'token'=>$token,  
          'url'=>$qrCodeURL,
        ];
        
        if($res){
            return json_encode($returns);
        }

    }
    
    //验证用户
    public function checkLogin() {
        
        var_dump($_REQUEST);die;
        $token = $_REQUEST['token'];
        
        $data = Db::name('wxlogin')->where('token',$token)->find();
        
        if($data['status'] == 1){  //已经登录
            $returns = [
               'code'=>1,
               'msg'=>'已登录',  
            ];
        }
        if($data['status'] == 3){  //二维码已过期
            $returns = [
               'code'=>3,
               'msg'=>'二维码已过期',  
            ];
        }
        if($data['status'] == 2){  //未登录
             $returns = [
               'code'=>2,
               'msg'=>'未登录',  
            ];
        }
        return json_encode($returns);
   
   
    }

    
    

    public function getQRCode($ticket) {
        $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" . urlencode($ticket);
        return $url; // 这个URL即为二维码图片的URL
    }


    public function getAccessToken($appid, $appsecret) {
        $access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
        $access_token_data = json_decode(file_get_contents($access_token_url), true);
     
  
        return $access_token_data['access_token'];
    }
    
     // 生成二维码Ticket
    public function getQRTicket($accessToken, $expireSeconds = 604800, $sceneId = 1) {
        $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$accessToken}";
        $data = json_encode([
            'expire_seconds' => $expireSeconds, 
            'action_name' => 'QR_SCENE', 
            'action_info' => ['scene' => ['scene_id' => $sceneId]]
        ]);
        $options = [
            'http' => [
                'method' => 'POST',
                'header' => "Content-Type: application/json",
                'content' => $data,
                'timeout' => 60
            ]
        ];
        $context = stream_context_create($options);
        $response = json_decode(file_get_contents($url, false, $context), true);
        return $response['ticket'];
    }
 
 

3.在公众号的 服务器配置的服务器地址(URL)里面写

   $data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
       if ( $data->Event == 'subscribe' ||  $data->Event == 'SCAN'  ) {   // 关注公众号  或者  已关注用户扫码 
            if (!empty($data->EventKey)) {
                // 这里的qrscene_为前缀,后面跟的是你设置的参数值
                $scene_id = str_replace('qrscene_', '', $data->EventKey);
                //检测场景值是否过期
                //没过期就 查询数据库wxlogin对饮的token返回给前端顺利登陆
                $cinfo = Db::name('wxlogin')->where('sceneid',$scene_id)->find();
                if(time() < $cinfo['dtime']){  //执行登录
                    $res = Db::name('wxlogin')->where('sceneid',$scene_id)->update(['status'=>'1']);
                    if($res){
                        // 向用户发送消息123
                        $this->sendTextMessage($data->FromUserName, $data->ToUserName, '恭喜您已经成功登录');  
                    }  
                }else{  //已经过期。执行过期状态
                    $res = Db::name('wxlogin')->where('sceneid',$scene_id)->update(['status'=>'3']);
                    
                }
            }
        }
           
 
        
        
        
        if ( $data->Event == 'unsubscribe' ) {   // 用户取消关注公众号
       
        }
        


4.微信给 服务器地址返回的信息 :这里做详细解释

这是接收到的数据

{"ToUserName":"gh_32219ed1e2ea","FromUserName":"o0czO6dbV0cfDFy96tHPr99m3Lxg","CreateTime":"1717421428","MsgType":"event","Event":"SCAN","EventKey":"1","Ticket":"gQEN8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNVh6RVlXaGNmZUYxdVNZQ05DMW8AAgQ2wl1mAwSAOgkA"}

$data->MsgType

   这是一个描述消息类型的字段。MsgType用来指示消息的种类,比如:
     text 表示文本消息。
     image 表示图片消息。
     event 表示事件推送。       
 当MsgType的值为event时,表示接收到的是一个事件推送。事件推送不是用户直接发送的消息,而是某些用户行为或微信行为触发的通知,比如用户关注或取消关注公众号、用户扫描二维码等。

$data->Event:

当MsgType为event时,Event字段用来进一步指定事件的类型。例如:
 subscribe 表示用户关注公众号事件。
 unsubscribe 表示用户取消关注公众号。
 SCAN 表示用户已关注公众号后扫描二维码。
CLICK 表示用户点击了自定义菜单。
 在你的例子中,$data->Event == 'subscribe' 指的是用户关注公众号的事件。当用户首次关注公众号,或者之前取消关注后再次关注时,你的服务器会接收到这个事件

$data->EventKey

 EventKey是与特定事件相关联的一个参数,主要用在事件推送(event)中。这个参数的值取决于具体的事件类型:

 关于二维码扫描:
 当用户扫描带参数的二维码时,无论是已关注还是未关注用户,微信都会将事件推送到你的服务器。这时,EventKey将包含与该二维码相关的信息:
 对于未关注用户扫描后关注的事件(subscribe),EventKey会以qrscene_为前缀,后接你创建二维码时定义的场景值(scene_id或scene_str)。例如,如果场景值是123,EventKey就会是qrscene_123。
 对于已关注用户扫描二维码的事件(SCAN),EventKey直接是二维码的场景值,比如123。
 自定义菜单事件:
 如果用户点击了自定义菜单项,且该菜单项是点击类型(click),则EventKey是与该菜单项相关联的key值,这个值是在设置自定义菜单时由开发者指定的。

$data->Ticket

 Ticket参数通常与二维码扫描事件相关联。当用户扫描一个带参数的二维码时,微信会在推送的事件信息中包含一个Ticket值。这个Ticket可以视为该次扫描事件的一个唯一标识符。具体来说:
 二维码扫描事件:
 当用户扫描带参数二维码时,无论是关注还是未关注,事件推送中都会包含Ticket参数。这个Ticket是在生成二维码时由微信生成并提供的,可以用来获取扫描者和二维码的详细信息。

标签:微信,对接,二维码,用户,token,EventKey,PHP,data,事件
From: https://www.cnblogs.com/79524795-Tian/p/18229889

相关文章

  • CTFHUB-信息泄露-目录遍历和PHPINFO
    目录目录遍历PHPINFO目录遍历很简单,挨着把每个目录都点开看一下发现2目录下有个flag.txt文件,点开发现了本关的flagPHPINFO这关也很简单,进来之后是一个phpinfo页面,按CTRL+F键打开查询,输入flag,查找到了本关的flag ......
  • uniapp微信小程序获取手机号 位置信息
    一.获取手机号获取手机号<template><u-buttonopen-type="getPhoneNumber"@getphonenumber="getNumber">一键登录</u-button></template><script>exportdefault{methods:{getNumber(e){......
  • 【微信小程序】bug解决:van-tab+ucharts多图显示问题
    这是一条价值30r的博客......
  • 通过GB/T28181国标协议实现视频监控平台间的级联对接
    随着近几年网络视频监控应用范围的扩大,越来越多的政府部门及跨区域行业单位对视频监控的需求已经不仅仅满足于本地的联网监控,更多正在探索在原有本地联网监控基础上,建设省级乃至全国范围内跨区域的监控联网,全面打造数据共享平台。Liveweb视频融合云平台具备视频监控直播、云端......
  • php接入eGhl支付
     参数1#订单信息2$order=$order->toArray();3$products="商品信息";4$PaymentID=substr(md5(time()),0,19);5$PageTimeout=780;6$url=env('APP_URL','');7#支付成功链接post8$MerchantApprovalU......
  • 解决php因为输出内容太短无法流式(Stream)输出问题
    实测得知,如果用PHP做流式输出每次echo的内容太短的话,就没有流式的效果了,而是会等输出的长度达到一定时前端才能拿到结果,如下:  这是我这边的测试结果,可见,这里仅接收到了两次流式输出,但是我在PHP里是输出了10次,从而证明了每次流式的内容达到一定长度时才能有流式得到效果,这个......
  • python对接zabbix API
    frompyzabbix.apiimportZabbixAPIwithZabbixAPI(url='http://192.168.1.10:8080',user='admin',password='admin')aszapi:hosts=zapi.host.get(#获取所有字段output=["hostid","host"],......
  • 微信小程序-声明和绑定事件
    一.概念小程序页面使用的数据在Page()方法里使用data对象进行声明定义定义好之后,使用{{}}进行绑定声明Page({data:{school:'未发之中',obj:{name:'dadada'},id:1,useChk:true}})绑定<!--使用双括号展示数据--><view>{{scho......
  • 微信小程序开发中的表单验证与数据提交
    表单验证和数据提交在微信小程序开发中是非常常见的功能。表单验证用于确保用户输入的数据符合指定的格式要求,数据提交用于将用户输入的数据发送到服务器端进行处理。下面是一个示例,演示了如何在微信小程序中进行表单验证和数据提交。首先,让我们创建一个简单的表单,包含用户名......
  • 苹果手机怎么恢复微信聊天记录?2024不要错过的4个方法!
    作为一款广受欢迎聊天APP,微信会保存我们的聊天记录,包括图片、视频和信息。然而,很多人都想知道,如果我们意外丢失或删除了苹果手机微信上的数据,是否还能恢复它们?答案是100%肯定的。接下来,本文将为你介绍苹果手机怎么恢复微信聊天记录,其中包括在有备份或无备份的情况下找回删除的......