本文仅针对**正版授权**的GOM引擎提供微信验证接入的技术方案,任何未经许可的验证绕过均涉嫌违法。请确保已获得引擎官方授权,并遵守《网络安全法》及《计算机软件保护条例》。
---
### 一、前置条件与合法准备
#### 1. 基础授权要求
- **正版GOM引擎授权书**(含商业授权编号)
- **企业资质**:营业执照、ICP备案
- **微信开放平台认证**:需企业认证(300元/年)
#### 2. 微信接口申请流程
1. 登录[微信开放平台](https://open.weixin.qq.com)
2. 创建网站应用 → 填写`网站域名/IP`(需与传奇登录器域名一致)
3. 获取`AppID`与`AppSecret`
---
### 二、服务端配置流程
#### 1. 接口文件修改
**文件路径**:
```
MirServer\LoginGate\WXConfig.ini
```
**配置参数**:
```ini
[WeChat]
AppID=wx1234567890abcdef
AppSecret=abcdef1234567890xyz
RedirectURI=http://yourdomain.com/wxcallback
Scope=snsapi_userinfo
```
#### 2. 登录脚本改造(QManage.txt)
```lua
[@Login]
#IF
CheckWeChatBind <$USERNAME> = 0
#ACT
OpenWeChatAuthWindow
#SAY
请扫码绑定微信账号!
[@WXAuthSuccess]
#ACT
BindWeChat <$USERNAME> <$WXOPENID>
SendMsg 6 微信绑定成功!
```
---
### 三、客户端适配方案
#### 1. 登录器配置
1. 在**登录器配置器**中勾选`启用微信登录`
2. 导入微信SDK文件(`wxauth.dll` + `wxqr.png`)
3. 配置回调事件处理:
```lua
function OnWxAuthSuccess(openid)
SendToServer("WXAuthSuccess "..openid)
end
```
#### 2. 资源文件规范
- 微信二维码尺寸:280×280像素(存放于`Resources\UI\wxqr.png`)
- 按钮坐标:通过UI编辑器调整至合适位置
---
### 四、接口调试与排错
#### 1. 常见错误代码
| 错误码 | 含义 | 解决方案 |
|-------|---------------------|----------------------------|
| 40001 | AppID无效 | 检查微信开放平台配置 |
| 41002 | 回调地址未授权 | 在微信后台添加域名/IP白名单 |
| 43002 | 用户拒绝授权 | 优化授权提示文案 |
#### 2. 网络抓包验证
使用**Fiddler**监控请求流程:
1. 启动登录器 → 触发微信登录
2. 验证是否生成正确授权链接:
```
https://open.weixin.qq.com/connect/qrconnect?appid=xxx&redirect_uri=xxx
```
3. 检查回调数据是否包含`code`参数
---
### 五、安全防护建议
#### 1. 防劫持措施
- 启用HTTPS协议(SSL证书)
- 在`LoginGate.exe`中配置IP访问限制
#### 2. 会话验证机制
```lua
; 每次登录生成随机Token
GenerateToken <$USERNAME>
SendToClient WXToken <$TOKEN>
; 服务端验证
[@WXAuthCallback]
#IF
CheckToken <$TOKEN> = 0
#ACT
KickPlayer
```
---
### 六、合规运营提醒
#### 1. 用户隐私保护
- 在登录页面公示《隐私政策》
- 不得存储用户微信好友关系等敏感数据
#### 2. 数据安全审计
- 每季度进行安全渗透测试
- 保留操作日志不少于6个月
---
#### 结语
GOM引擎的微信验证系统需严格遵循合法接入流程。重点在于微信接口的规范配置与用户隐私保护,开发者应定期审查接口安全性。对于高并发商业服,建议使用**Redis缓存**管理会话状态以提升性能。任何技术方案均需以合法授权为前提!
#### 1. 功能概述
##### 微信验证
微信验证是一种身份验证机制,允许玩家通过扫描二维码或输入验证码的方式绑定自己的微信账号。这样,在登录游戏时,玩家需要先通过微信验证才能进入游戏。
#### 2. GOM引擎简介
##### GOM引擎特点
- **高效稳定**:GOM引擎以其高效的处理能力和稳定的运行表现著称。
- **易用性强**:GOM引擎提供了简洁明了的API接口,方便开发者进行二次开发。
- **功能全面**:支持多种游戏元素的添加,包括但不限于技能、怪物、地图等。
##### 支持自定义功能
GOM引擎允许开发者通过修改代码和配置文件来实现各种自定义功能,包括集成第三方服务如微信验证。
#### 3. 实现微信验证步骤
##### 步骤一:准备工作
确保你已经安装了GOM引擎,并且有一个基本的游戏框架搭建完成。此外,还需要准备好所有必要的客户端和服务器端文件。
##### 步骤二:注册微信开放平台账号
首先,你需要在[微信公众平台](https://open.weixin.qq.com/)注册一个账号,并创建一个移动应用以获取AppID和AppSecret。
##### 步骤三:配置微信验证参数
###### 修改`config.ini`
在`config\config.ini`文件中添加微信验证的相关配置信息。
**config.ini**
```ini
[WeChat]
AppId=your_wechat_appid
AppSecret=your_wechat_appsecret
RedirectUri=http://yourdomain.com/wechat/callback
Token=your_token
EncodingAESKey=your_encodingaeskey
```
##### 步骤四:编写后端逻辑
###### 创建微信回调处理脚本
创建一个PHP脚本来处理微信回调请求,用于生成二维码并验证用户身份。
**wechat_callback.php**
```php
<?php
require_once 'vendor/autoload.php'; // 引入微信SDK
use EasyWeChat\Factory;
$options = [
'app_id' => 'your_wechat_appid',
'secret' => 'your_wechat_appsecret',
'token' => 'your_token',
'aes_key' => 'your_encodingaeskey', // 可选
];
$app = Factory::officialAccount($options);
$oauth = $app->oauth;
if (!session_id()) {
session_start();
}
// 获取OAuth授权结果
$user = $oauth->user();
// 将用户信息保存到数据库
$dbHost = 'localhost';
$dbUser = 'your_db_user';
$dbPass = 'your_db_password';
$dbName = 'your_db_name';
$conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$userId = $_SESSION['user_id'];
$openid = $user->getId();
$username = $user->getOriginal()['nickname'];
$sql = "UPDATE account_table SET openid='$openid', username='$username' WHERE id=$userId";
if ($conn->query($sql) === TRUE) {
echo "Record updated successfully";
} else {
echo "Error updating record: " . $conn->error;
}
$conn->close();
header('Location: http://yourdomain.com/login');
exit;
?>
```
###### 创建二维码生成接口
创建一个PHP脚本来生成微信登录二维码。
**generate_qr_code.php**
```php
<?php
require_once 'vendor/autoload.php'; // 引入微信SDK
use EasyWeChat\Factory;
$options = [
'app_id' => 'your_wechat_appid',
'secret' => 'your_wechat_appsecret',
'token' => 'your_token',
'aes_key' => 'your_encodingaeskey', // 可选
];
$app = Factory::officialAccount($options);
$oauth = $app->oauth;
$state = md5(uniqid(rand(), true)); // 随机字符串
$_SESSION['wechat_state'] = $state;
$redirectUrl = $oauth->scopes(['snsapi_userinfo'])
->redirect('http://yourdomain.com/wechat/callback', $state)
->url;
echo json_encode(['qr_url' => $redirectUrl]);
?>
```
##### 步骤五:修改前端逻辑
###### 修改`login.html`
在登录页面中添加微信登录按钮,并使用JavaScript调用微信二维码生成接口。
**login.html**
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>Login</h1>
<button id="wechat-login">Login with WeChat</button>
<div id="qrcode" style="display:none;"></div>
<script>
$(document).ready(function() {
$('#wechat-login').click(function() {
$.ajax({
url: 'generate_qr_code.php',
method: 'GET',
success: function(response) {
var data = JSON.parse(response);
var qrUrl = data.qr_url;
$('#qrcode').empty();
$('#qrcode').append('<img src="' + qrUrl + '" alt="QR Code"/>');
$('#qrcode').show();
},
error: function(xhr, status, error) {
console.error(error);
}
});
});
});
</script>
</body>
</html>
```
##### 步骤六:修改服务器端逻辑
###### 修改`auth_handler.cpp`
在`src\auth_handler.cpp`文件中添加微信验证逻辑,检查玩家是否已经绑定了微信账号。
**auth_handler.cpp**
```cpp
#include "auth_handler.h"
#include "database_manager.h"
#include "packet_builder.h"
AuthHandler* AuthHandler::GetInstance()
{
static AuthHandler instance;
return &instance;
}
bool AuthHandler::Authenticate(const std::string& username, const std::string& password)
{
DatabaseManager* dbManager = DatabaseManager::GetInstance();
std::string query = "SELECT id, password, openid FROM account_table WHERE username = '" + username + "'";
MYSQL_RES* result = dbManager->Query(query.c_str());
if (!result || mysql_num_rows(result) == 0)
{
SystemLog::LogWarning("Username [%s] not found in database.", username.c_str());
return false;
}
MYSQL_ROW row = mysql_fetch_row(result);
int accountId = atoi(row[0]);
std::string storedPassword = row[1];
std::string openid = row[2];
mysql_free_result(result);
if (storedPassword != password)
{
SystemLog::LogWarning("Incorrect password for user [%s].", username.c_str());
return false;
}
if (openid.empty())
{
CPacketBuilder response(PACKET_TYPE_AUTH_RESPONSE);
response.WriteByte(AUTH_FAILURE_WECHAT_REQUIRED);
SendPacket(response.Build());
SystemLog::LogWarning("User [%s] requires WeChat verification.", username.c_str());
return false;
}
// Perform additional checks if necessary
CPacketBuilder response(PACKET_TYPE_AUTH_RESPONSE);
response.WriteByte(AUTH_SUCCESS);
SendPacket(response.Build());
SystemLog::LogInfo("User [%s] authenticated successfully.", username.c_str());
return true;
}
void AuthHandler::SendPacket(const Packet& packet)
{
// Send packet to client
}
```
##### 步骤七:编译并测试
确保所有修改后的代码都能成功编译。
**编译服务器端**
```sh
g++ -o game_server src/game_server.cpp src/database_manager.cpp src/auth_handler.cpp src/inventory.cpp src/character.cpp src/packet_builder.cpp src/config_manager.cpp -lengine -ljansson
```
启动游戏服务器和客户端,观察整个微信验证流程是否正常工作。
**启动服务器命令**
```sh
start game_server.exe
start client.exe
```
##### 步骤八:验证微信验证效果
###### 测试微信验证
1. 启动游戏服务器。
2. 使用客户端访问登录页面。
3. 点击“Login with WeChat”按钮。
4. 扫描生成的二维码。
5. 登录微信并授权。
6. 观察是否成功绑定微信账号并登录游戏。
**测试微信验证流程**
```plaintext
1. 进入游戏登录页面。
2. 点击“Login with WeChat”按钮。
3. 扫描显示的二维码。
4. 使用微信扫码并授权。
5. 观察是否有成功的提示消息。
6. 输入用户名和密码尝试登录游戏。
7. 观察是否能够成功登录。
```
#### 4. 日志文件检查
##### 查看游戏服务器日志
打开游戏服务器的日志文件(通常位于`log\game_server.log`),查找相关的错误信息。
**游戏服务器日志示例**
```plaintext
[2023-10-01 12:34:56] INFO: Game server started on port 2107.
[2023-10-01 12:34:56] INFO: Connected to database successfully.
[2023-10-01 12:34:56] INFO: User [testuser] requires WeChat verification.
[2023-10-01 12:34:56] INFO: User [testuser] authenticated successfully.
```
根据日志中的信息,确认游戏服务器是否正常运行以及微信验证操作是否正确执行。
##### 查看客户端日志
打开客户端的日志文件(通常位于`log\client.log`),查找相关的错误信息。
**客户端日志示例**
```plaintext
[2023-10-01 12:34:56] INFO: Connecting to game server at 127.0.0.1:2107.
[2023-10-01 12:34:56] INFO: Connected to game server at 127.0.0.1:2107.
[2023-10-01 12:34:56] INFO: Attempting to log in as testuser.
[2023-10-01 12:34:56] INFO: Received message: User [testuser] requires WeChat verification.
[2023-10-01 12:34:56] INFO: Logging in with WeChat...
[2023-10-01 12:34:56] INFO: Scanned QR code and authorized.
[2023-10-01 12:34:56] INFO: Successfully bound WeChat account.
[2023-10-01 12:34:56] INFO: Logged in as testuser.
```
根据日志中的信息,确认客户端是否正确接收了服务器的响应并且显示了相应的结果。
#### 5. 常见问题及解决方案
##### 问题一:无法连接到游戏服务器
- **检查网络设置**:确保客户端和游戏服务器之间的网络连接正常。
- **检查配置文件**:确保`client_config.txt`中的游戏服务器IP和端口配置正确。
- **检查防火墙设置**:确保防火墙没有阻止游戏服务器的端口。
##### 问题二:登录失败
- **检查数据库配置**:确保`game_config.txt`中的数据库配置正确。
- **检查数据库服务**:确保数据库服务正在运行并且可以访问。
- **检查用户数据**:确保`account_table`中包含正确的用户信息。
##### 问题三:角色加载失败
- **检查角色数据**:确保`char_table`中包含正确的角色信息。
- **检查物品数据**:确保`item_table`中包含正确的物品信息。
- **检查技能数据**:确保`skill_table`中包含正确的技能信息。
##### 问题四:客户端版本不匹配
- **更新客户端**:确保客户端版本与服务器版本兼容。
- **同步资源文件**:确保客户端和服务器之间的资源文件一致。
##### 问题五:微信二维码生成失败
- **检查微信配置**:确保`config.ini`中的微信配置正确。
- **检查微信SDK**:确保引入的微信SDK版本正确且可用。
- **检查网络连接**:确保服务器能够访问微信开放平台。
##### 问题六:微信授权失败
- **检查授权URL**:确保生成的授权URL格式正确。
- **检查回调URL**:确保回调URL配置正确并且可访问。
- **检查状态码**:确保返回的状态码符合预期。
##### 问题七:数据库连接失败
- **检查数据库配置**:确保`game_config.txt`中的数据库配置正确。
- **检查数据库服务**:确保数据库服务正在运行并且可以访问。
- **检查网络设置**:确保服务器能够访问数据库所在的主机。
##### 问题八:用户未绑定微信
- **检查微信绑定逻辑**:确保`auth_handler.cpp`中正确实现了微信绑定逻辑。
- **检查数据库字段**:确保`account_table`中包含`openid`字段。
- **检查日志文件**:查看日志文件以确定是否有绑定失败的记录。
##### 问题九:重复绑定微信
- **检查唯一性约束**:确保`openid`字段在数据库中具有唯一性约束。
- **检查绑定逻辑**:确保`auth_handler.cpp`中正确处理了重复绑定的情况。
- **检查日志文件**:查看日志文件以确定是否有重复绑定的记录。
##### 问题十:跨域请求问题
- **启用CORS**:确保服务器启用了跨域资源共享(CORS)。
- **检查请求头**:确保客户端发送的请求头包含正确的Origin信息。
- **调试网络请求**:使用浏览器开发者工具调试网络请求以确认请求是否成功。
#### 6. 总结
通过以上步骤,你应该能够在GOM传奇引擎中成功实现微信验证功能。这不仅提高了游戏的安全性,还提升了玩家的游戏体验。希望这篇教程对你有所帮助!
---
### 一、前置条件与合法准备
#### 1. 基础授权要求
- **正版GOM引擎授权书**(含商业授权编号)
- **企业资质**:营业执照、ICP备案
- **微信开放平台认证**:需企业认证(300元/年)
#### 2. 微信接口申请流程
1. 登录[微信开放平台](https://open.weixin.qq.com)
2. 创建网站应用 → 填写`网站域名/IP`(需与传奇登录器域名一致)
3. 获取`AppID`与`AppSecret`
---
### 二、服务端配置流程
#### 1. 接口文件修改
**文件路径**:
```
MirServer\LoginGate\WXConfig.ini
```
**配置参数**:
```ini
[WeChat]
AppID=wx1234567890abcdef
AppSecret=abcdef1234567890xyz
RedirectURI=http://yourdomain.com/wxcallback
Scope=snsapi_userinfo
```
#### 2. 登录脚本改造(QManage.txt)
```lua
[@Login]
#IF
CheckWeChatBind <$USERNAME> = 0
#ACT
OpenWeChatAuthWindow
#SAY
请扫码绑定微信账号!
[@WXAuthSuccess]
#ACT
BindWeChat <$USERNAME> <$WXOPENID>
SendMsg 6 微信绑定成功!
```
---
### 三、客户端适配方案
#### 1. 登录器配置
1. 在**登录器配置器**中勾选`启用微信登录`
2. 导入微信SDK文件(`wxauth.dll` + `wxqr.png`)
3. 配置回调事件处理:
```lua
function OnWxAuthSuccess(openid)
SendToServer("WXAuthSuccess "..openid)
end
```
#### 2. 资源文件规范
- 微信二维码尺寸:280×280像素(存放于`Resources\UI\wxqr.png`)
- 按钮坐标:通过UI编辑器调整至合适位置
---
### 四、接口调试与排错
#### 1. 常见错误代码
| 错误码 | 含义 | 解决方案 |
|-------|---------------------|----------------------------|
| 40001 | AppID无效 | 检查微信开放平台配置 |
| 41002 | 回调地址未授权 | 在微信后台添加域名/IP白名单 |
| 43002 | 用户拒绝授权 | 优化授权提示文案 |
#### 2. 网络抓包验证
使用**Fiddler**监控请求流程:
1. 启动登录器 → 触发微信登录
2. 验证是否生成正确授权链接:
```
https://open.weixin.qq.com/connect/qrconnect?appid=xxx&redirect_uri=xxx
```
3. 检查回调数据是否包含`code`参数
---
### 五、安全防护建议
#### 1. 防劫持措施
- 启用HTTPS协议(SSL证书)
- 在`LoginGate.exe`中配置IP访问限制
#### 2. 会话验证机制
```lua
; 每次登录生成随机Token
GenerateToken <$USERNAME>
SendToClient WXToken <$TOKEN>
; 服务端验证
[@WXAuthCallback]
#IF
CheckToken <$TOKEN> = 0
#ACT
KickPlayer
```
---
### 六、合规运营提醒
#### 1. 用户隐私保护
- 在登录页面公示《隐私政策》
- 不得存储用户微信好友关系等敏感数据
#### 2. 数据安全审计
- 每季度进行安全渗透测试
- 保留操作日志不少于6个月
---
#### 结语
GOM引擎的微信验证系统需严格遵循合法接入流程。重点在于微信接口的规范配置与用户隐私保护,开发者应定期审查接口安全性。对于高并发商业服,建议使用**Redis缓存**管理会话状态以提升性能。任何技术方案均需以合法授权为前提!
#### 1. 功能概述
##### 微信验证
微信验证是一种身份验证机制,允许玩家通过扫描二维码或输入验证码的方式绑定自己的微信账号。这样,在登录游戏时,玩家需要先通过微信验证才能进入游戏。
#### 2. GOM引擎简介
##### GOM引擎特点
- **高效稳定**:GOM引擎以其高效的处理能力和稳定的运行表现著称。
- **易用性强**:GOM引擎提供了简洁明了的API接口,方便开发者进行二次开发。
- **功能全面**:支持多种游戏元素的添加,包括但不限于技能、怪物、地图等。
##### 支持自定义功能
GOM引擎允许开发者通过修改代码和配置文件来实现各种自定义功能,包括集成第三方服务如微信验证。
#### 3. 实现微信验证步骤
##### 步骤一:准备工作
确保你已经安装了GOM引擎,并且有一个基本的游戏框架搭建完成。此外,还需要准备好所有必要的客户端和服务器端文件。
##### 步骤二:注册微信开放平台账号
首先,你需要在[微信公众平台](https://open.weixin.qq.com/)注册一个账号,并创建一个移动应用以获取AppID和AppSecret。
##### 步骤三:配置微信验证参数
###### 修改`config.ini`
在`config\config.ini`文件中添加微信验证的相关配置信息。
**config.ini**
```ini
[WeChat]
AppId=your_wechat_appid
AppSecret=your_wechat_appsecret
RedirectUri=http://yourdomain.com/wechat/callback
Token=your_token
EncodingAESKey=your_encodingaeskey
```
##### 步骤四:编写后端逻辑
###### 创建微信回调处理脚本
创建一个PHP脚本来处理微信回调请求,用于生成二维码并验证用户身份。
**wechat_callback.php**
```php
<?php
require_once 'vendor/autoload.php'; // 引入微信SDK
use EasyWeChat\Factory;
$options = [
'app_id' => 'your_wechat_appid',
'secret' => 'your_wechat_appsecret',
'token' => 'your_token',
'aes_key' => 'your_encodingaeskey', // 可选
];
$app = Factory::officialAccount($options);
$oauth = $app->oauth;
if (!session_id()) {
session_start();
}
// 获取OAuth授权结果
$user = $oauth->user();
// 将用户信息保存到数据库
$dbHost = 'localhost';
$dbUser = 'your_db_user';
$dbPass = 'your_db_password';
$dbName = 'your_db_name';
$conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$userId = $_SESSION['user_id'];
$openid = $user->getId();
$username = $user->getOriginal()['nickname'];
$sql = "UPDATE account_table SET openid='$openid', username='$username' WHERE id=$userId";
if ($conn->query($sql) === TRUE) {
echo "Record updated successfully";
} else {
echo "Error updating record: " . $conn->error;
}
$conn->close();
header('Location: http://yourdomain.com/login');
exit;
?>
```
###### 创建二维码生成接口
创建一个PHP脚本来生成微信登录二维码。
**generate_qr_code.php**
```php
<?php
require_once 'vendor/autoload.php'; // 引入微信SDK
use EasyWeChat\Factory;
$options = [
'app_id' => 'your_wechat_appid',
'secret' => 'your_wechat_appsecret',
'token' => 'your_token',
'aes_key' => 'your_encodingaeskey', // 可选
];
$app = Factory::officialAccount($options);
$oauth = $app->oauth;
$state = md5(uniqid(rand(), true)); // 随机字符串
$_SESSION['wechat_state'] = $state;
$redirectUrl = $oauth->scopes(['snsapi_userinfo'])
->redirect('http://yourdomain.com/wechat/callback', $state)
->url;
echo json_encode(['qr_url' => $redirectUrl]);
?>
```
##### 步骤五:修改前端逻辑
###### 修改`login.html`
在登录页面中添加微信登录按钮,并使用JavaScript调用微信二维码生成接口。
**login.html**
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>Login</h1>
<button id="wechat-login">Login with WeChat</button>
<div id="qrcode" style="display:none;"></div>
<script>
$(document).ready(function() {
$('#wechat-login').click(function() {
$.ajax({
url: 'generate_qr_code.php',
method: 'GET',
success: function(response) {
var data = JSON.parse(response);
var qrUrl = data.qr_url;
$('#qrcode').empty();
$('#qrcode').append('<img src="' + qrUrl + '" alt="QR Code"/>');
$('#qrcode').show();
},
error: function(xhr, status, error) {
console.error(error);
}
});
});
});
</script>
</body>
</html>
```
##### 步骤六:修改服务器端逻辑
###### 修改`auth_handler.cpp`
在`src\auth_handler.cpp`文件中添加微信验证逻辑,检查玩家是否已经绑定了微信账号。
**auth_handler.cpp**
```cpp
#include "auth_handler.h"
#include "database_manager.h"
#include "packet_builder.h"
AuthHandler* AuthHandler::GetInstance()
{
static AuthHandler instance;
return &instance;
}
bool AuthHandler::Authenticate(const std::string& username, const std::string& password)
{
DatabaseManager* dbManager = DatabaseManager::GetInstance();
std::string query = "SELECT id, password, openid FROM account_table WHERE username = '" + username + "'";
MYSQL_RES* result = dbManager->Query(query.c_str());
if (!result || mysql_num_rows(result) == 0)
{
SystemLog::LogWarning("Username [%s] not found in database.", username.c_str());
return false;
}
MYSQL_ROW row = mysql_fetch_row(result);
int accountId = atoi(row[0]);
std::string storedPassword = row[1];
std::string openid = row[2];
mysql_free_result(result);
if (storedPassword != password)
{
SystemLog::LogWarning("Incorrect password for user [%s].", username.c_str());
return false;
}
if (openid.empty())
{
CPacketBuilder response(PACKET_TYPE_AUTH_RESPONSE);
response.WriteByte(AUTH_FAILURE_WECHAT_REQUIRED);
SendPacket(response.Build());
SystemLog::LogWarning("User [%s] requires WeChat verification.", username.c_str());
return false;
}
// Perform additional checks if necessary
CPacketBuilder response(PACKET_TYPE_AUTH_RESPONSE);
response.WriteByte(AUTH_SUCCESS);
SendPacket(response.Build());
SystemLog::LogInfo("User [%s] authenticated successfully.", username.c_str());
return true;
}
void AuthHandler::SendPacket(const Packet& packet)
{
// Send packet to client
}
```
##### 步骤七:编译并测试
确保所有修改后的代码都能成功编译。
**编译服务器端**
```sh
g++ -o game_server src/game_server.cpp src/database_manager.cpp src/auth_handler.cpp src/inventory.cpp src/character.cpp src/packet_builder.cpp src/config_manager.cpp -lengine -ljansson
```
启动游戏服务器和客户端,观察整个微信验证流程是否正常工作。
**启动服务器命令**
```sh
start game_server.exe
start client.exe
```
##### 步骤八:验证微信验证效果
###### 测试微信验证
1. 启动游戏服务器。
2. 使用客户端访问登录页面。
3. 点击“Login with WeChat”按钮。
4. 扫描生成的二维码。
5. 登录微信并授权。
6. 观察是否成功绑定微信账号并登录游戏。
**测试微信验证流程**
```plaintext
1. 进入游戏登录页面。
2. 点击“Login with WeChat”按钮。
3. 扫描显示的二维码。
4. 使用微信扫码并授权。
5. 观察是否有成功的提示消息。
6. 输入用户名和密码尝试登录游戏。
7. 观察是否能够成功登录。
```
#### 4. 日志文件检查
##### 查看游戏服务器日志
打开游戏服务器的日志文件(通常位于`log\game_server.log`),查找相关的错误信息。
**游戏服务器日志示例**
```plaintext
[2023-10-01 12:34:56] INFO: Game server started on port 2107.
[2023-10-01 12:34:56] INFO: Connected to database successfully.
[2023-10-01 12:34:56] INFO: User [testuser] requires WeChat verification.
[2023-10-01 12:34:56] INFO: User [testuser] authenticated successfully.
```
根据日志中的信息,确认游戏服务器是否正常运行以及微信验证操作是否正确执行。
##### 查看客户端日志
打开客户端的日志文件(通常位于`log\client.log`),查找相关的错误信息。
**客户端日志示例**
```plaintext
[2023-10-01 12:34:56] INFO: Connecting to game server at 127.0.0.1:2107.
[2023-10-01 12:34:56] INFO: Connected to game server at 127.0.0.1:2107.
[2023-10-01 12:34:56] INFO: Attempting to log in as testuser.
[2023-10-01 12:34:56] INFO: Received message: User [testuser] requires WeChat verification.
[2023-10-01 12:34:56] INFO: Logging in with WeChat...
[2023-10-01 12:34:56] INFO: Scanned QR code and authorized.
[2023-10-01 12:34:56] INFO: Successfully bound WeChat account.
[2023-10-01 12:34:56] INFO: Logged in as testuser.
```
根据日志中的信息,确认客户端是否正确接收了服务器的响应并且显示了相应的结果。
#### 5. 常见问题及解决方案
##### 问题一:无法连接到游戏服务器
- **检查网络设置**:确保客户端和游戏服务器之间的网络连接正常。
- **检查配置文件**:确保`client_config.txt`中的游戏服务器IP和端口配置正确。
- **检查防火墙设置**:确保防火墙没有阻止游戏服务器的端口。
##### 问题二:登录失败
- **检查数据库配置**:确保`game_config.txt`中的数据库配置正确。
- **检查数据库服务**:确保数据库服务正在运行并且可以访问。
- **检查用户数据**:确保`account_table`中包含正确的用户信息。
##### 问题三:角色加载失败
- **检查角色数据**:确保`char_table`中包含正确的角色信息。
- **检查物品数据**:确保`item_table`中包含正确的物品信息。
- **检查技能数据**:确保`skill_table`中包含正确的技能信息。
##### 问题四:客户端版本不匹配
- **更新客户端**:确保客户端版本与服务器版本兼容。
- **同步资源文件**:确保客户端和服务器之间的资源文件一致。
##### 问题五:微信二维码生成失败
- **检查微信配置**:确保`config.ini`中的微信配置正确。
- **检查微信SDK**:确保引入的微信SDK版本正确且可用。
- **检查网络连接**:确保服务器能够访问微信开放平台。
##### 问题六:微信授权失败
- **检查授权URL**:确保生成的授权URL格式正确。
- **检查回调URL**:确保回调URL配置正确并且可访问。
- **检查状态码**:确保返回的状态码符合预期。
##### 问题七:数据库连接失败
- **检查数据库配置**:确保`game_config.txt`中的数据库配置正确。
- **检查数据库服务**:确保数据库服务正在运行并且可以访问。
- **检查网络设置**:确保服务器能够访问数据库所在的主机。
##### 问题八:用户未绑定微信
- **检查微信绑定逻辑**:确保`auth_handler.cpp`中正确实现了微信绑定逻辑。
- **检查数据库字段**:确保`account_table`中包含`openid`字段。
- **检查日志文件**:查看日志文件以确定是否有绑定失败的记录。
##### 问题九:重复绑定微信
- **检查唯一性约束**:确保`openid`字段在数据库中具有唯一性约束。
- **检查绑定逻辑**:确保`auth_handler.cpp`中正确处理了重复绑定的情况。
- **检查日志文件**:查看日志文件以确定是否有重复绑定的记录。
##### 问题十:跨域请求问题
- **启用CORS**:确保服务器启用了跨域资源共享(CORS)。
- **检查请求头**:确保客户端发送的请求头包含正确的Origin信息。
- **调试网络请求**:使用浏览器开发者工具调试网络请求以确认请求是否成功。
#### 6. 总结
通过以上步骤,你应该能够在GOM传奇引擎中成功实现微信验证功能。这不仅提高了游戏的安全性,还提升了玩家的游戏体验。希望这篇教程对你有所帮助!

