php+mysql实现微信小程序首次访问自动静默注册
作者:xlnxin发布时间:2026-10-23分类:编程知识浏览:18
导读:需求:在微信小程序中实现首次访问自动记录访问用户信息openid信息。数据库表CREATE TABLE IF NOT EXISTS ...
需求:在微信小程序中实现首次访问自动记录访问用户信息openid信息。
数据库表
CREATE TABLE IF NOT EXISTS `user` ( `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `openid` VARCHAR(64) NOT NULL UNIQUE, `name` VARCHAR(128) DEFAULT '', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
PHP服务端代码api/login.php
<?php
header('Content-Type: application/json; charset=utf-8');
$appid = '你的小程序AppID';
$secret = '你的小程序AppSecret';
$code = isset($_POST['code']) ? trim($_POST['code']) : '';
$name = isset($_POST['name']) ? trim($_POST['name']) : '';
if ($code === '') {
echo json_encode(['code' => 400, 'msg' => '缺少 code']);
exit;
}
// 用 code 换取 openid
$url = 'https://api.weixin.qq.com/sns/jscode2session'
. '?appid=' . urlencode($appid)
. '&secret=' . urlencode($secret)
. '&js_code=' . urlencode($code)
. '&grant_type=authorization_code';
$response = file_get_contents($url);
$data = json_decode($response, true);
if (!$data || !isset($data['openid'])) {
echo json_encode(['code' => 500, 'msg' => '获取 openid 失败']);
exit;
}
$openid = $data['openid'];
// 连接 MySQL
$host = '127.0.0.1';
$db = 'your_database';
$user = 'root';
$pass = '';
$conn = new mysqli($host, $user, $pass, $db);
$conn->set_charset('utf8mb4');
if ($conn->connect_error) {
echo json_encode(['code' => 500, 'msg' => '数据库连接失败']);
exit;
}
// 查询用户是否存在
$stmt = $conn->prepare('SELECT id, openid, name FROM user WHERE openid = ? LIMIT 1');
$stmt->bind_param('s', $openid);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$stmt->close();
if ($row) {
// 已存在,直接返回
echo json_encode([
'code' => 0,
'msg' => '登录成功',
'data' => [
'id' => (int)$row['id'],
'openid' => $row['openid'],
'name' => $row['name'],
'isNew' => false
]
]);
} else {
// 首次访问,自动注册
$stmt = $conn->prepare('INSERT INTO user (openid, name) VALUES (?, ?)');
$stmt->bind_param('ss', $openid, $name);
$stmt->execute();
$newId = $stmt->insert_id;
$stmt->close();
echo json_encode([
'code' => 0,
'msg' => '注册成功',
'data' => [
'id' => (int)$newId,
'openid' => $openid,
'name' => $name,
'isNew' => true
]
]);
}
$conn->close();微信小程序端app.js
App({
globalData: {
baseUrl: 'https://your-domain.com' // 替换成你的后端域名
},
onLaunch() {
this.autoLogin();
},
autoLogin() {
const that = this;
wx.login({
success(res) {
if (!res.code) {
console.error('wx.login 失败', res.errMsg);
return;
}
wx.request({
url: that.globalData.baseUrl + '/api/login.php',
method: 'POST',
data: {
code: res.code,
name: '' // 首次注册时 name 可以为空
},
success(resp) {
if (resp.data && resp.data.code === 0) {
wx.setStorageSync('openid', resp.data.data.openid);
wx.setStorageSync('userId', resp.data.data.id);
wx.setStorageSync('userName', resp.data.data.name);
console.log('自动登录/注册成功', resp.data.data);
} else {
console.error('登录失败', resp.data);
}
},
fail(err) {
console.error('请求失败', err);
}
});
}
});
}
});
- 上一篇:mysql 命令复制表结构,手动设置自增建设置失败解决方法
- 下一篇:已经是最后一篇了
- 编程知识排行
- 最近发表
