Twilio 发送回复未命中提供 URL
Twilio Send reply not hitting provided URL
我已经根据文档配置了 Twilio phone 号码并进行了设置。在回调中 URL 我写了这样的代码
Route::post('/replyMessages', function(){
Log::info('inside reply messages URL');
$response = new \Twilio\TwiML\MessagingResponse();
Log::info(print_r($response, true));
$message = $response->message("Testing sms from twilio to staffing backbone");
print_r($response);
Log::info('SMS reply URL callback');
});
当用户通过手机回复时,没有任何反应。如果 URL 命中日志,那么它将打印给定但不起作用的文本。请帮助我。
根据 Twilio 中的一份文档,他们需要安装 ngrok 才能调用我们的 URL?文档 link
因为这是一个 POST 请求,我猜 VerifyCsrfToken 中间件正在停止这个请求。
将 'replyMessages' 添加到 app/Http/Middleware/VerifyCsrfToken.php 文件中的 $except
数组,所以它应该像这样结束:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* Indicates whether the XSRF-TOKEN cookie should be set on the response.
*
* @var bool
*/
protected $addHttpCookie = true;
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'replyMessages'
];
}
ngrok
不是明确要求的,只是作为一种让您的本地开发环境可以从网络外部访问的简单方法而被推荐。
如果您的本地开发机器上的代码是 运行,请确保您能够从网络外部的设备查询该端点(例如,从关闭 wifi 的手机 phone ).如果没有,ngrok 将提供帮助。
如果代码已经部署到已经可以公开访问的服务器上,查询它并确保没有错误输出。
原答案(与代码段相关):
尝试将 print_r($response);
换成 echo $response;
。
print_r
将输出 MessagingResponse 对象的结构,而 echo
会将您的 $response 转换为字符串并输出 Twilio 期望的 XML 有效负载。
您当前的有效负载可能如下所示:
Twilio\TwiML\MessagingResponse Object
(
[name:protected] => Response
[attributes:protected] => Array
(
)
[children:protected] => Array
(
[0] => Twilio\TwiML\Messaging\Message Object
(
[name:protected] => Message
[attributes:protected] => Array
(
)
[children:protected] => Array
(
[0] => Testing sms from twilio to staffing backbone
)
)
)
)
=> true
但 Twilio 将需要一个 XML 有效负载,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Response><Message>Testing sms from twilio to staffing backbone</Message></Response>
根据检查,我的配置是正确的,但 Twilio 中存在一些问题。
我们尝试发送回复的初始手机正在记录日志,一切正常,但未触发回调 URL。后来我们尝试用新的手机号码回复它。配置没有任何变化。所以跟进 Twilio 的决议。
感谢大家的帮助。
我已经根据文档配置了 Twilio phone 号码并进行了设置。在回调中 URL 我写了这样的代码
Route::post('/replyMessages', function(){
Log::info('inside reply messages URL');
$response = new \Twilio\TwiML\MessagingResponse();
Log::info(print_r($response, true));
$message = $response->message("Testing sms from twilio to staffing backbone");
print_r($response);
Log::info('SMS reply URL callback');
});
当用户通过手机回复时,没有任何反应。如果 URL 命中日志,那么它将打印给定但不起作用的文本。请帮助我。
根据 Twilio 中的一份文档,他们需要安装 ngrok 才能调用我们的 URL?文档 link
因为这是一个 POST 请求,我猜 VerifyCsrfToken 中间件正在停止这个请求。
将 'replyMessages' 添加到 app/Http/Middleware/VerifyCsrfToken.php 文件中的 $except
数组,所以它应该像这样结束:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* Indicates whether the XSRF-TOKEN cookie should be set on the response.
*
* @var bool
*/
protected $addHttpCookie = true;
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'replyMessages'
];
}
ngrok
不是明确要求的,只是作为一种让您的本地开发环境可以从网络外部访问的简单方法而被推荐。
如果您的本地开发机器上的代码是 运行,请确保您能够从网络外部的设备查询该端点(例如,从关闭 wifi 的手机 phone ).如果没有,ngrok 将提供帮助。
如果代码已经部署到已经可以公开访问的服务器上,查询它并确保没有错误输出。
原答案(与代码段相关):
尝试将 print_r($response);
换成 echo $response;
。
print_r
将输出 MessagingResponse 对象的结构,而 echo
会将您的 $response 转换为字符串并输出 Twilio 期望的 XML 有效负载。
您当前的有效负载可能如下所示:
Twilio\TwiML\MessagingResponse Object
(
[name:protected] => Response
[attributes:protected] => Array
(
)
[children:protected] => Array
(
[0] => Twilio\TwiML\Messaging\Message Object
(
[name:protected] => Message
[attributes:protected] => Array
(
)
[children:protected] => Array
(
[0] => Testing sms from twilio to staffing backbone
)
)
)
)
=> true
但 Twilio 将需要一个 XML 有效负载,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Response><Message>Testing sms from twilio to staffing backbone</Message></Response>
根据检查,我的配置是正确的,但 Twilio 中存在一些问题。
我们尝试发送回复的初始手机正在记录日志,一切正常,但未触发回调 URL。后来我们尝试用新的手机号码回复它。配置没有任何变化。所以跟进 Twilio 的决议。
感谢大家的帮助。