ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

使用Cursor开发微信小程序流程:从Vue3到微信开发者工具的TaoToken配置实践

使用Cursor开发微信小程序流程:从Vue3到微信开发者工具的TaoToken配置实践

1. 从 Vue3 到微信开发者工具:Cursor 开发小程序时 AI 请求链路怎么配

用 Cursor 写 uniapp + Vue3 微信小程序,代码补全和对话都挺顺手,但真正卡人的往往不是页面逻辑,而是「AI 请求到底走哪条通道」。我试过在 Cursor 里让 AI 帮忙写请求封装,结果它默认生成的uni.request示例里 Base URL 是空的,Key 也散落在好几个文件里,换一个工具就得重新找一遍。这个场景的核心痛点其实很具体:本地项目需要统一管理 Key 与 API 通道,避免 Cursor、微信开发者工具、命令行脚本之间来回切换配置。

先说清楚这篇要解决什么。Cursor 本身是一个代码编辑器,它内置的 AI 能力负责帮你写代码;而你的小程序在运行时发起的网络请求,是另一条独立的链路。很多人把这两件事混在一起,以为在 Cursor 里配好了 AI,小程序就能直接调模型——不是的。小程序端要调 AI 能力,得在业务代码里显式发起 HTTPS 请求,而这条请求的 Base URL、Key、Model ID 需要一套统一的配置。TaoToken 在这里扮演的角色,就是把这套配置收敛到一个入口:一个 Base URL、一个 Key、一组 Model ID,Cursor 写代码时用,小程序运行时也用,微信开发者工具里验证时还是用同一套。

适合谁看?如果你正在用 uniapp + Vue3 做微信小程序,并且打算在小程序里接入 AI 对话、文本润色、内容生成这类能力,同时你又在用 Cursor 辅助开发,那这篇的配置路径可以直接跟做。如果你只是想让 Cursor 帮你写普通业务代码、不涉及运行时 AI 请求,那第三、四节的配置同样能帮你把 Cursor 的 AI 通道统一掉,只是第五节的验证步骤可以跳过小程序部分。

我踩过的坑是:一开始把 Key 硬编码在pages/index/index.vue里,后来换了个页面又要复制一遍,改 Key 的时候漏改一处,微信开发者工具里就报 401。后来改成统一从src/config/ai.js读取,Cursor 里改一次,所有页面和工具都跟着变。下面按「先统一配置、再写请求、最后在微信开发者工具里验证」的顺序展开,每一步都给可复制的片段。

2. TaoToken 前置准备:Base URL、Key 与 Model ID 三件套怎么拿

在写任何代码之前,先把三件套准备好:Base URL、API Key、Model ID。这三样东西是后面所有配置的基础,缺一个请求都跑不通。TaoToken 的 API 入口是https://taotoken.net/api,注意这个地址后面不加任何路径后缀,具体到对话补全的完整路径是在代码里拼/v1/chat/completions。官网入口是https://taotoken.net/?utm_source=taotoken_aicg_blog_end,注册和查看文档都从这里进。

拿 Key 的路径很直接:登录后进控制台,找到 API Keys 页面,新建一个 Key。这里有个细节要注意,Key 只在创建时完整显示一次,关掉页面就看不到了,所以创建后立刻复制到你的密码管理器或者本地.env文件里。不要直接提交到 Git,后面我会给.gitignore的写法。控制台地址是https://taotoken.net/console,API Keys 页面是https://taotoken.net/api-keys,这两个 deep link 建议收藏,换机器的时候直接进。

Model ID 这块,TaoToken 支持多种模型,你在控制台或者文档里能看到可用的模型列表。写代码时 Model ID 要填准确,比如对话场景常用的模型标识,填错了会返回模型不存在的错误。我建议在项目里建一个src/config/ai.js,把这三件套集中放进去,但 Key 不要写死,用环境变量注入。下面是一个可复制的配置片段,路径是src/config/ai.js:

// src/config/ai.js // 统一 AI 请求配置,Cursor 与小程序运行时共用 const AI_CONFIG = { baseURL: 'https://taotoken.net/api', apiKey: import.meta.env.VITE_TAOTOKEN_API_KEY || '', model: '你的模型ID', chatPath: '/v1/chat/completions', timeout: 30000 } export default AI_CONFIG

对应的.env文件放在项目根目录,路径是.env.local:

# .env.local VITE_TAOTOKEN_API_KEY=sk-你的Key

.gitignore里加上:

# .gitignore .env.local .env.*.local

这样 Cursor 在写代码时能读到配置,小程序打包时 Vite 会把VITE_开头的变量注入进去。注意 uniapp 的 Vite 版本对import.meta.env支持是没问题的,如果你用的是老版本 webpack 模板,改成process.env.VITE_TAOTOKEN_API_KEY即可。这一步做完,Key 就只存在一个地方,后面不管 Cursor 里怎么改代码,都不会出现 Key 散落的问题。

如果你还想让 Cursor 自身的 AI 对话也走 TaoToken 通道,可以在 Cursor 的设置里找 Models 配置,把 OpenAI Base URL 改成https://taotoken.net/api,API Key 填同一个,Model 填同一个 Model ID。这样 Cursor 写代码用的 AI 和小程序运行时用的 AI 就是同一条通道,排查问题时不用怀疑「是不是两个 Key 不一样」。Cursor 的配置入口在 Settings 里搜 Models,不同版本位置略有差异,但 Base URL 和 Key 这两个字段是固定的。

3. 可复制配置:Cursor settings、uniapp 请求封装与微信开发者工具项目配置

这一节给三份可复制的配置,分别对应 Cursor 编辑器、uniapp 项目请求封装、微信开发者工具项目。三份配置里的 Base URL、Key、Model ID 保持完全一致,这是「统一管理」的关键。

第一份是 Cursor 的 settings 配置。Cursor 基于 VS Code,settings.json 路径在 macOS 是~/Library/Application Support/Cursor/User/settings.json,Windows 是%APPDATA%\Cursor\User\settings.json。如果你用的是 Cursor 的 AI 功能走自定义通道,可以在 settings 里加:

{ "cursor.ai.baseUrl": "https://taotoken.net/api", "cursor.ai.apiKey": "sk-你的Key", "cursor.ai.model": "你的模型ID", "editor.formatOnSave": true, "files.associations": { "*.vue": "vue" } }

注意 Cursor 不同版本对 AI 配置的字段名可能不同,如果cursor.ai.*不生效,去 Settings UI 里搜 Models 手动填。这份配置的作用是让 Cursor 的代码补全和对话走同一条通道,和小程序运行时保持一致。

第二份是 uniapp 的请求封装,路径src/utils/request.js。微信小程序里不能用 axios,要用uni.request,所以封装一层:

// src/utils/request.js import AI_CONFIG from '@/config/ai.js' export function chatCompletion(messages, options = {}) { return new Promise((resolve, reject) => { uni.request({ url: AI_CONFIG.baseURL + AI_CONFIG.chatPath, method: 'POST', timeout: AI_CONFIG.timeout, header: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + AI_CONFIG.apiKey }, data: { model: options.model || AI_CONFIG.model, messages: messages, temperature: options.temperature ?? 0.7, stream: false }, success: (res) => { if (res.statusCode === 200 && res.data.choices) { resolve(res.data.choices[0].message.content) } else { reject(new Error('请求失败: ' + res.statusCode + ' ' + JSON.stringify(res.data))) } }, fail: (err) => { reject(new Error('网络错误: ' + err.errMsg)) } }) }) }

这份封装里 Base URL、Key、Model ID 全部从AI_CONFIG读,改一处全项目生效。注意微信小程序要求所有请求走 HTTPS,https://taotoken.net/api是 HTTPS 的,没问题。另外小程序的uni.request默认不带Authorization头,这里手动加了 Bearer 格式。

第三份是微信开发者工具的项目配置。打包命令是npm run build:mp-weixin,产物在dist/build/mp-weixin。打开微信开发者工具,新建项目,目录选dist/build/mp-weixin,AppID 填你自己的小程序 AppID。这里有个容易忽略的点:微信开发者工具默认会校验合法域名,开发阶段可以在「详情」→「本地设置」里勾选「不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书」,这样本地调试时请求能直接发出去。上线前要把taotoken.net加到小程序后台的 request 合法域名里,否则真机上请求会被拦截。

三份配置的对照关系可以用表格看清楚:

配置位置路径关键字段作用
Cursor settingssettings.jsonbaseUrl / apiKey / model编辑器 AI 通道
uniapp 项目src/config/ai.jsbaseURL / apiKey / model运行时请求配置
微信开发者工具项目目录dist/build/mp-weixinAppID / 合法域名预览与真机调试

三处的 Base URL 都是https://taotoken.net/api,Key 都是同一个,Model ID 都是同一个。这样不管你在 Cursor 里写代码,还是在小程序里跑请求,还是用命令行脚本测试,走的都是同一条通道,排查问题时只需要看一个地方。

4. 验证请求:在微信开发者工具里跑通第一次 AI 对话

配置写完,最关键的一步是验证请求真的能通。很多人配置看起来没问题,但一跑就报错,所以这一节给一个最小可运行的页面,直接在微信开发者工具里看到 AI 返回的内容。

先在src/pages/index/index.vue里写一个测试按钮:

<template> <view class="container"> <button @click="testAI">测试 AI 请求</button> <view v-if="loading">请求中...</view> <view v-if="result" class="result">{{ result }}</view> <view v-if="error" class="error">{{ error }}</view> </view> </template> <script setup> import { ref } from 'vue' import { chatCompletion } from '@/utils/request.js' const loading = ref(false) const result = ref('') const error = ref('') async function testAI() { loading.value = true result.value = '' error.value = '' try { const content = await chatCompletion([ { role: 'user', content: '用一句话介绍微信小程序' } ]) result.value = content } catch (e) { error.value = e.message } finally { loading.value = false } } </script> <style> .container { padding: 40rpx; } .result { margin-top: 30rpx; color: #07c160; } .error { margin-top: 30rpx; color: #fa5151; } </style>

然后在 Cursor 的终端里跑打包命令:

npm run build:mp-weixin

打包完成后,打开微信开发者工具,项目目录选dist/build/mp-weixin。如果你之前已经打开过项目,建议关闭项目重新打开,因为 Cursor 里改代码后重新打包,微信开发者工具的热更新有时候不生效,这个坑我在开头提过。重新打开后,点击「测试 AI 请求」按钮,正常情况下几秒内会看到绿色文字显示 AI 返回的一句话。

如果请求成功,你会在微信开发者工具的 Console 里看到网络请求记录,状态码 200,响应体里有choices数组。这一步跑通,说明 Base URL、Key、Model ID 三件套都是对的,请求链路是通的。接下来你就可以把这个chatCompletion封装用到实际业务页面里,比如做一个 AI 润色输入框、AI 生成文案的按钮。

验证的时候还有个小技巧:在微信开发者工具的 Network 面板里看请求详情,确认请求 URL 是https://taotoken.net/api/v1/chat/completions,请求头里有Authorization: Bearer sk-...,请求体里有model字段。这三个都对,基本就不会有问题。如果状态码不是 200,看响应体里的错误信息,下一节按错误类型排查。

5. 常见报错排查:401、local proxy failed、reading choices、OAuth 怎么处理

这一节按真实报错来,每个错误给现象、原因、解决步骤。这些错误我在配置过程中基本都遇到过,按顺序排查能省不少时间。

401 Unauthorized。现象是微信开发者工具 Console 里返回 401,响应体提示 invalid api key 或 unauthorized。原因通常是 Key 没读到、Key 写错、或者 Key 前面多了空格。排查步骤:第一,在src/config/ai.js里临时console.log(AI_CONFIG.apiKey),看打包后 Key 是不是空字符串。如果为空,说明.env.local没被 Vite 读到,检查文件名是不是.env.local、变量名是不是VITE_开头、有没有重启打包命令。第二,检查 Key 有没有复制完整,有没有多余空格。第三,确认请求头格式是Bearer sk-xxx,Bearer 和 Key 之间有一个空格。第四,如果 Key 是对的还报 401,去控制台确认这个 Key 有没有被禁用或者额度用完。

local proxy failed。这个错误通常出现在 Cursor 的 AI 功能里,不是小程序里。现象是 Cursor 对话时提示 local proxy failed 或者连接失败。原因是 Cursor 的 AI 请求走本地代理,代理配置和 Base URL 冲突。解决步骤:第一,检查 Cursor settings 里的 Base URL 是不是https://taotoken.net/api,不要带/v1后缀,路径在代码里拼。第二,检查系统代理设置,如果开了系统级代理,Cursor 的本地代理可能被拦截,临时关掉系统代理再试。第三,重启 Cursor,让配置生效。这个错误和小程序运行时无关,小程序里不会出现 local proxy failed。

reading choices 报错。现象是请求返回 200,但代码里读res.data.choices[0]时报错,提示 cannot read property 'choices' of undefined 或者 reading 'choices'。原因是响应结构和你预期的不一样,可能是错误响应被当成成功响应处理了。排查步骤:第一,在success回调里先console.log(res.data),看实际返回结构。第二,检查statusCode是不是 200,如果不是 200,res.data里是错误信息,没有choices。第三,检查 Model ID 是不是填对了,模型不存在时返回的错误结构里没有choices。第四,在封装里加一层判断,只有statusCode === 200 && res.data.choices才 resolve,否则 reject 并带上完整响应,这样报错信息更清楚。

OAuth 相关报错。现象是提示 OAuth token 无效、OAuth 认证失败,或者跳转到登录页。这个通常出现在 Cursor 登录态失效,或者你用了 OAuth 方式的 Key。排查步骤:第一,确认你用的是 API Key 而不是 OAuth token,TaoToken 的 API Key 是sk-开头,OAuth token 格式不同。第二,在 Cursor 里重新登录账号,刷新登录态。第三,检查settings.json里有没有残留的旧 OAuth 配置,清掉后重新填 Base URL 和 Key。第四,如果小程序里出现 OAuth 报错,检查请求头是不是误加了 OAuth 相关字段,正常只需要Authorization: Bearer和Content-Type。

除了这四个,还有一个高频问题是「请求超时」。微信开发者工具里如果请求一直 pending,最后超时,检查两点:一是网络能不能访问taotoken.net,在浏览器里打开官网确认;二是微信开发者工具的「不校验合法域名」有没有勾上,没勾的话请求会被拦截。上线前记得把域名加到小程序后台的 request 合法域名列表。

排查的时候建议按这个顺序:先看状态码,401 查 Key,404 查路径,400 查请求体,200 但读不到 choices 查响应结构。状态码对了再看响应体,响应体对了再看代码读取逻辑。这样一层层缩小范围,比盲目改配置快得多。

6. 把配置沉淀成项目模板:Cursor 与小程序共用的 AI 通道

配置跑通之后,建议把这套东西沉淀成项目模板,下次新建 uniapp 项目直接复制,不用重新踩坑。具体做法是把src/config/ai.js、src/utils/request.js、.env.local、.gitignore这四个文件作为模板文件,新建项目时直接拷过去,改一下.env.local里的 Key 就能用。

Cursor 这边,可以把常用的 AI 请求封装提示词存成 snippet,写新页面时直接让 Cursor 按模板生成。比如在 Cursor 里输入「按 request.js 的封装写一个 AI 润色函数」,它会参考现有封装生成一致的代码。这样 Cursor 写代码和小程序运行时用的是同一套配置,不会出现两套 Key 的问题。

微信开发者工具这边,建议把「不校验合法域名」这个设置记下来,本地开发时勾上,上线前取消并配置正式域名。打包命令npm run build:mp-weixin可以加到package.json的 scripts 里,Cursor 终端里直接跑。如果团队多人开发,把.env.local加到.gitignore,每个人用自己的 Key,避免 Key 泄露。

长期做 AI 编码和 Agent 类项目的话,可以考虑用 Coding Plan 把额度集中管理,入口是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。模型对话调试用https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite,接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,API Keys 管理在https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。这几个入口按需用,排障和接入优先看文档和 API Keys,验证模型效果用模型对话,长期编码项目用 Coding Plan。

最后说一个实际经验:微信开发者工具的热更新确实不太稳定,Cursor 里改完代码重新打包后,如果预览没变化,别急着怀疑配置,先关闭项目重新打开。这个操作能解决大部分「改了没生效」的问题。配置本身只要三件套对齐,请求链路就是通的,剩下的就是业务代码的事了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进