This commit is contained in:
Your Name
2026-03-06 14:27:24 +08:00
parent 9a1b67ca18
commit 52bb80e2f1
134 changed files with 5337 additions and 401 deletions
+215
View File
@@ -0,0 +1,215 @@
# 小程序二维码生成问题排查指南
## 常见错误及解决方案
### 错误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. 描述复现步骤