...
PHP 微信公众号开发

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对用户登录。

总结

实现原理其实还是比较简单,前提是你得有一个已经认证过的服务号。
希望可以帮助到你哦~

electron-builder 在打包时编译sqlite3下载nsis winCodeSign超时问题 把废旧的电视机顶盒华为悦盒ec6108v9刷成Ubuntu系统做家用NAS
biu biu biu
一款好用的VPIV Linux添加用户及用户权限管理 常用sql server sql语句 常用正则表达式语句 ASCII码对照表