背景介绍

在传统网站登录系统中,用户注册、密码管理、短信验证码等环节都存在诸多痛点。今天我要分享的是一套无需微信认证的公众号登录方案,即使是个人订阅号也能轻松实现网站微信登录功能。

系统架构设计

核心原理

用户访问网站后,关注公众号并发送"登录"指令,公众号生成6位验证码,用户在网站输入验证码即可完成登录。

技术流程

  1. 用户访问网站登录页面
  2. 扫码关注微信公众号
  3. 向公众号发送"登录"指令
  4. 公众号返回6位验证码
  5. 在网站输入验证码完成登录

核心代码实现

微信公众号消息处理

// 微信公众号消息处理核心代码
$token = 'your_wechat_token';

// 服务器验证
if (isset($_GET['echostr'])) {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    $echostr = $_GET["echostr"];
    
    $array = array($token, $timestamp, $nonce);
    sort($array);
    $str = sha1(implode($array));
    
    if ($str == $signature) {
        echo $echostr;
    }
    exit;
}

// 处理用户消息
$postStr = file_get_contents("php://input");
if ($postStr) {
    $postObj = simplexml_load_string($postStr);
    
    $msgType = $postObj->MsgType;
    $fromUser = $postObj->FromUserName;
    $content = trim($postObj->Content);
    
    // 处理"登录"指令
    if ($msgType == 'text' && $content == '登录') {
        // 生成6位随机验证码
        $code = sprintf("%06d", mt_rand(1, 999999));
        
        // 保存到数据库
        $log_data = [
            'openid' => $fromUser,
            'login_code' => $code,
            'created_time' => time(),
            'status' => 0
        ];
        $DB->insert('wechat_login', $log_data);
        
        // 返回验证码给用户
        $reply_content = "您的网站登录验证码:{$code},有效期5分钟";
        
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        
        echo sprintf($textTpl, $fromUser, $toUser, time(), $reply_content);
    }
}

网站登录验证

// 网站登录验证接口
$login_code = trim($_POST['login_code']);

// 验证码格式检查
if(empty($login_code) || strlen($login_code) != 6){
    echo json_encode(['code' => 1, 'msg' => '请输入6位数字验证码']);
    exit;
}

// 查找验证码记录
$code_info = $DB->find('wechat_login', '*', [
    'login_code' => $login_code,
    'status' => 0
]);

if(!$code_info){
    echo json_encode(['code' => 1, 'msg' => '验证码不存在或已被使用']);
    exit;
}

// 检查验证码有效期(5分钟)
if(time() - $code_info['created_time'] > 300){
    echo json_encode(['code' => 1, 'msg' => '验证码已过期']);
    exit;
}

// 标记验证码为已使用
$DB->update('wechat_login', [
    'status' => 1,
    'used_time' => time()
], ['id' => $code_info['id']]);

// 生成用户登录凭证
$session = md5($code_info['openid'] . 'fixed_password');
$expiretime = time() + 604800;

// 设置登录Cookie
setcookie("user_token", $token, $expiretime, '/', '', false, true);

echo json_encode(['code' => 0, 'msg' => '登录成功']);

数据库设计

-- 验证码存储表结构
CREATE TABLE wechat_login (
    id int(11) NOT NULL AUTO_INCREMENT,
    openid varchar(100) NOT NULL,
    login_code char(6) NOT NULL,
    created_time int(11) NOT NULL,
    used_time int(11) DEFAULT NULL,
    status tinyint(1) DEFAULT 0,
    ip_address varchar(45) DEFAULT '',
    PRIMARY KEY (id),
    KEY idx_login_code (login_code),
    KEY idx_created_time (created_time)
);

系统特色与优势

核心优势

  1. 零认证成本

    • 无需微信认证(节省300元/年)
    • 个人订阅号即可使用
    • 免去复杂的审核流程
  2. 极致用户体验

    • 无需注册账号
    • 无需设置密码
    • 5秒完成登录
  3. 高安全性

    • 验证码单次有效
    • 5分钟自动过期
    • 防暴力破解机制
  4. 低成本部署

    • 无需短信服务商
    • 服务器要求低
    • 维护简单

部署指南

环境要求

  • PHP 7.0+
  • MySQL 5.6+
  • 支持XML处理的Web服务器
  • 微信公众号(订阅号即可)

配置步骤

  1. 公众号配置

    • 进入开发者中心
    • 配置服务器URL
    • 设置Token(与代码中一致)
  2. 数据库配置

    • 创建验证码表
    • 配置数据库连接
  3. 代码部署

    • 上传微信回调文件
    • 配置相关参数
    • 测试登录流程
Last modification:November 22, 2025
If you think my article is useful to you, please feel free to appreciate