PHP实现关注公众号登陆网站功能

克里姆林宫

要求必须公众号已经认证
原理通过生成带参数二维码+随机字符串存入库中
然后用户扫描关注后,微信推送消息中带 随机字符串,与库中相比完成登录

只贴核心代码

生成二维码推送

<?php
    include('./curl.php');
    include('./file.php');
    $appid = "APPID";
    $secret = "SECRET";
    $get_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";//获取access_token的url
    //获取token过程开始
    $token = curl_get($get_token_url);
    $token = json_decode($token,true);
    $token = $token['access_token'];
    //获取token过程结束


    $get_code_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$token}";//获取ticket的url
    $string = createToken(24);//随机字符串
    $get_code_url_parmeter = array(
        'expire_seconds'=>2592000,//二维码有效期 2592000是30天
        'action_name'=>'QR_STR_SCENE',//微信推送消息时的参数类型,QR_STR_SCENE为字符串
        'action_info'=>array(
            'scene'=>array(
                'scene_str'=>$string,//微信随送消息时的参数。
            )
        )
    );
    
    //模拟器数据库存入开始
    $logininfo_array = array('string'=>$string,'islogin'=>0);
    writeArrayToFile($logininfo_array,"logininfo.txt");
    //模拟器数据库存入结束

    //获取ticket开始
    $get_code_url_parmeter = json_encode($get_code_url_parmeter);
    $qrcode = curl_post($get_code_url,$get_code_url_parmeter);
    $ticket =  json_decode($qrcode,true);
    $ticket = $ticket['ticket'];
    //获取ticket结束

    $qrcodeimg = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={$ticket}";
    echo $qrcodeimg;
    //向前端返回二维码链接

    function createToken($long){//创建随机字符串 long参数为字符串长度
        $char = '1234567890ABCDEFGHIGHLMNOPQRSTUVWXYZ';
        $token = '';
        for ($i = 0; $i <= $long; $i++) {
            $token.= $char[rand(0, strlen($char) - 1) ];
        }
        return $token;
    }
    
?>

//接收微信推送消息

<?php
    include('./file.php');


    if($_SERVER['REQUEST_METHOD'] == 'GET'){//配置服务器时的验证
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $echostr = $_GET["echostr"];
        $token = "abcd";
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            echo $echostr;
        }else{
            return false;
        }
    }else{

        $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //接收微信推送,xml格式
        $logininfo = readFileToArray("logininfo.txt"); //读取之前存入的随机字符串。
        $objectxml = simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA); //xml转objcet
        $userinfo = json_decode(json_encode($objectxml),true);         //objcet 转php array


        if($userinfo['EventKey']==$logininfo['string'] || $userinfo['EventKey']=='qrscene_'.$logininfo['string']){
            //首次关注的推送前面多了一个qrscene_ 所以做或判断
            //随机字符串和推送的字符串相匹配,证明已进入公众号


            $logininfo['islogin']=1; //模拟数据库操作,登陆状态变1
            $logininfo['openid']=$userinfo['FromUserName']; //模拟数据库操作,保存用户openid


            if($userinfo['Event']==="subscribe"){//首次关注事件类型:subscribe
                //first 
                $logininfo['text']="该用户首次关注";
                
            }else if($userinfo['Event']==="SCAN"){//直接进入事件类型:SCAN
                $logininfo['text']="该用户已关注";
            }
            
            writeArrayToFile($logininfo,"logininfo.txt");//模拟数据库操作。
        }
        
    }    
?>
阅读 150
38 声望
1 粉丝
0 条评论
你知道吗?

38 声望
1 粉丝
文章目录
宣传栏