之前微信登录的需求,通常都是在微信开放平台(open.weixin.qq.com)申请网站应用后实现获取用户OpenId和UnionId,之前登录WPS看到另一种方案,扫码会提示关注公众号,关注后(或已经关注直接进入聊天窗口),会直接登录成功,在实现微信登录的同时也相当于增加一个粉丝。
最近的工作上,刚好也遇到相同的需求,简单记录一下代码,基本思路就是微信的:生成带参数二维码功能。
首先 微信后台设置开发者基本配置,此处不多讲了,基本操作,如果搞不定也没有看下去的必要了。
1 获取Token
access_token
有效期7200秒,需要自行添加缓存,保存token,超出有效期需要重新获取
private function getToken(){
$url = 'https://api.weixin.qq.com/cgi-bin/token';
$data = [
'grant_type' => 'client_credential',
'appid' => '1111',
'secret' => '2222'
];
$param = array();
foreach ($data as $k=>$v){
$param[] = $k.'='.$v;
}
$param = implode('&',$data);
$url = $url.'?'.$param;
$res = file_get_contents($url);
$res = json_decode($res,true);
if($res['access_token'] && $res['expires_in']){
return $res['access_token'];
}else{
return false;
}
}
2 申请二维码
public function getQr($token){
$url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$token;
$param = array(
'expire_seconds' => 86400,
'action_name' => 'QR_SCENE',
'action_info' => array(
'scene' => array(
'scene_str' => 'login_'.time().'_'.rand(100,999)
)
)
);
$param = json_encode($param);
$res = $this->request_by_curl($url,$param,'post');
$res = json_decode($res['content'],true);
return $res['ticket'];
}
申请好的ticket
是二维码凭据,凭借ticket去直接换取二维码,用户扫码后微信也会把ticket返回给开发者。
3 生成二维码
生成二维码是最简单的,微信提供了一个不限制调用次数的接口,直接返回图片数据流,也就是该链接就是一个图片:
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.$ticket
4 获取通知
用户扫码后,微信会将扫码事件推送给后台配置的通知地址,其中$res['FromUserName']就是用户OpenId:
public function callback(){
$res = file_get_contents("php://input");
$res = $this->xml2array($res);
if(
$res['MsgType'] == 'event'
|| $res['Event'] == 'SCAN'
|| $res['Ticket']
){
//处理你的用户绑定事件
}
}
5 前台检测用户是否绑定成功
后端:
public function check(){
$ticket = $_GET['ticket']
//检测是否扫码 并返回用户信息
//$res = db()->where()->find();
return json($res);
}
前端:
window.setInterval(getState,1500);
function getState(){
$.get("http://xxx.com/api?ticket="+ticket,function(data){
data = JSON.parse(data);
if(data.open_id.length > 0 ){
//处理你的登录事件
}
});
}