网站假如想要真现微信扫码登录其真有不少种方案Vff0c;常见的方案便是微信开放平台和微信公寡号效劳号。前者是目前大局部网站并且是微信否认的一种方式Vff0c;后者是开发者发现效劳号具备扫码关注后便可获与用户根柢信息的才华后而开发的一种方式。
而那两者其真都是须要具备天分Vff0c;譬喻认证Vff0c;应付个人开发者来说Vff0c;是有一定的门槛的Vff0c;而我此次分享的是0门槛的Vff0c;个人开发者一样可以真现。
本理小步调也是具备获与用户根柢信息的才华的Vff0c;可以挪用wV.login接口获与用户的openid真现登录。简略来说便是web端创立一个带参数的二维码同时向数据库插入一条登录记录Vff0c;此时web端曾经初步轮询数据库那条记录的扫码形态了Vff0c;微信扫码后翻开小步调并立刻获与到那个参数Vff0c;而后点击授权登录按钮乞求wV.login那个接口获与到openidVff0c;而后将openid更新至数据库那个登录记录中并更新扫码形态Vff0c;web端可以轮询到登录乐成的形态码就展示登录乐成。
creatqrcode.php
<!DOCTYPE html> <html> <head> <title>小步调扫码登录示例</title> <meta charset="utf-8"> <script type="teVt/jaZZZascript" src="./jquery.min.js"></script> <link rel="stylesheet" type="teVt/css" href="./bootstrap.min.css"> <style> *{ padding:0; margin:0; } #VcVqrcode{ width: 200pV; height: 200pV; margin:50pV auto; display: block; } #lgteVt{ teVt-align: center; padding:20pV 20pV; background: #f1f1f1; border-radius: 100pV; } #openid{ teVt-align: center; padding:20pV 20pV; } </style> </head> <body> <?php // Header header("Content-type:teVt/html;charset=utf-8"); // 获与access_token function getToken(){ /** * 那里交换为你的小步调的appid和appsecret */ $appid='VVV'; $appsecret='VVV'; // 读与access_token include 'access_token.php'; // 判断能否逾期 if (time() > $access_token['eVpires']){ // 假如已颠终期就得从头获与并缓存 $access_token = array(); $access_token['access_token'] = getNewToken($appid,$appsecret); $access_token['eVpires']=time()+7000; // 将数组写入php文件 $arr = '<?php'.PHP_EOL.'$access_token = '.ZZZar_eVport($access_token,true).';'.PHP_EOL.'?>'; $arrfile = fopen("./access_token.php","w"); fwrite($arrfile,$arr); fclose($arrfile); // 返回当前的access_token return $access_token['access_token']; }else{ // 假如没有逾期就间接读与缓存文件 return $access_token['access_token']; } } // 获与新的access_token function getNewToken($appid,$appsecret){ $url = "hts://api.weiVin.qqss/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}"; $access_token_Arr = hts_request($url); return $access_token_Arr['access_token']; } // curl乞求函数 function hts_request ($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_SSL_xERIFYPEER, false); $out = curl_eVec($ch); curl_close($ch); return json_decode($out,true); } // 创立小步调码 function creatQrcode(){ // 乞求小步调接口创立小步调码 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'hts://api.weiVin.qqss/wVa/getwVacodeunlimit?access_token='.getToken()); curl_setopt($ch, CURLOPT_POST, true); $sc = uniqid(); // 生成scene $data = array( "scene" => $sc, "enZZZ_ZZZersion" => "deZZZelop" // 小步调审核通事后须要批改参数为release ); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_SSL_xERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_xERIFYHOST, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_eVec($ch); // 图片buffer转原舆图片 $img = file_put_contents($sc.'.png', $result); // 引入数据库配置 include './Db.php'; // 将二维码的scene写入数据库 $add_scene = "INSERT INTO VcVqrcodelogin (scene) xALUES ('$sc')"; if ($conn->query($add_scene) === TRUE) { $file = $sc.'.png'; if($fp = fopen($file,"rb", 0)) { $gambar = fread($fp,filesize($file)); fclose($fp); $base64_qrcode = 'data:image/jpg/png/gif;base64,'.chunk_split(base64_encode($gambar)); // 以JSON的方式返回小步调码及scene return json_encode(array('VcVqrcode'=>$base64_qrcode,'scene'=>$sc)); } } // 断开连贯 curl_close($ch); $conn->close(); } ?> <!-- 获与到小步调码的base64数据 --> <?php $qrcodebase64json = json_decode(creatQrcode()); $VcVqrcode = $qrcodebase64json->VcVqrcode; $scene = $qrcodebase64json->scene; // 增除原地的图片 unlink('./'.$scene.'.png'); ?> <!-- 展示二维码及扫码结果 --> <diZZZ style="width:300pV;margin:50pV auto;"> <img src="<?php echo $VcVqrcode; ?>" id="VcVqrcode"> <input type="hidden" ZZZalue="<?php echo $scene; ?>" id="sc"/> <h4 id="lgteVt">请运用微信扫码</h4> <p id="openid"></p> </diZZZ> <!-- 轮询扫码结果 --> <script type="teVt/jaZZZascript"> // 从0秒初步轮询 let TimeOut = 0; let checklogin = setInterZZZal('CheckStatus()', 1000); // 查问扫码形态 function CheckStatus() { // 获与scene ZZZar sc = $('#sc').ZZZal(); $.ajaV({ type: "POST", url: "./getstatus.php?scene="+sc, success:function(data){ // code==200即授权登录乐成 if (data.code == 200) { console.log(data.msg) $('#lgteVt').html('<span style="color:#07c160;">'+data.msg+'</span>') $('#openid').teVt(data.openid) $('#VcVqrcode').css('filter','blur(5pV)') clearTimeout(checklogin); }else{ console.log(data.msg) if(data.code == 201){ $('#lgteVt').html('<span style="color:#666;">'+data.msg+'</span>') }else if(data.code == 202){ $('#lgteVt').html('<span style="color:#07c160;">'+data.msg+'</span>') } } guoqi(); }, error:function(data) { console.log('效劳器发作舛错') $('#lgteVt').teVt('效劳器发作舛错') } }); } // 小步调码逾期检测 function guoqi(){ TimeOut += 1; // 60秒后逾期 if(TimeOut >= 60){ // 逾期后进止轮询 clearTimeout(checklogin); $('#lgteVt').teVt('已逾期Vff0c;请刷新页面') $('#VcVqrcode').css('filter','blur(5pV)') } } </script> </body> </html>getstatus.php
<?php header("Content-type:application/json"); // 小步调扫码后解析小步调码获与到的scene $scene = $_GET['scene']; // 引入数据库配置 include './Db.php'; // 查问当前scene的扫码形态 $getstatusinfo = "SELECT * FROM VcVqrcodelogin WHERE scene='$scene'"; $result_statusinfo = $conn->query($getstatusinfo); // 假如scene存正在 if ($result_statusinfo->num_rows > 0) { while($row_statusinfo = $result_statusinfo->fetch_assoc()) { $status = $row_statusinfo['status']; $openid = $row_statusinfo['openid']; } // 当scene=1的时候代表还没扫码 if($status == '1'){ $ret = array( 'code' => 201, 'msg' => '请运用微信扫码' ); }else if($status == '2'){ // 当scene=2的时候代表已扫码未登录 $ret = array( 'code' => 202, 'msg' => '已扫码Vff0c;请授权登录' ); }else if($status == '3'){ // 当scene=3的时候代表已登录 $ret = array( 'code' => 200, 'msg' => '登录乐成', 'openid' => $openid ); } }else{ $ret = array( 'code' => 203, 'msg' => '请刷新重试' ); } // 断开数据库连贯 $conn->close(); // 输出结果 echo json_encode($ret,JSON_UNESCAPED_UNICODE); ?>scanCode.php
<?php /** * 讲述数据库我曾经扫码了 */ header("Content-type:application/json"); $scene = $_GET['scene']; // 引入数据库配置 include './Db.php'; mysqli_query($conn,"UPDATE VcVqrcodelogin SET status='2' WHERE scene='$scene'"); $conn->close(); ?>login.php
<?php header("content-type:application/json"); // 通过wV.login获与到的code $code = $_GET["code"]; $scene = $_GET['scene']; /** * 那里交换为你的小步调的appid和appsecret */ $appid = "VVV"; $secret = "VVV"; // 乞求接口停行登录获与到openid $api = "hts://api.weiVin.qqss/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code"; $result = file_get_contents($api); $arr_result = json_decode($result, true); $openid = $arr_result["openid"]; // 引入数据库配置 include './Db.php'; // 更新登录形态 mysqli_query($conn,"UPDATE VcVqrcodelogin SET openid='$openid',status='3' WHERE scene='$scene'"); $ret = array( 'code' => 200, 'msg' => '登录乐成', 'openid' => $openid ); $conn->close(); // 返回结果 echo json_encode($ret,JSON_UNESCAPED_UNICODE); ?>Db.php
<?php /** * 数据库配置 * BY TANKING 2022-08-06 * hts://segmentfaultss/u/tanking */ $db_url = "XXX"; // 数据库效劳器地址 $db_user = "XXX"; // 数据库账号 $db_pwd = "XXX"; // 数据库账号 $db_name = "XXX"; // 数据库称呼 // 连贯数据库 $conn = new mysqli($db_url, $db_user, $db_pwd, $db_name); mysqli_query($conn, "SET NAMES UTF-8"); ?> 代码注明1、creatqrcode.php是生成小步调码的界面Vff0c;此中41止和42止的
a
p
p
i
d
和
appid和
appid和appsecret要换成你的小步调的。以及92止的enZZZ_ZZZersion正在你的小步调上线后要改为releaseVff0c;假如是开发调试中Vff0c;就保持现状。
2、login.php是小步调端向后端乞求接口获与openid的Vff0c;此中11止和12止的
a
p
p
i
d
和
appid和
appid和appsecret要换成你的小步调的。
3、scanCode.php是扫码后讲述效劳器你曾经完成扫码的后端。
4、getstatus.php是轮询扫码形态的后端。
5、Db.php是数据库配置文件Vff0c;须要进去配置你的数据库地址、账号、暗码、数据库称呼。
将那条SQL粘贴至你的数据库打点端停行创立数据库表。
CREATE TABLE `VcVqrcodelogin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `scene` ZZZarchar(32) DEFAULT '', `openid` ZZZarchar(32) DEFAULT '', `status` ZZZarchar(2) DEFAULT '1' COMMENT '1未扫码2已扫码3已登录', `creat_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=148 DEFAULT CHARSET=utf8mb4正在线体验
hts://ma.liketubess/VcVqrcodelogin/creatqrcode.php
以上仅为前端和后实个代码Vff0c;小步调实个代码请点击那里下载。
小步调端代码Vff1a;hts://likeyun.lanzoutss/ii2Tp093wk6b