216 lines
5.3 KiB
Markdown
216 lines
5.3 KiB
Markdown
# 小程序二维码生成问题排查指南
|
||
|
||
## 常见错误及解决方案
|
||
|
||
### 错误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. 描述复现步骤
|