士业事务所 Azure Functions 咨询表单通知检查
检查 Azure Functions 咨询表单的隐私、secret、失败通知和预约路径。
士业事务所可能因为一个小自动化失去信任:咨询表单把继承、劳务、合同、补助金内容发到邮件,日志里留下全文,失败时却没人知道。本文用 Claude Code 在上线前检查 Azure Functions 咨询通知。
Key Points
检查要从个人信息、同意、咨询正文、邮件失败、重复提交和预约路径开始。HTTP trigger 很方便,但 anonymous、raw log 和明文 secret 很危险。
Workflow From Form to Booking
流程从表单开始,到预约或回电结束。Claude Code 检查 function.json、app settings、logs、Key Vault references 和失败处理。事务所决定哪些咨询可以进入面谈。
| Flow | Azure Functions review | Human review |
|---|---|---|
| Form receive | HTTP trigger, method, auth, CORS | consent text and accepted case types |
| Notice | masked subject, request id, mail failure | confidential content and staff owner |
| Secret | app settings, Key Vault references | mail API key and access policy |
| Failure | retry record, alert, request id | callback and client communication |
| Booking | completion page and booking URL | whether the case can be booked |
What Claude Code Does and What Humans Decide
Claude Code drafts the Function shape, validation fields, logging policy, Key Vault note, failure checklist, and booking path. Humans decide legal, tax, labor, license, privacy, advertising, confidentiality, and whether to accept the consultation.
3 Use Cases
Use case 1: Split form fields and logs
- Input: form fields, case types, privacy consent, booking URL.
- Output: required fields, optional fields, mail fields, no-log fields.
- Human review: consultation text, personal data, advertising wording, urgent cases.
Use case 2: Review HTTP trigger settings
- Input: function.json, methods, authLevel, App Service auth note, form origin.
- Output: POST-only rule, CORS note, auth warning, and test commands.
- Human review: public exposure, bot protection, stopped services, and phone-first cases.
Use case 3: Handle mail failure and booking path
- Input: mail provider, failure log, retry owner, booking URL, completion page.
- Output: failed notice record, retry rule, staff alert, and booking button rule.
- Human review: which cases can book automatically and which need a call.
Copy-Paste Prompt
Act as a Chinese professional services Azure Functions consultation-form reviewer.
Goal: prevent missed notices, personal-data logs, plain secrets, and missing booking paths.
Review:
- form fields and case types
- privacy consent
- function.json
- app settings draft
- mail provider note
- completion page and booking URL
Return:
1. HTTP trigger method and auth review
2. raw-body log warning
3. secret and Key Vault reference note
4. failed-notice retry checklist
5. booking path and staff owner
6. five settings a beginner should inspect today
Working Check Code
// verify-azure-function-consultation-form.mjs
// No dependencies. Run with: node verify-azure-function-consultation-form.mjs
const functionJson = {
bindings: [
{
authLevel: "anonymous",
type: "httpTrigger",
direction: "in",
name: "req",
methods: ["post"]
},
{
type: "http",
direction: "out",
name: "res"
}
]
};
const source = [
"module.exports = async function (context, req) {",
" console.log(req.body);",
" const apiKey = 'SENDGRID_API_KEY_plain_text';",
" await sendMail(req.body.email, req.body.message, apiKey);",
" context.res = { status: 200, body: 'ok' };",
"};"
].join("\n");
const formPolicy = {
fields: ["name", "email", "caseType", "message"],
required: ["name", "email", "caseType", "message", "privacyConsent"],
hasIdempotencyKey: false,
hasRetryQueue: false,
hasReservationLink: false
};
const problems = [];
const trigger = functionJson.bindings.find((binding) => binding.type === "httpTrigger");
if (!trigger || trigger.authLevel === "anonymous") {
problems.push({ item: "authLevel", fix: "avoid anonymous public posting unless another protection layer exists" });
}
if (/console\.log\(req\.body\)/.test(source)) {
problems.push({ item: "raw body log", fix: "log request id and case type, not the consultation details" });
}
if (/SENDGRID_API_KEY|API_KEY_plain_text/.test(source)) {
problems.push({ item: "plain secret", fix: "use Key Vault references or approved app settings" });
}
if (!formPolicy.required.includes("privacyConsent")) {
problems.push({ item: "privacy consent", fix: "require consent before sending the consultation form" });
}
if (!formPolicy.hasIdempotencyKey) {
problems.push({ item: "duplicate submit", fix: "store an idempotency key from email, timestamp bucket, and message hash" });
}
if (!formPolicy.hasRetryQueue) {
problems.push({ item: "mail failure", fix: "record failed notices and retry or alert a staff member" });
}
if (!formPolicy.hasReservationLink) {
problems.push({ item: "booking path", fix: "include a reservation or callback path after the notice" });
}
if (problems.length > 0) {
console.table(problems);
process.exitCode = 1;
} else {
console.log("Azure Functions consultation form checklist passed.");
}
Pitfall: Common Failure Cases
常见错误是只看测试邮件是否收到。真正要看的是每个真实咨询是否被记录、保护并分配给负责人。
The first failure is calling the project done when email arrives once. A professional office needs traceability for missed notices, duplicate submissions, and booking handoff.
The second failure is logging the whole consultation text. Store request id, case type, time, and result instead.
The third failure is using a plain API key in source code or notes. Move secrets to an approved settings flow and consider Key Vault references.
FAQ
Q. 咨询正文要放进邮件吗?\n\nA. 取决于事务所政策。如果邮件会被多人转发,建议使用脱敏摘要,并把详情放到安全系统。
Q. Are Azure Functions too much for a small office?
A. Sometimes. If a form service already handles consent, notice, and booking, use it. Functions help when the office needs custom routing, retry records, and integration with booking or internal tools.
Q. Is a Function key enough?
A. It depends on exposure. Public forms may need bot protection, CORS review, rate limits, App Service authentication, or another gateway.
Q. Where should teams go next?
A. Offices that need forms, Azure Functions, Key Vault, logging policy, and booking flow reviewed together can start from ClaudeCodeLab training.
What I Verified
中文版保留了咨询表单、隐私、通知遗漏、预约和咨询 CTA。 I checked Azure Functions HTTP trigger, triggers and bindings, Key Vault references, App Service authentication, and Azure Functions security. I also checked the CTA, internal link, executable JavaScript, and locale coverage.
相关文章
用 Claude Code 帮律师事务所整理咨询笔记、起草文书底稿
律师事务所如何用生成式 AI 整理咨询笔记、辅助起草文书底稿的实操步骤:提示词模板、校验脚本、当事人隐私注意事项,全程第一人称记录。
用 Claude Code 构建 GCP Cloud Functions:HTTP、Secret Manager、Cloud Logging
用 Claude Code 构建 Cloud Run functions:HTTP、密钥、日志、部署验证与常见坑。
用 Claude Code 构建 Serverless Functions:Lambda 与 Workers 实战
用 Claude Code 构建可靠的 serverless functions:需求提示词、平台选择、环境变量、幂等、重试、测试和部署检查。
免费 PDF: Claude Code 速查表
输入邮箱即可获取一页 PDF,整理常用命令、审查习惯和安全工作流。
我们会妥善保护你的信息,不发送垃圾邮件。
让 Claude Code 真正进入可验证的工作流
先用免费 PDF 固定基础,再用 Gumroad 教材复用工作流;如果涉及团队导入、权限或收入路径,可以直接咨询。
关于作者
Masa
专注 Claude Code 实务流程、团队导入和内容转化的工程师。