前言

最近在开发一款景区问答助手微信小程序,前端使用微信原生小程序,后端对接阿里云百炼大模型实现 AI 问答。 开发路上踩了一个非常经典的大坑:电脑模拟器一切正常,扫码上传体验版,手机访问直接提示「网络异常,请重试」。折腾许久,才彻底搞懂小程序为什么不能直接请求第三方 AI 接口,写下这篇博客记录完整排坑过程,也给后来的开发者避坑。

一、一开始的错误思路:小程序前端直接调用阿里云百炼接口

最开始图省事,我打算直接在小程序页面js里面写wx.request,请求阿里云 Dashscope 接口。 把API‑KEY密钥直接写在了小程序前端代码中。

本地开发,勾选开发者工具「不校验合法域名、web‑view(业务域名)、TLS 版本以及 HTTPS 证书」。 电脑模拟器发送提问,AI 正常返回回答,页面展示完美,打字机动画效果一切正常。 当时以为功能已经完成,满心欢喜上传代码、生成体验版,拿出手机扫码测试。

结果发送消息直接弹出提示:网络异常,请重试

二、漫长的排错之路

1. 怀疑接口逻辑问题

我反复核对请求参数、请求头、返回字段取值。 控制台打印返回数据一切正常,接口返回了完整的 AI 回答文案。

let answer = resData?.output?.content || ''

这里还踩过字段取值错误的坑:后端返回数据放在data字段,我却读取了output.content,导致拿到空值,页面输出「抱歉,暂时无法回答你的问题」。 修正字段取值之后模拟器没问题,但是手机扫码依旧网络异常。

2. 怀疑网络、域名问题

模拟器可以访问,手机不行,问题一定出现在微信线上环境的限制。 我查阅资料后才明白一个关键知识点:

「不校验合法域名」仅仅只是电脑开发模拟器的调试开关! 当小程序变成预览版、体验版、正式版的时候,这条设置完全失效。微信会强制开启域名校验。

3. 为什么高德地图就能直接调用?

这个问题一度让我十分困惑。 高德地图小程序 SDK 可以在小程序前端直接发起网络请求,不需要自己搭中转服务器,为什么阿里云 AI 接口不行?

原因有两点:

  1. 域名白名单差异 高德提前向微信提交适配,相关域名被加入微信小程序内置信任域名列表,所有小程序无需手动添加域名就可以调用高德服务。 而阿里云百炼域名dashscope.aliyuncs.com没有进入微信内置白名单;并且微信规则限制,个人开发者无法添加不属于自己的第三方域名到 request 合法域名。微信网关会直接拦截该请求,手机端直接请求失败,报网络异常。
  2. 密钥安全防护能力不一样 高德小程序密钥可以在高德后台绑定你的小程序 AppID,就算密钥被别人扒走,脱离你的小程序就无法调用接口,具备防盗刷能力。 阿里云百炼的sk‑xxxx密钥没有小程序 ID 绑定校验,任何人拿到密钥,在任意设备都可以调用你的 AI 接口产生扣费。一旦放到小程序前端,用户解包小程序代码就能拿到密钥,极易被盗刷,产生高额账单。

到此恍然大悟:小程序前端直调阿里云大模型,从域名规则和安全层面两条路都走不通。

三、最终解决方案:搭建 Node 中转服务器(宝塔部署)

想要实现小程序调用 AI,唯一正确架构就是后端中转。 数据流:

微信小程序前端 → 你自己的公网服务器(Node 中转接口) → 阿里云百炼大模型

服务器部署环境

阿里云 ECS 云服务器 + 宝塔 Linux 面板 部署步骤总结:

  1. 在宝塔新建文件夹上传 Node 中转项目代码,安装依赖npm install
  2. 使用 PM2 管理器后台启动 node 服务,监听端口3001,监听地址必须设置0.0.0.0,不能使用127.0.0.1
  3. 选用自己已经解析完成的域名,新建站点,部署免费 SSL 证书,开启强制 HTTPS
  4. 在宝塔网站设置配置反向代理,把域名请求转发到本地http://127.0.0.1:3001
  5. 修改小程序请求地址,从本地127.0.0.1:3001更换为自己的 HTTPS 线上域名
  6. 登录微信公众平台,将自己的域名添加到小程序后台request合法域名列表
  7. 阿里云服务器安全组开放80、443端口

中转之后,阿里云密钥全程保存在宝塔服务器后端,永远不会下发到用户手机,彻底杜绝密钥泄露风险。小程序只和属于自己的域名通信,完美绕过微信第三方域名拦截问题。

四、本次踩坑总结,几条送给前端开发者的忠告

  1. 模拟器能跑 ≠ 手机线上环境能跑。开发工具的「不校验域名」只是临时调试开关,不能当作线上环境的解决方案。
  2. 凡是第三方扣费类接口(AI 大模型、短信、支付),密钥一律禁止放到小程序前端代码,必须后端中转
  3. 判断能不能小程序前端直接调用第三方接口:先确认对方有没有出小程序专用 SDK,域名是否在微信内置放行清单;没有就老老实实搭中转。
  4. 小程序线上接口强制 HTTPS,不能使用 IP 地址、裸端口、http 地址。
  5. 宝塔部署 Node 服务,线上环境一定要配置反向代理 + SSL 证书,不要直接暴露端口访问。

结尾

这次踩坑也让我彻底理解微信小程序客户端‑服务器的安全架构,很多刚入门小程序的开发者都会踩上「本地调试成功、线上翻车」的大坑,希望这篇文章可以帮大家少走弯路。

如果你想要,我还可以给你配套一份Markdown 精简版或者 CSDN 发布格式、代码片段版。

更多推荐