微信公众号扫码登陆原理及代码实现

版权声明:转发原创文章请复制文章链接地址 https://blog.csdn.net/weixin_42579642/article/details/82461647

1.用户打开公众号点击扫码功能(注意我们用 scancode_waitmsg这种类型即可)

 2.用户扫描了二维码会给微信发送信息,然后微信把信息以XML格式发送给我们的服务器

3.接收数据,并把数据保存于数据库或者缓存,代码如下:

$wechatObj = new wechatCallbackapiTest();
$xml = file_get_contents('php://input','r');
$arr = $wechatObj->XmlToArr($xml);
//微信扫码登陆
if($arr['Event'] == 'scancode_waitmsg') {
    //file_put_contents(__DIR__.'/aa.log',print_r($wechatObj->XmlToArr($xml),true),FILE_APPEND);
    $link = mysqli_connect('127.0.0.1','root','root','shop');
    $openid = $arr['FromUserName'];
    $ToUserName = $arr['ToUserName'];
    $CreateTime = time();
    $MsgType = $arr['MsgType'];
    $sessionid = $arr['ScanCodeInfo']['ScanResult'];
    mysqli_query($link,"insert into shop_sessid_openid(sessid,openid) values('{$sessionid}','{$openid}')");
    $weixin_arr = [
        'ToUserName'    =>  $openid,
        'FromUserName'    =>  $ToUserName,
        'CreateTime'    =>  $CreateTime,
        'MsgType'    =>  'text',
        'Content'    =>  '扫码成功',
    ];
    echo $str = $wechatObj -> ArrToXml($weixin_arr);
    file_put_contents(__DIR__.'/aa.log',$str,FILE_APPEND);
}

4.同时pc端二维码页面,会有一个计时器,一直请求一个页面或者方法,去根据sessionid查询数据库,当有对应的数据的时候,    把用户信息存入session,返回登录成功表示,同时要在存sessionid和openid的表中做一个登录标识,或者登录的同时把数据删    掉,代码如下

 public function weixin_do(){
        $sessid = session_id();
        $sess_data = M('sessid_openid')->where(['sessid'=>$sessid])->find();
        if(!empty($sess_data)){
            $open_data = M('weixin')->where(['openid'=>$sess_data['openid']])->find();
            if(!empty($open_data)){
                $user_data = M('user')->where(['phone'=>$open_data['user_phone']])->find();
                session('user_data',$user_data);
                M('sessid_openid')->where(['sessid'=>$sessid])->delete();
                echo 1;
            }
        }
    }

此时pc页面登录成功,公众号里面可以给用户提示扫码成功(如果不给用户提示信息会报异常)

猜你喜欢

转载自blog.csdn.net/weixin_42579642/article/details/82461647