pc端微信扫码登录
1.先去微信开发平台注册
然后开通网站应用
成功后是这样的
注意这里写的是顶级域名,其他的不行
现在去写前端 前端写个js就可以请求微信了
// 微信授权登录
$('.login-tip-btn').click(function(){
var obj = new WxLogin({
self_redirect: false,
id: "login_container",
appid: "wxda88e44dfcab312d",
scope: "snsapi_login",
//redirect_uri 这里可以写回调到哪个页面的地址。 但是在配置页面必须写顶级域名地址
redirect_uri: encodeURIComponent("https://www.yun-live.com/chat_callback"),
// redirect_uri: encodeURIComponent("http://" + window.location.host + "/login.php"),
state: Math.ceil(Math.random() * 1000),
style: "black",
href: "https://www.yun-live.com/web_pc/css/code_img.css?v=4" //根据自己的css修改二维码样式
});
$('.kkcolos_a').show();
$('.code_img_a').show();
})
//关闭微信授权登录
$('.kkcolos_a').click(function(){
$('.kkcolos_a').hide();
$('.code_img_a').hide();
})
在写给按钮去促发这个js方式请求
这个的login_container是div的di名称
<!-- 放置二维码的div -->
<div class="kkcolos_a" style="display: none;"><i class="iconfont colos_a"></i></div>
<div class="code_img_a" style="display: none;" id="login_container"></div>
前端基本这样就可以方式请求了
现在开始写后端的处理
https://www.yun-live.com/chat_callback这是我发送的地址
<?php
namespace App\Http\Controllers\WebNew;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class Pcwechat extends Controller
{
public function chat_callback()
{
session_start();
$code=Request()->get('code'); //文章ID
$state=Request()->get('state'); //
if(empty($code)){
return ['code'=>'-100','msg'=>'用户拒绝登录,请重新登录!'];
}
$AppID = 'wxda88e44dfcab3123213d';
$AppSecret = '827a02300982c37f54edab97752173b22323';
$url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$AppID.'&secret='.$AppSecret.'&code='.$_GET['code'].'&grant_type=authorization_code';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$json = curl_exec($ch);
curl_close($ch);
$arr=json_decode($json,1);
//得到 access_token 与 openid
// print_r($arr);
$url='https://api.weixin.qq.com/sns/userinfo?access_token='.$arr['access_token'].'&openid='.$arr['openid'].'&lang=zh_CN';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$json = curl_exec($ch);
curl_close($ch);
$arr=json_decode($json,1);
// 得到 用户资料
if(empty($arr['unionid'])){
return '没有获取到unionid';
}
self::redirect_uri($arr);
}
// 验证保存和添加
public function redirect_uri($arr)
{
session_start();
// 判断链接ID是否存在 扫码后登录成功就直接回到原来的位置了
if (empty($_SESSION["pc_link_id"])) {
$url='https://www.yun-live.com';
}else{
$url='https://www.yun-live.com/meeting_pc/'.$_SESSION["pc_link_id"];
}
// 加入缓存
$ip = request()->ip();
$time = self::getMsecTime(); //s时间戳转换显示几分钟, //添加时间
$date = date('Y-m-d H:i:s');
if(!empty($arr['unionid'])){
// die(json_encode(array('code'=>'200','msg'=>'获取unionid成功','data'=>$arr['unionid'])));
// 判断授权表有没有unionId数据。没有是属于新用户,进行添加 平台类型
$arrayName = array('unionId' =>$arr['unionid']);
$user =DB::table("users")->where($arrayName)->first(); // 判断授权表有没有unionId数据。没有是属于新用户,进行添加
$a=json_encode($user);
$user = json_decode($a, true);
if(empty($user)){
$params =array(
'unionId' => $arr['unionid'], //主要id
'nickname' => $arr['nickname'], //用户昵称
'alias' => $arr['nickname'], //用户别名
'openid' => $arr['openid'], //用户openId
'category' =>'pc', //平台类型
'password' => "123456", //用户默认密码
'email' => "", //用户默认邮箱
'mobile' =>'',//手机号
'avatar' => $arr['headimgurl'],//头像
'gender'=>$arr['sex'], //性别 1男 2女
'created_at' => $time,//加入时间
'updated_at' => $time, //登录时间
'created_at_ymd' => $date,//加入时间
'updated_at_ymd' => $date, //登录时间
'loginip' => $ip, //登录IP
'status' => 1 //状态 1正常的 2冻结
);
$GetId=DB::table("users")->insertGetId($params); //添加
// 加入缓存
session([
'uid' =>$GetId,
'nickname'=>$arr['nickname'],
'alias'=>$arr['nickname'],
'avatarUrl'=>$arr['headimgurl']
]);
return header('Location:'.$url);
}else{
if ($user['status']==2) //账号冻结
{
die(json_encode(array('code'=>'dj','msg'=>'账号冻结')));
}
$update = array(
'nickname' => $arr['nickname'], //用户名 作为真实姓名
'avatar' => $arr['headimgurl'],//头像
'updated_at' => $time, //登录时间
'updated_at_ymd' => $date, //登录时间
'loginip' => $ip, //登录IP
);
Db::table('users')->where('id',$user['id'])->update($update);
// 加入缓存
session([
'uid' =>$user['id'],
'nickname'=>$arr['nickname'],
'alias'=>$arr['alias'],
'avatarUrl'=>$arr['headimgurl'],
'mobile' => $user['mobile'], //手机号
]);
return header('Location:'.$url);
}
}else{
die(json_encode(array('code'=>'-200','msg'=>'获取unionid失败','data'=>$arr)));
}
return header('Location:'.$url);
}
/**
* 获取毫秒级别的时间戳
*/
public function getMsecTime()
{
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
return $msectime;
}
}
这个后端的处理,
大概思路是请求页面的时候判断用户有没有登录,判断就通过这个session的uid存不存在来订,不存在让用户登录,进行扫描,登录成功后存入数据库,在把这个页面刷新,带上uid进可以了