微信公眾號掃碼登陸原理及程式碼實現
阿新 • • 發佈:2018-11-13
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頁面登入成功,公眾號裡面可以給使用者提示掃碼成功(如果不給使用者提示資訊會報異常)