PAYATHON 2026

Twilio <Pay> verb 导致通话断开和 Schema 警告

支付小周

结论

<Pay> 并不是默认可用的普通 TWiML verb。出现 Schema 警告并导致通话断开,通常有两个原因:当前 Twilio 项目尚未启用 PCI Mode,或 <Pay> 没有直接放在 <Response> 下。

如果 Twilio 无法识别或执行返回的 TWiML,就会终止当前指令流程。正在执行的 <Dial> 被重定向后,原有桥接也会随之结束,所以客户端看到的现象就是通话断开。

正确配置方式

使用 <Pay> 前,请检查以下配置:

  1. 在对应的 Twilio Project 中启用 PCI Mode。
  2. 在 Twilio Console 中创建并配置受支持的 Payment Connector。
  3. 确认接口返回有效的 XML,并设置正确的响应类型:
Content-Type: text/xml
  1. 将 <Pay> 直接放在 <Response> 下,不要嵌套在 <Dial>、<Gather> 等 verb 中。
  2. 更新通话时,确认使用的是需要执行 <Pay> 的 Call SID。<Dial> 会生成不同的呼叫 leg。如果更新父呼叫,当前 <Dial> 流程及其桥接会结束。

TWiML 示例

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Pay
        paymentConnector="My_Payment_Connector"
        chargeAmount="10.00"
        currency="usd"
        action="https://example.com/payment/result"
        method="POST" />
</Response>

paymentConnector 必须与 Twilio Console 中配置的 Connector 名称完全一致。必填属性还会因 Connector 和交易类型而异,请勿直接照搬示例值。

处理结果的接口可以根据 Twilio 返回的支付状态决定下一步流程,例如:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say>Payment processing is complete.</Say>
</Response>

为什么会出现 Schema 警告

如果看到下面这类提示:

Invalid content was found starting with element 'Pay'. One of '{Play...

说明 Twilio 不允许在当前位置使用 <Pay>,或者无法识别它。常见原因有:

  • 项目没有启用 PCI Mode;
  • <Pay> 被放在了不允许包含它的另一个 verb 中;
  • 实际响应并非预期的 XML,例如模板输出错误或标签被转义;
  • 使用了错误的 Account、Subaccount 或 Project,当前呼叫所属项目中没有相应的 PCI Mode 和 Connector 配置。

Debugger 中的 One of '{Play... 只是 XML Schema 校验器列出的合法元素被截断了,并不是提示你将 <Pay> 改成 <Play>。

通话更新时的注意事项

通过 REST API 更新正在进行的 Call,会让该呼叫停止执行当前 TWiML,转到新的 URL,或直接执行新的 TwiML。原先的 <Dial> 会因此中止,桥接的另一条呼叫 leg 也可能被挂断。

如果已经启用 PCI Mode、配置 Connector,并修正了 TWiML 层级,但通话仍然断开,请重点检查:

  • 更新的是父 Call SID,还是 <Dial> 创建的子 Call SID;
  • Debugger 中是否出现了新的 TWiML 或应用错误;
  • <Pay> 的 action URL 是否可以公开访问,并能返回合法的 TWiML;
  • 当前地区和账户类型是否支持在 Twilio Client/WebRTC 呼叫中使用 <Pay>。支持范围可能调整,请以当前 Twilio <Pay> 文档和账户控制台中的信息为准。

备注:内容仅供参考。