微信AI:TaoToken 提醒別暴露 Key)
1. 從一行 wx.request 說起小程序前端直調(diào) AI 的 Key 暴露面TaoToken 提醒在小程序前端直調(diào)微信 AI 時(shí)最容易被忽略的不是模型選型而是wx.request里那行Authorization。TaoToken 的接入入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_intro 拿 Key 后請(qǐng)求地址統(tǒng)一用 https://taotoken.net/api 。不少“個(gè)人小程序如何被微信 AI 調(diào)用”的最小步驟會(huì)這樣寫在微信開發(fā)者工具里發(fā)一個(gè) POST帶上Bearer YOUR_API_KEY收到 JSON 就認(rèn)為接完了。作為前端安全視角的仿寫本文不這么建議。因?yàn)樾〕绦虬杀唤獍鏅C(jī)調(diào)試可看 Network代理工具能抓請(qǐng)求頭Key 一旦進(jìn)入前端就等于對(duì)所有能拿到包的人公開。更穩(wěn)的路徑是前端只調(diào)云函數(shù)云函數(shù)持有 TaoToken KeyTaoToken 的 Base URL 用 https://taotoken.net/api 。下面給出前端安全對(duì)照、后端代理代碼、請(qǐng)求示例以及本地 Claude Code / Codex / CC Switch 的配置邊界。先看一個(gè)最常見的錯(cuò)誤寫法// 危險(xiǎn)示例不要在小程序前端這樣寫 wx.request({ url: https://taotoken.net/api/v1/chat/completions, method: POST, header: { Content-Type: application/json, Authorization: Bearer YOUR_API_KEY }, data: { model: gpt-4o-mini, messages: [{ role: user, content: 你好 }] }, success(res) { console.log(res.data) } })這段代碼在開發(fā)者工具里能跑通甚至體驗(yàn)版也能返回內(nèi)容但它把 TaoToken Key 直接寫進(jìn)了前端請(qǐng)求頭。小程序代碼包下載到本地后JS 文件可被解包閱讀即使做了混淆字符串常量仍然可能被搜索出來。真機(jī)調(diào)試時(shí)Network 面板能看到完整請(qǐng)求頭如果用戶側(cè)抓包Authorization: Bearer ...也會(huì)暴露。結(jié)果就是別人可以拿著你的 Key 調(diào)用模型消耗你的額度甚至觸發(fā)風(fēng)控。前端安全的第一條邊界是能進(jìn)小程序前端的只有業(yè)務(wù)參數(shù)和短期票據(jù)長期有效的 API Key 必須留在服務(wù)端。TaoToken 的 Key 屬于賬號(hào)級(jí)憑證不應(yīng)該出現(xiàn)在wx.request、wxml、wxss、app.js或任何會(huì)被打包的代碼里。下面這張表可以作為前端安全對(duì)照信息項(xiàng)能否放小程序前端原因替代方案TaoToken API Key不能可被解包、抓包、調(diào)試面板看到放云函數(shù)/云托管環(huán)境變量Base URLhttps://taotoken.net/api可以它不是秘密只是請(qǐng)求地址后端統(tǒng)一配置前端不必關(guān)心用戶 openid謹(jǐn)慎用于身份識(shí)別不要外泄由云函數(shù)getWXContext()獲取prompt 用戶輸入可以業(yè)務(wù)數(shù)據(jù)服務(wù)端做長度、內(nèi)容、頻率校驗(yàn)?zāi)P兔梢苑敲舾械粦?yīng)讓前端隨意指定服務(wù)端白名單映射管理臺(tái) Token不能權(quán)限過大永不下發(fā)前端云端臨時(shí)票據(jù)可以有有效期和權(quán)限范圍結(jié)合云函數(shù)鑒權(quán)使用很多個(gè)人小程序開發(fā)者會(huì)問微信 AI 能力不是可以直接在微信生態(tài)里調(diào)用嗎這里要區(qū)分兩件事。微信生態(tài)里的身份、登錄、云函數(shù)、云開發(fā)確實(shí)可以幫你完成鑒權(quán)但只要你接的是第三方大模型 APIKey 的安全邊界就不由微信保證而由你的后端代理保證。無論你接的是微信對(duì)話開放平臺(tái)、還是自己接大模型做 AI 問答只要涉及Authorization請(qǐng)求頭前端直調(diào)就是高風(fēng)險(xiǎn)動(dòng)作。所以在你確定前端代理方案之前先做一件事去 TaoToken 官網(wǎng)創(chuàng)建 Key。鏈接是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_getkey 創(chuàng)建后把請(qǐng)求地址記成 https://taotoken.net/api 。這個(gè) Key 只應(yīng)存在服務(wù)端不應(yīng)寫進(jìn)小程序前端。接下來從最小步驟開始把前端直調(diào)改成后端代理。2. 個(gè)人小程序接入微信 AI 的最小步驟前端只留一個(gè)云函數(shù)名如果你的目標(biāo)是“個(gè)人小程序如何被微信 AI 調(diào)用接入微信生態(tài)最小步驟”那么最小可用路徑不是“前端直調(diào) API”而是“前端調(diào)用云函數(shù)云函數(shù)調(diào)用 TaoToken”。這樣小程序端只需要知道云函數(shù)名例如aiProxy不需要知道 TaoToken Key也不需要知道完整上游地址。最小步驟可以拆成 6 步在 TaoToken 官網(wǎng)創(chuàng)建賬號(hào)并生成 API Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_getkey 。記錄請(qǐng)求地址https://taotoken.net/api。注意這個(gè)地址不要加 UTM它是工具配置用的 Base URL。在微信開發(fā)者工具里開通云開發(fā)創(chuàng)建云函數(shù)aiProxy。在云函數(shù)配置里添加環(huán)境變量TAOTOKEN_API_KEYYOUR_API_KEY不要把 Key 寫進(jìn)index.js。部署云函數(shù)小程序端用wx.cloud.callFunction調(diào)用。真機(jī)預(yù)覽打開調(diào)試器 Network確認(rèn)小程序發(fā)出的請(qǐng)求里沒有Authorization: Bearer ...。這里的關(guān)鍵點(diǎn)是小程序前端只留一個(gè)云函數(shù)名例如wx.cloud.callFunction({ name: aiProxy, data: { prompt: 幫我寫一段小程序公告 } })前端不知道 TaoToken Key也不知道https://taotoken.net/api后面拼了什么路徑。所有敏感配置都收斂到云函數(shù)環(huán)境變量里。這樣即使小程序包被解包攻擊者也拿不到長期有效的 Key。如果你還沒有云開發(fā)環(huán)境也可以在微信開發(fā)者工具里先創(chuàng)建云函數(shù)目錄cloudfunctions/ aiProxy/ index.js package.json config.json miniprogram/ pages/ ai/ ai.js ai.wxml ai.wxssconfig.json可以按云函數(shù)權(quán)限需要配置個(gè)人小程序初期保持默認(rèn)即可。重點(diǎn)是把a(bǔ)iProxy當(dāng)成唯一的 AI 出口所有大模型調(diào)用都從這里走。前端頁面邏輯也可以保持簡單輸入 prompt點(diǎn)擊按鈕調(diào)用云函數(shù)展示結(jié)果。下面是一個(gè)可參考的小程序端示例// miniprogram/pages/ai/ai.js Page({ data: { prompt: , answer: , loading: false }, onPromptInput(e) { this.setData({ prompt: e.detail.value }) }, async onAsk() { const prompt this.data.prompt.trim() if (!prompt) { wx.showToast({ title: 請(qǐng)輸入內(nèi)容, icon: none }) return } this.setData({ loading: true, answer: }) try { const { result } await wx.cloud.callFunction({ name: aiProxy, data: { prompt } }) if (!result || !result.ok) { throw new Error((result result.message) || AI 服務(wù)暫時(shí)不可用) } this.setData({ answer: result.content || }) } catch (err) { wx.showToast({ title: err.message || 調(diào)用失敗, icon: none }) } finally { this.setData({ loading: false }) } } })對(duì)應(yīng)ai.wxml只需要兩個(gè)區(qū)域輸入框和結(jié)果展示。這里不再展開樣式因?yàn)榘踩攸c(diǎn)是請(qǐng)求鏈路不是 UI。到這一步你已經(jīng)完成了“前端不暴露 Key”的最小改造。接下來要寫后端代理代碼也就是云函數(shù)里如何安全地調(diào)用 TaoToken。3. 后端代理代碼微信云函數(shù)調(diào)用 TaoToken 的 OpenAI 兼容接口云函數(shù)是個(gè)人小程序最省事的安全代理。它運(yùn)行在服務(wù)端環(huán)境變量不會(huì)隨小程序包下發(fā)同時(shí)它能通過cloud.getWXContext()拿到OPENID天然具備微信身份鑒權(quán)能力。下面給出一個(gè)可復(fù)制的 Node.js 云函數(shù)示例。先看package.json{ name: aiProxy, version: 1.0.0, description: TaoToken proxy for WeChat mini program, main: index.js, dependencies: { wx-server-sdk: latest, axios: ^1.7.0 } }然后是index.js// cloudfunctions/aiProxy/index.js const cloud require(wx-server-sdk) const axios require(axios) cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const BASE_URL process.env.TAOTOKEN_BASE_URL || https://taotoken.net/api const API_KEY process.env.TAOTOKEN_API_KEY exports.main async (event) { const { OPENID } cloud.getWXContext() if (!OPENID) { return { ok: false, code: NO_OPENID, message: 未獲取到微信身份 } } const prompt String(event.prompt || ).trim() if (!prompt) { return { ok: false, code: EMPTY_PROMPT, message: 請(qǐng)輸入內(nèi)容 } } if (prompt.length 2000) { return { ok: false, code: TOO_LONG, message: 內(nèi)容過長請(qǐng)精簡后重試 } } if (!API_KEY) { console.error([aiProxy] missing TAOTOKEN_API_KEY) return { ok: false, code: NO_API_KEY, message: 服務(wù)端 Key 未配置 } } try { const resp await axios.post( ${BASE_URL}/v1/chat/completions, { model: event.model || gpt-4o-mini, messages: [ { role: user, content: prompt } ], temperature: 0.3, max_tokens: 800 }, { headers: { Content-Type: application/json, Authorization: Bearer ${API_KEY} }, timeout: 20000 } ) const content resp.data?.choices?.[0]?.message?.content || return { ok: true, content } } catch (err) { const status err.response?.status const upstreamBody err.response?.data console.error([aiProxy] upstream error, { status, body: JSON.stringify(upstreamBody).slice(0, 300) }) return { ok: false, code: status || UPSTREAM_ERROR, message: status 401 ? 服務(wù)端 Key 配置錯(cuò)誤 : status 429 ? 請(qǐng)求過于頻繁請(qǐng)稍后再試 : AI 服務(wù)暫時(shí)不可用 } } }這段代碼有幾個(gè)安全細(xì)節(jié)值得單獨(dú)說明第一TAOTOKEN_API_KEY來自環(huán)境變量不來自event。小程序端無法通過傳參覆蓋 Key避免前端偽造。第二OPENID來自cloud.getWXContext()不是前端傳入。這樣每個(gè)請(qǐng)求都能綁定真實(shí)微信用戶后續(xù)可以做頻率限制。第三日志只打印狀態(tài)碼和截?cái)嗪蟮纳嫌雾憫?yīng)不打印完整Authorization。很多團(tuán)隊(duì)出事不是 Key 寫在前端而是 Key 被打印進(jìn)云函數(shù)日志然后日志被分享到群里或提交到倉庫。第四BASE_URL默認(rèn)是https://taotoken.net/api最終請(qǐng)求路徑由代碼拼接為${BASE_URL}/v1/chat/completions。如果你使用的 SDK 會(huì)自動(dòng)拼接/v1則 Base URL 保持https://taotoken.net/api如果你手動(dòng)拼接完整路徑就寫https://taotoken.net/api/v1/chat/completions。不要混用否則容易 404。在微信云函數(shù)控制臺(tái)配置環(huán)境變量時(shí)填寫TAOTOKEN_API_KEYYOUR_API_KEY TAOTOKEN_BASE_URLhttps://taotoken.net/api注意TAOTOKEN_BASE_URL不要加 UTM 參數(shù)。UTM 只用于官網(wǎng)入口追蹤工具配置里的 Base URL 保持干凈。部署后可以在云函數(shù)控制臺(tái)用測(cè)試參數(shù)驗(yàn)證{ prompt: 用一句話解釋為什么小程序不能在前端放 API Key }如果返回ok: true和一段文本說明代理鏈路已經(jīng)通了。如果返回 401優(yōu)先檢查環(huán)境變量里是否真的寫入了YOUR_API_KEY對(duì)應(yīng)的真實(shí) Key如果返回 404檢查 Base URL 和路徑拼接是否重復(fù)或缺失/v1。如果你更習(xí)慣用 curl 在本地先驗(yàn)證 TaoToken 上游是否可用可以用下面這個(gè)請(qǐng)求示例。注意這個(gè)命令只在本地服務(wù)端執(zhí)行不要把結(jié)果貼到公開 issuecurl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer YOUR_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [ { role: user, content: 用一句話解釋小程序?yàn)槭裁匆吆蠖舜?} ], temperature: 0.3 }這個(gè) curl 能通說明 Key 和 Base URL 正確然后再去排查云函數(shù)。不要把 curl 成功截圖發(fā)到公開社區(qū)因?yàn)榻貓D里可能包含完整 Key。4. 前端安全對(duì)照直調(diào)、云函數(shù)、云托管、自建后端怎么選個(gè)人小程序做 AI 接入時(shí)常見方案有四種前端直調(diào)、微信云函數(shù)、微信云托管、自建后端。它們的安全邊界和運(yùn)維成本不同。下面這張對(duì)照表可以作為選型參考方案Key 存放位置優(yōu)點(diǎn)風(fēng)險(xiǎn)適用階段前端直調(diào)小程序包開發(fā)最快Key 公開、無法限流、無法審計(jì)僅本地 demo微信云函數(shù)云函數(shù)環(huán)境變量免運(yùn)維、天然微信身份、成本低冷啟動(dòng)、并發(fā)限制、日志要脫敏個(gè)人小程序最小可用微信云托管Secret 配置可常駐、易擴(kuò)容、支持容器配置成本、費(fèi)用更高有一定流量自建后端服務(wù)器環(huán)境變量完全可控、可做復(fù)雜限流需要備案、運(yùn)維、防攻擊企業(yè)或長期項(xiàng)目從安全角度看前端直調(diào)只適合本地驗(yàn)證接口是否可用不適合上線。只要你的小程序發(fā)布體驗(yàn)版或正式版前端直調(diào)就相當(dāng)于把 Key 公開。云函數(shù)是個(gè)人開發(fā)者最平衡的選擇不需要買服務(wù)器不需要自己配 HTTPS微信云開發(fā)天然提供身份上下文TaoToken Key 放在環(huán)境變量里也不會(huì)隨包下發(fā)。云托管適合請(qǐng)求量更大、需要常駐進(jìn)程的場(chǎng)景。你可以把上面的aiProxy邏輯遷移到 Express 或 Koa 服務(wù)把TAOTOKEN_API_KEY放在云托管 Secret 里。自建后端則適合需要自定義鑒權(quán)、計(jì)費(fèi)、審計(jì)、內(nèi)容安全的中大型項(xiàng)目。不管選哪種都要遵守同一條原則前端只拿結(jié)果不拿 Key。如果你在前端安全對(duì)照里發(fā)現(xiàn)任何一處出現(xiàn)YOUR_API_KEY都要把它移到服務(wù)端。TaoToken 的 Key 創(chuàng)建入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_proxy Base URL 仍然是 https://taotoken.net/api 。另外個(gè)人小程序還要注意內(nèi)容安全。AI 返回的內(nèi)容如果直接展示給用戶建議在云函數(shù)里加一層敏感詞或內(nèi)容安全接口校驗(yàn)。微信云開發(fā)有內(nèi)容安全能力可以在返回前端之前做一次檢查。這樣即使模型輸出不可控也不會(huì)直接把風(fēng)險(xiǎn)內(nèi)容展示給用戶。5. 請(qǐng)求示例與錯(cuò)誤碼排查401、403、429、超時(shí)分別怎么查當(dāng)前端只調(diào)云函數(shù)后排查問題的路徑會(huì)清晰很多小程序端只負(fù)責(zé)展示錯(cuò)誤云函數(shù)日志負(fù)責(zé)記錄上游狀態(tài)。下面用一個(gè)表格整理常見錯(cuò)誤碼和定位方向。錯(cuò)誤碼常見含義優(yōu)先檢查處理建議401未授權(quán)或 Key 錯(cuò)誤云函數(shù)環(huán)境變量TAOTOKEN_API_KEY是否設(shè)置重新生成 Key確認(rèn)Bearer后沒有多余空格403無權(quán)限或額度/權(quán)限限制TaoToken 控制臺(tái)賬號(hào)狀態(tài)、Key 權(quán)限檢查 Key 是否被禁用確認(rèn)賬號(hào)可用404路徑不對(duì)Base URL 與/v1/chat/completions拼接確認(rèn)是https://taotoken.net/api/v1/chat/completions400請(qǐng)求參數(shù)不合法model、messages格式檢查 JSON 字段確保messages是數(shù)組429請(qǐng)求過于頻繁用戶調(diào)用頻率、并發(fā)量云函數(shù)加限流前端做防抖502/504上游超時(shí)或網(wǎng)關(guān)錯(cuò)誤云函數(shù)超時(shí)時(shí)間、網(wǎng)絡(luò)縮短 prompt、增加超時(shí)、重試一次前端無響應(yīng)云函數(shù)未部署或權(quán)限不足云函數(shù)名稱、云開發(fā)環(huán)境重新部署檢查wx.cloud.init排查 401 時(shí)不要在云函數(shù)日志里打印完整 Key??梢杂谩扒?6 位 后 4 位”的方式確認(rèn) Key 是否配置正確function maskKey(key) { if (!key) return EMPTY if (key.length 10) return *** return ${key.slice(0, 6)}...${key.slice(-4)} }如果本地 curl 能通云函數(shù) 401通常是環(huán)境變量沒生效或部署后未重新加載。微信云函數(shù)修改環(huán)境變量后需要重新部署或重啟實(shí)例。如果本地 curl 也 401就去 TaoToken 控制臺(tái)檢查 Key 是否復(fù)制完整。注意YOUR_API_KEY只是占位符不能直接當(dāng)真實(shí) Key 使用。排查 429 時(shí)除了上游限流也可能是前端按鈕被連續(xù)點(diǎn)擊。可以在小程序端加一個(gè)loading狀態(tài)在請(qǐng)求期間禁用按鈕在云函數(shù)側(cè)按OPENID做簡單計(jì)數(shù)例如同一用戶 10 秒內(nèi)最多 5 次。個(gè)人小程序初期不需要復(fù)雜網(wǎng)關(guān)但基本防抖和頻率限制能避免大部分誤觸發(fā)。排查超時(shí)時(shí)注意云函數(shù)默認(rèn)超時(shí)時(shí)間可能較短。如果你的 prompt 很長或模型響應(yīng)慢可以在云函數(shù)配置里適當(dāng)調(diào)大超時(shí)同時(shí)設(shè)置axios的timeout。前端也要設(shè)置自己的等待提示避免用戶以為小程序卡死。最后所有請(qǐng)求示例里的 Key 都必須替換為YOUR_API_KEY并且只在本地或服務(wù)端環(huán)境變量中使用。不要把真實(shí) Key 寫進(jìn)文章、截圖、倉庫、前端代碼或聊天記錄。6. Claude Code、Codex、CC Switch本地工具改 TaoToken 的配置邊界雖然本文主線是小程序前端安全但很多個(gè)人開發(fā)者同時(shí)會(huì)在本地用 Claude Code、Codex 或 CC Switch 做開發(fā)。這些工具的配置也有類似的“不要套錯(cuò)”問題。尤其是 Claude Code 使用ANTHROPIC_*環(huán)境變量Codex 使用config.toml兩者不能混用。下面給出可復(fù)制配置示例。Claude Code 可以使用settings.json核心是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: YOUR_API_KEY } }注意這里不要把ANTHROPIC_*寫到 Codex 的配置里。Codex 使用config.toml配置方式不同model gpt-4o-mini model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api/v1 env_key TAOTOKEN_API_KEY wire_api chatCodex 里使用TAOTOKEN_API_KEY作為環(huán)境變量名不要寫ANTHROPIC_API_KEY。如果你在終端里配置可以這樣export TAOTOKEN_API_KEYYOUR_API_KEYCC Switch 這類配置切換工具核心是“三件套”Base URL、API Key、默認(rèn)模型。你可以把它理解成一組供應(yīng)商配置{ providers: [ { name: TaoToken, base_url: https://taotoken.net/api, api_key: YOUR_API_KEY, default_model: gpt-4o-mini } ] }三件套里base_url不要帶 UTMapi_key只存在本地配置default_model按你的實(shí)際可用模型填寫。切換供應(yīng)商時(shí)不要在不同工具之間復(fù)制錯(cuò)誤的環(huán)境變量名。Claude Code 用ANTHROPIC_*Codex 用config.toml和TAOTOKEN_API_KEYCC Switch 用三件套。這樣本地工具和線上小程序代理各自獨(dú)立不會(huì)互相污染。如果你需要更詳細(xì)的 Claude Code 配置說明可以在文末查看 TaoToken 的 Claude Code 文檔。小程序側(cè)仍然堅(jiān)持后端代理不要把本地工具的 Key 直接搬進(jìn)小程序前端。7. 上線前檢查清單與下一步 CTA在小程序發(fā)布體驗(yàn)版或正式版之前建議按下面清單逐項(xiàng)檢查小程序前端代碼中搜索YOUR_API_KEY確認(rèn)沒有真實(shí) Key。搜索Authorization確認(rèn)請(qǐng)求頭只出現(xiàn)在云函數(shù)或服務(wù)端代碼。云函數(shù)環(huán)境變量已配置TAOTOKEN_API_KEY且沒有寫進(jìn)index.js。Base URL 使用https://taotoken.net/api路徑拼接正確。云函數(shù)日志沒有打印完整 Key。小程序端對(duì)按鈕做了防抖或 loading 限制。云函數(shù)對(duì)OPENID做了基本鑒權(quán)或頻率限制。prompt 長度有上限避免一次消耗過多 token。AI 返回內(nèi)容在展示前做了必要的內(nèi)容安全校驗(yàn)。真機(jī)調(diào)試 Network 面板中小程序發(fā)出的請(qǐng)求不包含上游Authorization。完成這些檢查后你的個(gè)人小程序就具備了“前端不暴露 Key”的最小安全形態(tài)。后續(xù)如果流量增加可以把云函數(shù)替換為云托管或自建后端但前端調(diào)用方式可以保持不變?nèi)匀皇恰扒岸酥徽{(diào)自己的服務(wù)服務(wù)端持有 TaoToken Key”。如果你還沒有創(chuàng)建 Key可以先從模型對(duì)話頁面驗(yàn)證接口能力再去控制臺(tái)創(chuàng)建 Key最后配置本地工具或小程序云函數(shù)。推薦路徑如下模型對(duì)話體驗(yàn)https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_cta_chatCoding Plan 查看https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_cta_plan創(chuàng)建 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_cta_keysClaude Code 文檔https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_cta_claude_code官網(wǎng)入口也可以直接訪問https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmini_program_checklist 。記住小程序前端直調(diào)看起來是最短路徑但安全上不是。把 Key 留在服務(wù)端把請(qǐng)求地址統(tǒng)一成https://taotoken.net/api前端只調(diào)云函數(shù)才是個(gè)人小程序接入微信 AI 時(shí)更穩(wěn)的最小步驟。