背景介绍
在传统网站登录系统中,用户注册、密码管理、短信验证码等环节都存在诸多痛点。今天我要分享的是一套无需微信认证的公众号登录方案,即使是个人订阅号也能轻松实现网站微信登录功能。
系统架构设计
核心原理
用户访问网站后,关注公众号并发送"登录"指令,公众号生成6位验证码,用户在网站输入验证码即可完成登录。
技术流程
- 用户访问网站登录页面
- 扫码关注微信公众号
- 向公众号发送"登录"指令
- 公众号返回6位验证码
- 在网站输入验证码完成登录
核心代码实现
微信公众号消息处理
// 微信公众号消息处理核心代码
$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)
);系统特色与优势
核心优势
零认证成本
- 无需微信认证(节省300元/年)
- 个人订阅号即可使用
- 免去复杂的审核流程
极致用户体验
- 无需注册账号
- 无需设置密码
- 5秒完成登录
高安全性
- 验证码单次有效
- 5分钟自动过期
- 防暴力破解机制
低成本部署
- 无需短信服务商
- 服务器要求低
- 维护简单
部署指南
环境要求
- PHP 7.0+
- MySQL 5.6+
- 支持XML处理的Web服务器
- 微信公众号(订阅号即可)
配置步骤
公众号配置
- 进入开发者中心
- 配置服务器URL
- 设置Token(与代码中一致)
数据库配置
- 创建验证码表
- 配置数据库连接
代码部署
- 上传微信回调文件
- 配置相关参数
- 测试登录流程