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

5.3 KiB
Raw Blame History

小程序二维码生成问题排查指南

常见错误及解决方案

错误1: errcode 40001 - invalid credential, access_token is invalid

错误信息:

{
  "errcode": 40001,
  "errmsg": "invalid credential, access_token is invalid or not latest"
}

可能原因:

  1. AppID 或 AppSecret 配置错误
  2. 缓存的 AccessToken 已失效
  3. 小程序未发布或已被封禁

解决方案:

步骤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

  1. 登录微信公众平台:https://mp.weixin.qq.com
  2. 进入:开发 -> 开发管理 -> 开发设置
  3. 确认AppID和AppSecret是否正确
  4. 如果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

代码改进

已添加的改进

  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. 所有请求都应该成功

微信官方文档

联系支持

如果问题仍未解决:

  1. 收集完整的日志信息
  2. 记录错误发生的时间
  3. 提供小程序AppID(脱敏处理)
  4. 描述复现步骤