尝试使用 twilio Api phpSDK 发送消息时出现致命错误

Posted

技术标签:

【中文标题】尝试使用 twilio Api phpSDK 发送消息时出现致命错误【英文标题】:fatal error while trying to send message using twilio Api phpSDK 【发布时间】:2017-04-20 17:53:12 【问题描述】:

当我使用 twilio 时出现以下错误:

php 可捕获的致命错误:参数 2 传递给 Twilio\Rest\Api\V2010\Account\MessageInstance::__construct() 必须是 类型数组,给定null,调用 /data/home/changliang/twilio/twilio-php-master/Twilio/Rest/Api/V2010/Account/MessageList.php 在第 69 行并在 /data/home/changliang/twilio/twilio-php-master/Twilio/Rest/Api/V2010/Account/MessageInstance.php 第 52 行

这是我的代码。

require_once("/twilio/twilio-php-master/Twilio/autoload.php");
use Twilio\Rest\Client;
$to = '+12022022022'
$content = 'hello';
$sid = 'XXXXXXX'; 
$token = 'XXXXXXXX'; 
$client = new Client($sid, $token);
$sms = $client->account->messages->create(  
    $to,
    array(
        'from' => '+12346788xx',
        'body' => $content,
    )  
);

【问题讨论】:

【参考方案1】:

有同样的错误。您的请求是否可能通过公司代理服务器发出?这就是这里的问题。此处的代理服务器在响应头中添加了一个额外的 HTTP 头,因此 CurlClient 无法正确解析响应正文:

HTTP/1.1 200 连接建立

我通过在第 37 行附近的 CurlClient 类中添加一个额外的标题来修复它:

原文:

list($head, $body) = ($parts[0] == 'HTTP/1.1 100 Continue')
                           ? array($parts[1], $parts[2])
                           : array($parts[0], $parts[1]);

新:

list($head, $body) = ($parts[0] == 'HTTP/1.1 100 Continue'
                   || $parts[0] == 'HTTP/1.1 200 Connection established')
                           ? array($parts[1], $parts[2])
                           : array($parts[0], $parts[1]);

【讨论】:

工作没有任何问题。 curl客户端放在目录:twilio_outbound_phone_call/twilio-php-master/Twilio/Http【参考方案2】:

Bastian 的修复对我有用,但看起来 sdk 可能在他回复后发生了一些变化。对我来说,它最初看起来像:

list($head, $body) = (
    \preg_match('/\AHTTP\/1.\d 100 Continue\Z/', $parts[0])
    || \preg_match('/\AHTTP\/1.\d 200 Connection established\Z/', $parts[0])
    || \preg_match('/\AHTTP\/1.\d 200 Tunnel established\Z/', $parts[0])
)           ? array($parts[1], $parts[2])
            : array($parts[0], $parts[1]);

我的代理返回的标题是:

HTTP/1.1 200 OK
Connection: Keep-Alive

对我来说,解决方法是添加一个正则表达式来捕获基本上 200 个标头响应:

list($head, $body) = (
    \preg_match('/\AHTTP\/1.\d 100 Continue\Z/', $parts[0])
    || \preg_match('/\AHTTP\/1.\d 200 Connection established\Z/', $parts[0])
    || \preg_match('/\AHTTP\/1.\d 200 Tunnel established\Z/', $parts[0])
    || \preg_match('/\AHTTP\/1.\d 200 .*/', $parts[0])
)           ? array($parts[1], $parts[2])
            : array($parts[0], $parts[1]);

【讨论】:

以上是关于尝试使用 twilio Api phpSDK 发送消息时出现致命错误的主要内容,如果未能解决你的问题,请参考以下文章

限制使用 twilio whatsapp API 发送消息

php 使用Twilio API发送短信通知

使用 Twilio 发送的 vCard 未在 iOS 中正确呈现

使用Twilio Notify API无法触发批量短信。

使用Twilio SMS API,我可以在一个帖子中指定多个目标手机吗?

如何使用 twilio 从 MS Access 发送消息?