更新
This commit is contained in:
@@ -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. 描述复现步骤
|
||||
Reference in New Issue
Block a user