Files
zyt/QRCODE_DEBUG_GUIDE.md
T
2026-03-06 14:27:24 +08:00

216 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 小程序二维码生成问题排查指南
## 常见错误及解决方案
### 错误1: errcode 40001 - invalid credential, access_token is invalid
**错误信息**:
```json
{
"errcode": 40001,
"errmsg": "invalid credential, access_token is invalid or not latest"
}
```
**可能原因**:
1. AppID 或 AppSecret 配置错误
2. 缓存的 AccessToken 已失效
3. 小程序未发布或已被封禁
**解决方案**:
#### 步骤1: 验证小程序配置
```sql
-- 查询数据库中的小程序配置
SELECT * FROM la_config WHERE type = 'mnp_setting';
```
检查配置项:
- `app_id`: 小程序AppID(必须正确)
- `app_secret`: 小程序AppSecret(必须正确)
#### 步骤2: 清除缓存
```php
// 在PHP中执行或通过后台清除缓存
$appId = 'your_app_id';
cache('wx_access_token_' . $appId, null);
```
或者直接删除缓存文件:
```bash
# 删除runtime缓存
rm -rf server/runtime/cache/*
```
#### 步骤3: 手动测试获取AccessToken
创建测试文件 `server/test_access_token.php`:
```php
<?php
require __DIR__ . '/vendor/autoload.php';
$appId = 'your_app_id';
$appSecret = 'your_app_secret';
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
echo "响应: " . $response . "\n";
$result = json_decode($response, true);
if (isset($result['access_token'])) {
echo "✓ AccessToken获取成功: " . $result['access_token'] . "\n";
echo "有效期: " . $result['expires_in'] . "秒\n";
} else {
echo "✗ 获取失败\n";
echo "错误码: " . ($result['errcode'] ?? '无') . "\n";
echo "错误信息: " . ($result['errmsg'] ?? '无') . "\n";
}
```
运行测试:
```bash
cd server
php test_access_token.php
```
#### 步骤4: 验证AppID和AppSecret
1. 登录微信公众平台:https://mp.weixin.qq.com
2. 进入:开发 -> 开发管理 -> 开发设置
3. 确认AppID和AppSecret是否正确
4. 如果AppSecret泄露,需要重置并更新配置
### 错误2: errcode 40013 - invalid appid
**错误信息**:
```json
{
"errcode": 40013,
"errmsg": "invalid appid"
}
```
**原因**: AppID格式错误或不存在
**解决方案**:
- 检查AppID是否包含多余的空格
- 确认AppID是小程序的,不是公众号的
- AppID格式应为:wx开头的18位字符
### 错误3: errcode 41001 - access_token missing
**原因**: AccessToken未传递或为空
**解决方案**:
- 检查 `getWxAccessToken()` 方法是否正确返回
- 查看日志确认AccessToken获取流程
### 错误4: errcode 45009 - api minute-quota reach limit
**原因**: 接口调用频率超限
**解决方案**:
- 等待1分钟后重试
- 优化代码,避免频繁调用
- 使用缓存机制
## 调试步骤
### 1. 查看日志
日志文件位置:`server/runtime/log/`
查看最新日志:
```bash
tail -f server/runtime/log/$(date +%Y%m%d).log
```
关键日志信息:
- `开始生成小程序码` - 记录请求参数
- `微信AccessToken响应` - AccessToken获取结果
- `调用微信API生成小程序码` - 发送给微信的数据
- `小程序码生成成功` - 成功生成的URL
### 2. 检查网络连接
测试服务器是否能访问微信API
```bash
curl -I https://api.weixin.qq.com
```
应该返回 200 状态码。
### 3. 检查目录权限
确保uploads目录可写:
```bash
chmod -R 755 server/public/uploads
chown -R www-data:www-data server/public/uploads
```
### 4. 检查小程序页面路径
确认小程序中存在页面:`pages/order/monad/monad`
在小程序项目中检查:
```
pages/
└── order/
└── monad/
├── monad.js
├── monad.json
├── monad.wxml
└── monad.wxss
```
## 代码改进
### 已添加的改进
1. ✅ 详细的日志记录
2. ✅ AccessToken错误自动清除缓存
3. ✅ 更详细的错误信息
4. ✅ 保存图片失败检测
### 新增功能
- 当遇到 40001 或 42001 错误时,自动清除缓存并可重试
- 所有关键步骤都有日志记录
- 错误信息包含 errcode 和 errmsg
## 测试建议
### 测试1: 首次生成
1. 清除所有缓存
2. 生成二维码
3. 查看日志确认AccessToken获取过程
### 测试2: 缓存测试
1. 第一次生成后立即再次生成
2. 确认第二次使用了缓存的AccessToken
3. 响应时间应该更快
### 测试3: 错误恢复
1. 故意配置错误的AppSecret
2. 尝试生成,应该看到详细错误
3. 修正配置后重试
### 测试4: 并发测试
1. 同时生成多个二维码
2. 确认AccessToken只获取一次
3. 所有请求都应该成功
## 微信官方文档
- AccessToken获取: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
- 小程序码生成: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html
- 错误码说明: https://developers.weixin.qq.com/miniprogram/dev/framework/usability/PublicErrno.html
## 联系支持
如果问题仍未解决:
1. 收集完整的日志信息
2. 记录错误发生的时间
3. 提供小程序AppID(脱敏处理)
4. 描述复现步骤