大模型支付宝小程序对接:从零配置到接口验证
大模型支付宝小程序对接,核心原则只有一条:不要在支付宝小程序前端直接调用大模型 API。
小程序代码包可以被反编译,任何写在 app.js 或页面里的 API Key 都会泄露。
正确做法是由你自己的服务器(或云函数)持有密钥,对外暴露一个受控接口,小程序通过 my.request 调用这个接口。
下面按准备、操作、验证和避坑的顺序展开。
先确认你手里有什么
开始前需要准备三样东西:一个已创建好的支付宝小程序(能拿到 APPID)、一个可用的大模型 API Key 及调用地址、一台能运行 HTTPS 服务的服务器或云函数。
小程序真机调试要求请求域名在支付宝开放平台后台配置为白名单,测试阶段可临时关闭域名校验,但上线前必须配好。
服务端语言不限,本文以 Node.js + Express 为例,其他语言逻辑一致。
服务器上建议安装 nginx 做反向代理并启用 HTTPS,宝塔面板用户可在“网站”中直接申请 Let's Encrypt 证书。
服务端转发接口怎么写
服务端要做两件事:从环境变量读取大模型密钥,接收小程序传来的用户输入,转发请求后把结果原样返回。
不要在小程序端拼接 Authorization 头。
# 在服务器项目目录安装依赖
npm init -y
npm install express axios dotenv
创建 .env 文件(不要提交到 Git):
LLM_API_KEY=你的大模型APIKey
LLM_API_URL=https://你的大模型服务地址/v1/chat/completions
PORT=3000
入口文件 server.js 示例:
require('dotenv').config();
const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());
app.post('/api/chat', async (req, res) => {
const { message } = req.body;
if (!message) return res.status(400).json({ error: 'message 不能为空' });
try {
const resp = await axios.post(process.env.LLM_API_URL, {
model: '你使用的模型名',
messages: [{ role: 'user', content: message }]
}, {
headers: { Authorization: `Bearer ${process.env.LLM_API_KEY}` },
timeout: 30000
});
res.json({ reply: resp.data.choices[0].message.content });
} catch (err) {
console.error(err.response?.data || err.message);
res.status(502).json({ error: '大模型服务调用失败' });
}
});
app.listen(process.env.PORT, () => console.log('server running'));
启动后用 curl 自测,确认服务端本身可用:
curl -X POST http://127.0.0.1:3000/api/chat \
-H "Content-Type: application/json" \
-d '{"message":"你好"}'
返回 JSON 中应包含 reply 字段。
如果这一步失败,先查 .env 是否被正确加载、大模型地址是否可达,不要急着改小程序代码。
小程序端如何发起请求
在支付宝小程序页面中,用 my.request 调用你的服务端接口。
注意 url 必须是 HTTPS 且已加入白名单。
Page({
data: { input: '', answer: '' },
onInput(e) { this.setData({ input: e.detail.value }); },
send() {
my.request({
url: 'https://你的域名/api/chat',
method: 'POST',
headers: { 'Content-Type': 'application/json' },
data: { message: this.data.input },
success: (res) => {
if (res.status === 200 && res.data.reply) {
this.setData({ answer: res.data.reply });
} else {
my.alert({ content: res.data.error || '请求失败' });
}
},
fail: (err) => {
my.alert({ content: '网络异常:' + err.errorMessage });
}
});
}
});
真机调试前,在支付宝开放平台“开发设置”中把 https://你的域名 添加到服务器域名白名单。
若临时关闭校验,真机预览可能仍受限,建议直接配好白名单再测。
常见报错与避坑清单
request:fail或域名不合法:检查白名单是否包含完整域名(不带路径),且证书是否有效。- 服务端返回 502:说明大模型上游调用失败,看服务端日志里的
err.response.data,常见原因是密钥错误、模型名写错或余额不足。 - 小程序收到 400:检查
message字段是否为空,以及请求头是否为application/json。 - 密钥泄露风险:永远不要在
.wxml、.js或小程序云函数控制台中明文写 Key;服务端用环境变量,并给服务器设置防火墙,只开放 443 端口。 - 超时:大模型响应可能超过 10 秒,服务端
timeout建议设为 30 秒左右,小程序端也要给用户加载提示,避免重复点击。
怎么判断对接成功
完成以上步骤后,按三层验证:第一层,用 curl 请求服务端接口能拿到 reply;
第二层,在支付宝开发者工具中模拟器发起请求,能在控制台看到 200 响应;
第三层,真机扫码测试,输入问题后页面能显示模型返回内容。
三层都通过,说明链路完整。
如果只有真机失败,优先检查域名白名单和手机网络环境。
上线前再做一次安全检查:确认 .env 未被打包进前端、服务端错误信息不返回堆栈、接口增加简单的频率限制(例如同一 IP 每分钟最多 20 次),避免被刷。
两个容易混淆的问题
支付宝小程序能不能直接调大模型接口? 不建议。
即使临时可用,密钥暴露后会被他人盗用,且域名白名单管理也会更麻烦。
服务端必须用 Node.js 吗? 不必。
PHP、Python、Go 都可以,只要完成“接收请求、转发带密钥的请求、返回结果”这三步。
关键是密钥只存在于服务端。
按本文顺序执行,先让服务端接口跑通,再配小程序域名和页面请求,最后做真机验证。
遇到异常时,回到对应层用 curl 或日志定位,比反复改前端代码更有效。