php微信公众号开发之扫码关注并登陆的实现方法
需求
使用微信扫码并且关注公众号后实现网站登录。
思路分析
1.使用公众号接口生成二维码。
2.系统接收微信推送过来的事件(关注/扫码)。
3.前端轮询二维码扫码状况
4.用户点击关注或者扫码二维码后台都会接收到推送通知,然后根据通知实现自己的业务就可以了。
准备工作
微信公众号一枚(服务号)必须是服务号,订阅号没有这个权限。
需要的接口
生成带参数的二维码
代码:
function build_param_qrcode(){
// 请求api地址
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$access_token}";
// 生成位于的uuid
$uuid = uniqid('WXQRCODE', false);
// post请求
$res = $this->http_post_json($url, json_encode([
'expire_seconds' => 60 * 5, // 二维码过期时间
'action_name' => 'QR_STR_SCENE', // 二维码类型
'action_info' => [ // 二维码详细信息
'scene' => [
'scene_str' => $uuid //将生成的uuid放在二维码中,用户扫码后会收到该uuid
]
],
]));
$res['uuid'] = $uuid;
// 创建一个本地缓存,可以是保存到数据库中或者文件缓存
cache($uuid, false, 5 * 60);
return $res;
}
公众号后台配置服务器
具体教程请看文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
接受事件处理程序
wxEvent.php
/**
* 接受公众号事件
**/
$token = 'token'; //对应公众号后台token
//如果是get请求说明是公众号验证
if($_SERVER['REQUEST_METHOD'] == 'GET'){
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$echostr = $_GET["echostr"];
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
echo $echostr;
} else {
echo '';
}
exit;
}
// 否则就是消息到来了 (post请求)
$xmlStr = file_get_contents('php://input'); // 这里只能用这种方式拿数据 post拿不到
if (empty($xmlStr)) {
return '';
}
// 解析xml
$postObj = simplexml_load_string($xmlStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$openid = (string) $postObj->FromUserName;
$touser = (string) $postObj->ToUserName;
$type = (string) $postObj->MsgType;
$event = (string) $postObj->Event;
// 如果事件类型是扫码或者关注
if ($type == 'event' && ($event == 'SCAN' || $event == 'subscribe')) {
// 替换多余字符qrscene_ 这里的key就是上面二维码生成的uuid
$key = str_replace('qrscene_', '', (string) $postObj->EventKey);
// 操作缓存 -- 没有缓存不管
if (!cache('?' . $key)) return '';
// 写入openid
cache($key, $openid);
}
// 并返回登录成功的消息 这里不要做格式化!!!
echo "<xml>
<ToUserName><![CDATA[{$openid}]]></ToUserName>
<FromUserName><![CDATA[{$touser}]]></FromUserName>
<CreateTime>".time()."</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[登陆成功,欢迎回家!比心♥]]></Content>
</xml>";
前端轮询查询缓存
前端轮询查询cache缓存是否写入了openid的值,如果有的话就通过openid对用户登录。
总结
实现原理其实还是比较简单,前提是你得有一个已经认证过的服务号。
希望可以帮助到你哦~