5.3 KiB
5.3 KiB
小程序二维码生成问题排查指南
常见错误及解决方案
错误1: errcode 40001 - invalid credential, access_token is invalid
错误信息:
{
"errcode": 40001,
"errmsg": "invalid credential, access_token is invalid or not latest"
}
可能原因:
- AppID 或 AppSecret 配置错误
- 缓存的 AccessToken 已失效
- 小程序未发布或已被封禁
解决方案:
步骤1: 验证小程序配置
-- 查询数据库中的小程序配置
SELECT * FROM la_config WHERE type = 'mnp_setting';
检查配置项:
app_id: 小程序AppID(必须正确)app_secret: 小程序AppSecret(必须正确)
步骤2: 清除缓存
// 在PHP中执行或通过后台清除缓存
$appId = 'your_app_id';
cache('wx_access_token_' . $appId, null);
或者直接删除缓存文件:
# 删除runtime缓存
rm -rf server/runtime/cache/*
步骤3: 手动测试获取AccessToken
创建测试文件 server/test_access_token.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";
}
运行测试:
cd server
php test_access_token.php
步骤4: 验证AppID和AppSecret
- 登录微信公众平台:https://mp.weixin.qq.com
- 进入:开发 -> 开发管理 -> 开发设置
- 确认AppID和AppSecret是否正确
- 如果AppSecret泄露,需要重置并更新配置
错误2: errcode 40013 - invalid appid
错误信息:
{
"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/
查看最新日志:
tail -f server/runtime/log/$(date +%Y%m%d).log
关键日志信息:
开始生成小程序码- 记录请求参数微信AccessToken响应- AccessToken获取结果调用微信API生成小程序码- 发送给微信的数据小程序码生成成功- 成功生成的URL
2. 检查网络连接
测试服务器是否能访问微信API:
curl -I https://api.weixin.qq.com
应该返回 200 状态码。
3. 检查目录权限
确保uploads目录可写:
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
代码改进
已添加的改进
- ✅ 详细的日志记录
- ✅ AccessToken错误自动清除缓存
- ✅ 更详细的错误信息
- ✅ 保存图片失败检测
新增功能
- 当遇到 40001 或 42001 错误时,自动清除缓存并可重试
- 所有关键步骤都有日志记录
- 错误信息包含 errcode 和 errmsg
测试建议
测试1: 首次生成
- 清除所有缓存
- 生成二维码
- 查看日志确认AccessToken获取过程
测试2: 缓存测试
- 第一次生成后立即再次生成
- 确认第二次使用了缓存的AccessToken
- 响应时间应该更快
测试3: 错误恢复
- 故意配置错误的AppSecret
- 尝试生成,应该看到详细错误
- 修正配置后重试
测试4: 并发测试
- 同时生成多个二维码
- 确认AccessToken只获取一次
- 所有请求都应该成功
微信官方文档
- 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
联系支持
如果问题仍未解决:
- 收集完整的日志信息
- 记录错误发生的时间
- 提供小程序AppID(脱敏处理)
- 描述复现步骤