必须通过后端中转调用天工AI API,因小程序前端无法直连;需注册获取client_id/client_secret,用云函数封装签名逻辑并配置环境变量,前端调用云函数传参,服务端返回结果后刷新消息列表,流式响应需额外配置代理接口。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在微信小程序里直接调用天工AI的对话能力,必须绕过其官方App封闭链路,通过天工开放平台提供的HTTP API接入。这要求你具备基础的后端中转能力,因为小程序不允许前端直连天工API——它强制要求携带X-Auth-Key和X-Auth-Nonce双签名头,且nonce需每请求动态生成,无法硬编码在WXML或JS中。
第一步:注册并获取天工开发者凭证
打开天工开放平台控制台,使用手机号注册账号 → 登录后进入「我的应用」→ 点击「创建应用」→ 填写应用名称(如“小程序客服助手”)、选择「Web应用」类型 → 提交后立即获得client_id和client_secret。
【client_secret是敏感密钥,绝不能出现在小程序前端代码中】。若已在代码里泄露,必须立刻在控制台重置密钥,否则他人可盗用你的配额并产生费用。
第二步:搭建轻量中转服务(推荐云函数)
用微信云开发的云函数替代自建服务器,避免运维压力。在云开发控制台新建函数tianGongChat,运行环境选Node.js 16,粘贴以下代码:
const cloud = require('wx-server-sdk');
cloud.init();
exports.main = async (event, context) => {
const { message, sessionId } = event;
const url = 'https://api.tiangong.cn/v3/chat/completions';
const timestamp = Math.floor(Date.now() / 1000).toString();
const nonce = Math.random().toString(36).substr(2, 12);
const signature = require('crypto')
.createHmac('sha256', process.env.CLIENT_SECRET)
.update(`${timestamp}${nonce}`)
.digest('hex');
try {
const res = await cloud.http.post({
url,
headers: {
'Content-Type': 'application/json',
'X-Auth-Key': process.env.CLIENT_ID,
'X-Auth-Nonce': nonce,
'X-Auth-Timestamp': timestamp,
'X-Auth-Signature': signature
},
data: {
model: 'qwen-max',
messages: [{ role: 'user', content: message }],
session_id: sessionId || undefined
}
});
return { success: true, data: res.data };
} catch (err) {
return { success: false, error: err.errMsg || '调用失败' };
}
};
在云函数配置中,点击「环境变量」→ 添加CLIENT_ID和CLIENT_SECRET,值为你上一步拿到的凭证。保存并部署。
第三步:小程序前端发起对话请求
在聊天页的Page逻辑中,用户点击发送按钮时执行:
调用云函数:cloud.callFunction({ name: 'tianGongChat', data: { message: this.data.inputText, sessionId: this.data.sessionId } }) → 成功后将res.result.data.choices[0].message.content追加到消息列表 → 调用this.setData({ msgList: newMsgList })刷新界面。
注意:天工API返回的session_id会随首次响应一同下发,后续请求必须带上它才能维持上下文。若用户清空聊天重新开始,需丢弃旧sessionId并让下一次请求不带该字段,由天工服务端自动分配新会话。
第四步:处理流式响应(可选但强烈建议)
天工API支持stream=true参数返回SSE流式数据,但小程序wx.cloud.callFunction不支持流式读取。必须改用wx.request直连你自己的中转接口(如Nginx反向代理云函数HTTPS地址),并在服务端做流式透传。这一步需要额外配置CORS和超时时间(至少30秒),否则长回复会被截断。



















