当您自行打造网站前端时,无需为了制作“联系我们”或“预约咨询”表单而额外集成第三方表单服务。您可以直接在后台“营销 › 在线表单”建立表单,再从自建前端通过 Content Delivery API 读取题目并提交回答。
表单提交后,Kanorio 会自动为您完成防机器人验证、垃圾信息过滤、建立或合并客户联系人、发送填表者确认信与团队通知信,并触发 customers.form.submitted Webhook。
完整端点与错误码规格(SSOT):有关表单三个端点的参数、字段结构与错误码,请查阅 Content Delivery API 参考页(Forms 分组)。
formId。https://www.example.com)加入“允许的来源”(本地开发 localhost 默认放行,无需设置)。GET /api/v1/forms/{id})在页面加载或构建时读取表单的标题、题目字段(fields)、隐私权与营销同意勾选设置(consent),以及表单目前是否开放收件(availability):
availability.accepting 为 false(例如表单已归档或已超过截止时间),前端可直接显示关闭提示,不必渲染输入框。field.id 对齐后台设置即可。GET /api/v1/forms/{id}/challenge)为了在不要求访客输入繁琐图形验证码的前提下挡下自动化垃圾机器人,Kanorio 采用轻量级签名工作量证明(Proof-of-Work)挑战:
GET /api/v1/forms/{id}/challenge(此端点为 no-store,每次返回全新挑战)。solution(或使用 @kanorio/sdk 内置的辅助函数),连同答案一起提交。POST /api/v1/forms/{id}/submit)将访客填写的 answers(以题目 id 为键的对象)、防灌水解答与营销同意状态 POST 至 /api/v1/forms/{id}/submit:
async function submitContactForm(siteUrl: string, formId: string, answers: Record<string, unknown>) { // 1. 获取防灌水挑战并完成计算 const challengeRes = await fetch(`${siteUrl}/api/v1/forms/${formId}/challenge`, { cache: "no-store", }); const challenge = await challengeRes.json(); const token = await solveFormChallenge(challenge); // 2. 提交表单答案 const res = await fetch(`${siteUrl}/api/v1/forms/${formId}/submit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ answers, challengeToken: token, marketingConsent: true, pagePath: window.location.pathname, }), }); if (!res.ok) { const { error } = await res.json(); throw new Error(error?.message ?? "提交失败"); } return res.json(); }
当 /submit 返回 200 OK 后,Kanorio 会在后台自动执行:
customers.form.submitted 事件,系统会立即将答案推送至您的外部系统或自动化流程。可以。若由您的服务器转发,请保留访客的真实来源信息或直接在浏览器端完成挑战与提交,确保每站每访客 IP 的防滥用限流能精准保护您的表单额度。