用php代码和数据库实现微信小程序注册于登录功能的具体代码包括微信小程序中的代码
时间: 2024-03-29 17:39:37 浏览: 204
首先是微信小程序端的代码,在 `app.js` 中定义了一个全局变量 `sessionKey`,用于存储用户的 session key:
```javascript
App({
globalData: {
sessionKey: ''
},
onLaunch: function () {
// ...
}
})
```
在登录页面 `login.js` 中,使用 `wx.login` 获取用户的 code,并将 code 发送到服务器端:
```javascript
// 点击登录按钮时触发
onLogin: function () {
var that = this;
wx.login({
success: function (res) {
if (res.code) {
wx.request({
url: 'https://example.com/login.php',
method: 'POST',
data: {
code: res.code
},
success: function (res) {
if (res.data.code == 0) {
// 登录成功,保存 session key
getApp().globalData.sessionKey = res.data.sessionKey;
wx.showToast({
title: '登录成功'
})
} else {
// 登录失败
wx.showModal({
title: '登录失败',
content: res.data.msg
})
}
}
})
} else {
wx.showModal({
title: '登录失败',
content: '获取用户登录状态失败:' + res.errMsg
})
}
}
})
}
```
在注册页面 `register.js` 中,将用户输入的用户名和密码发送到服务器端进行注册:
```javascript
// 点击注册按钮时触发
onRegister: function () {
var that = this;
wx.request({
url: 'https://example.com/register.php',
method: 'POST',
data: {
username: that.data.username,
password: that.data.password
},
success: function (res) {
if (res.data.code == 0) {
wx.showToast({
title: '注册成功'
})
} else {
wx.showModal({
title: '注册失败',
content: res.data.msg
})
}
}
})
}
```
接下来是服务器端的 PHP 代码。首先,在 `login.php` 中,通过 `wx.login` 接口向微信服务器发送请求,获取到 session key 和 openid,并将 session key 存储到数据库中:
```php
<?php
// 连接数据库
$host = "localhost";
$username = "root";
$password = "123456";
$dbname = "test";
$conn = mysqli_connect($host, $username, $password, $dbname);
// 获取 POST 数据
$code = $_POST["code"];
// 向微信服务器发送请求,获取 session key 和 openid
$appid = "wx123456";
$secret = "abcdefg";
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";
$result = file_get_contents($url);
$json = json_decode($result);
if (!isset($json->session_key)) {
echo json_encode(array("code" => 1, "msg" => "Failed to get session key"));
exit;
}
$session_key = $json->session_key;
$openid = $json->openid;
// 判断用户是否已注册
$sql = "SELECT * FROM users WHERE openid = '$openid'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) == 0) {
// 用户未注册,插入新用户
$sql = "INSERT INTO users (openid) VALUES ('$openid')";
mysqli_query($conn, $sql);
}
// 插入或更新 session
$user_id = mysqli_insert_id($conn) ?: mysqli_fetch_assoc($result)["id"];
$expire_time = time() + 86400; // 过期时间为一天后
$sql = "INSERT INTO sessions (user_id, session_key, expire_time) VALUES ($user_id, '$session_key', $expire_time) ON DUPLICATE KEY UPDATE session_key = '$session_key', expire_time = $expire_time";
mysqli_query($conn, $sql);
// 返回 session key
echo json_encode(array("code" => 0, "sessionKey" => $session_key));
?>
```
在 `register.php` 中,将用户输入的用户名和密码插入到数据库中:
```php
<?php
// 连接数据库
$host = "localhost";
$username = "root";
$password = "123456";
$dbname = "test";
$conn = mysqli_connect($host, $username, $password, $dbname);
// 获取 POST 数据
$username = $_POST["username"];
$password = $_POST["password"];
// 判断用户名是否已存在
$sql = "SELECT * FROM users WHERE username = '$username'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
echo json_encode(array("code" => 1, "msg" => "Username already exists"));
exit;
}
// 插入新用户
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$sql = "INSERT INTO users (username, password) VALUES ('$username', '$hashed_password')";
mysqli_query($conn, $sql);
echo json_encode(array("code" => 0));
?>
```
需要注意的是,由于小程序端无法直接访问该 PHP 文件,因此需要在服务器端配置 SSL 证书,并将域名绑定到该 SSL 证书上。然后,在小程序端使用 HTTPS 协议访问该域名即可。如果没有 SSL 证书,可以使用第三方服务商提供的免费 SSL 证书。
阅读全文