Dify可自动对接Zendesk实现退款工单零人工处理:配置API凭证与自定义工具,通过Python函数或FastAPI服务拉取工单、校验订单、调用退款接口并更新备注。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要让Dify平台自动对接Zendesk客服系统,当客户提交退款请求工单时,Dify能实时读取工单详情、校验订单状态、调用退款接口并更新工单备注——整个流程不依赖人工介入。
准备Zendesk API凭证与权限
登录Zendesk管理员后台 → 左侧菜单点击【Admin Center】→ 【Account】→ 【API】→ 开启Token访问支持。
点击【Create API token】生成新token,复制完整字符串(形如 【z9x8y7w6v5u4t3s2r1q0p9o8n7m6l5k4j3i2h1g0f9e8d7c6b5a4】),该值仅显示一次,丢失需重新生成。
在【Settings】→ 【API】→ 【Restrict API access】中确认未启用IP白名单,否则Dify服务器出口IP必须提前加入,否则所有请求返回403。
在Dify中配置自定义工具(Custom Tool)
进入Dify控制台 → 【Agent】→ 选择对应应用 → 【Tools】→ 【+ Add tool】→ 选择【Custom tool】。
填写工具名称为“zendesk_refund_handler”,描述写“自动处理退款工单:拉取工单→查订单→调支付网关→写回Zendesk备注”。
在Schema字段粘贴以下OpenAPI 3.0格式的JSON定义(注意替换your_subdomain为实际子域名):
{ "name": "zendesk_refund_handler", "description": "Handle refund requests from Zendesk tickets: fetch ticket, validate order, trigger refund, update ticket comment", "parameters": { "type": "object", "properties": { "ticket_id": { "type": "string", "description": "Zendesk ticket ID, e.g. '12345'" } }, "required": ["ticket_id"] } }在API URL填入:https://your_subdomain.zendesk.com/api/v2/tickets/{ticket_id}.json,将your_subdomain替换成你的真实Zendesk子域名。
Authentication选【API Key】,Email填管理员邮箱(如admin@company.com),Password填刚复制的API Token字符串——【Token必须带前缀'key_'或直接是纯字符串,Dify不自动添加】。
编写Python函数实现退款逻辑
方法一:使用Dify内置代码工具(推荐快速验证)
Temu 欧洲站电商退货退款API,通过 LinkFox 网关转发 Partner EU Returns & Refunds / 售后退货退款 相关后台/Temu 接口(退货申请、退款、售后单查询与处理等),接口将按 Partner 文档逐条接入。当用户提到 Temu EU 退货、退款、售后退货、return...
在Custom Tool的【Function】标签页,Language选Python 3.11,粘贴以下代码:
import requests import jsondef execute(ticket_id: str) -> str:
Step 1: Fetch ticket details
zendesk_url = f"https://your_subdomain.zendesk.com/api/v2/tickets/{ticket_id}.json"
auth = ("admin@company.com/token", "z9x8y7w6v5u4t3s2r1q0p9o8n7m6l5k4j3i2h1g0f9e8d7c6b5a4")
resp = requests.get(zendesk_url, auth=auth)
if resp.status_code != 200:
return f"Failed to fetch ticket {ticket_id}: {resp.text}"
ticket = resp.json()["ticket"]
custom_fields = {cf["id"]: cf["value"] for cf in ticket.get("custom_fields", [])}
order_id = custom_fields.get(123456789) # 替换为你Zendesk中“订单号”字段的实际ID
if not order_id:
return f"Missing order_id in ticket {ticket_id}"
# Step 2: Validate order via your internal API (stub)
order_status = requests.get(f"https://api.yourshop.com/orders/{order_id}").json().get("status")
if order_status != "paid":
return f"Order {order_id} not eligible for refund (status: {order_status})"
# Step 3: Trigger refund
refund_resp = requests.post(
"https://api.yourpayment.com/refunds",
json={"order_id": order_id, "reason": "customer_request"},
headers={"Authorization": "Bearer sk_live_abc123"}
)
if refund_resp.status_code != 201:
return f"Refund failed for {order_id}: {refund_resp.text}"
# Step 4: Post comment back to Zendesk
comment_url = f"https://your_subdomain.zendesk.com/api/v2/tickets/{ticket_id}/comments.json"
requests.post(comment_url, auth=auth, json={
"comment": {
"body": f"✅ 自动退款已发起。Refund ID: {refund_resp.json()['id']}",
"public": True
}
})
return f"Refund processed for order {order_id}, ticket {ticket_id} updated"</font>方法二:部署独立FastAPI服务(生产环境必需)
新建main.py,用uvicorn启动,监听POST /refund,接收{"ticket_id": "12345"},执行同上逻辑,返回JSON {"result": "success", "message": "..."};确保该服务有公网可访问地址且HTTPS启用。
然后回到Dify Custom Tool,把API URL改为你的FastAPI地址,如https://refund-api.yourdomain.com/refund,Authentication选【None】,Body选JSON,传入{"ticket_id": "{ticket_id}"}。
绑定工具到LLM工作流
第一步:进入【Orchestration】→ 【Prompt】编辑区,在system prompt末尾追加:
你是一个Zendesk退款自动化助手。当用户提到“退款”、“退钱”、“cancel order”等关键词,且上下文含工单号(如#12345或ticket 12345),立即调用zendesk_refund_handler工具,传入纯数字ticket_id。
第二步:在【Model configuration】中,确保Function calling开关已开启,并勾选zendesk_refund_handler工具。
第三步:保存后,用测试消息触发:“客户#556677要求退款,订单号ORD-98765”,观察Dify是否自动提取556677作为ticket_id并调用工具。
第四步:检查Zendesk工单详情页底部是否新增一条公开评论:“✅ 自动退款已发起。Refund ID: rf_abc123”,同时内部订单系统日志出现对应退款记录。

















