const axios = require('axios'); async function testWechatApiDirect() { console.log('🔍 直接测试微信API调用'); console.log('='.repeat(50)); // 微信小程序配置(从application.yml中获取) const appId = 'wxaa13026a14b1d784'; const appSecret = 'b7a7acc1063a83b9cd3173fb08919f84'; console.log('1️⃣ 测试获取access_token'); try { const tokenUrl = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`; console.log('请求URL:', tokenUrl.replace(appSecret, '***')); const tokenResponse = await axios.get(tokenUrl, { timeout: 10000 }); console.log('access_token响应:', tokenResponse.data); if (tokenResponse.data.errcode) { console.log('❌ 获取access_token失败:'); console.log('错误码:', tokenResponse.data.errcode); console.log('错误信息:', tokenResponse.data.errmsg); // 常见错误码解释 const errorCodes = { 40013: 'AppID无效', 40001: 'AppSecret错误', 40002: '不合法的凭证类型', 40164: 'IP地址不在白名单中', 45009: '接口调用超过限制', 89503: '此IP调用需要管理员确认' }; if (errorCodes[tokenResponse.data.errcode]) { console.log('错误解释:', errorCodes[tokenResponse.data.errcode]); } return; } const accessToken = tokenResponse.data.access_token; console.log('✅ 成功获取access_token:', accessToken.substring(0, 20) + '...'); // 测试获取手机号API console.log('\n2️⃣ 测试获取手机号API'); const phoneUrl = 'https://api.weixin.qq.com/wxa/business/getuserphonenumber'; const phoneData = { code: 'test_code_123' }; try { const phoneResponse = await axios.post( `${phoneUrl}?access_token=${accessToken}`, phoneData, { headers: { 'Content-Type': 'application/json' }, timeout: 10000 } ); console.log('手机号API响应:', phoneResponse.data); if (phoneResponse.data.errcode) { console.log('❌ 获取手机号失败:'); console.log('错误码:', phoneResponse.data.errcode); console.log('错误信息:', phoneResponse.data.errmsg); // 手机号API常见错误码 const phoneErrorCodes = { 40001: 'access_token无效', 40003: 'openid错误', 47001: 'POST数据参数不合法', 40013: 'AppID无效', 61023: 'code无效或已过期', 61024: 'code已被使用' }; if (phoneErrorCodes[phoneResponse.data.errcode]) { console.log('错误解释:', phoneErrorCodes[phoneResponse.data.errcode]); } } else { console.log('✅ 手机号API调用成功(虽然code无效)'); } } catch (phoneError) { console.log('❌ 手机号API请求异常:', phoneError.message); if (phoneError.response) { console.log('响应状态:', phoneError.response.status); console.log('响应数据:', phoneError.response.data); } } } catch (error) { console.log('❌ 获取access_token异常:', error.message); if (error.response) { console.log('响应状态:', error.response.status); console.log('响应数据:', error.response.data); } if (error.code === 'ENOTFOUND') { console.log('🌐 网络连接问题:无法解析微信API域名'); } else if (error.code === 'ETIMEDOUT') { console.log('⏰ 网络超时:请检查网络连接'); } } console.log('\n3️⃣ 测试code2session API'); try { const sessionUrl = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=test_code&grant_type=authorization_code`; console.log('请求URL:', sessionUrl.replace(appSecret, '***')); const sessionResponse = await axios.get(sessionUrl, { timeout: 10000 }); console.log('code2session响应:', sessionResponse.data); if (sessionResponse.data.errcode) { console.log('❌ code2session失败:'); console.log('错误码:', sessionResponse.data.errcode); console.log('错误信息:', sessionResponse.data.errmsg); } else { console.log('✅ code2session API可访问(虽然code无效)'); } } catch (sessionError) { console.log('❌ code2session异常:', sessionError.message); } console.log('\n🔧 诊断结果:'); console.log('如果所有API都返回网络错误,可能的原因:'); console.log('1. 网络连接问题'); console.log('2. 防火墙阻止了对微信API的访问'); console.log('3. DNS解析问题'); console.log('4. 代理设置问题'); console.log('\n如果API可访问但返回错误码,可能的原因:'); console.log('1. AppID或AppSecret配置错误'); console.log('2. IP地址不在微信白名单中'); console.log('3. 接口调用频率超限'); } testWechatApiDirect().catch(console.error);