Twilio <Pay> verb 导致通话断开和 Schema 警告
支付小周
结论
<Pay> 并不是默认可用的普通 TWiML verb。出现 Schema 警告并导致通话断开,通常有两个原因:当前 Twilio 项目尚未启用 PCI Mode,或 <Pay> 没有直接放在 <Response> 下。
如果 Twilio 无法识别或执行返回的 TWiML,就会终止当前指令流程。正在执行的 <Dial> 被重定向后,原有桥接也会随之结束,所以客户端看到的现象就是通话断开。
正确配置方式
使用 <Pay> 前,请检查以下配置:
- 在对应的 Twilio Project 中启用 PCI Mode。
- 在 Twilio Console 中创建并配置受支持的 Payment Connector。
- 确认接口返回有效的 XML,并设置正确的响应类型:
Content-Type: text/xml
- 将
<Pay>直接放在<Response>下,不要嵌套在<Dial>、<Gather>等 verb 中。 - 更新通话时,确认使用的是需要执行
<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>的actionURL 是否可以公开访问,并能返回合法的 TWiML;- 当前地区和账户类型是否支持在 Twilio Client/WebRTC 呼叫中使用
<Pay>。支持范围可能调整,请以当前 Twilio<Pay>文档和账户控制台中的信息为准。
备注:内容仅供参考。
