我正在我的网站上实现gocardless api。我陷入了webhook。当我从沙盒测试环境向我的网站发送webhook时,它显示200响应,但之后没有代码正在执行。而且我没有在响应体中看到任何东西,它显示为null。
我正在使用laravel 5.7。这是我的代码
route.php Route :: post('/ webhook','HomeController @ webhook');
HomeController.php
public function webhook()
{
$webhook_endpoint_secret = env("GOCARDLESS_WEBHOOK_ENDPOINT_SECRET");
$request_body = file_get_contents('php://input');
$headers = getallheaders();
$signature_header = $headers["Webhook-Signature"];
try {
$events = Webhook::parse($request_body, $signature_header, $webhook_endpoint_secret);
foreach ($events as $event) {
print("Processing event " . $event->id . "\n");
switch ($event->resource_type) {
case "mandates":
$this->process_mandate_event($event);
break;
default:
print("Don't know how to process an event with resource_type " . $event->resource_type . "\n");
break;
}
}
header("HTTP/1.1 204 OK");
} catch(InvalidSignatureException $e) {
header("HTTP/1.1 498 Invalid Token");
}
}
public function process_mandate_event($event)
{
switch ($event->action) {
case "cancelled":
print("Mandate " . $event->links["mandate"] . " has been cancelled!\n");
break;
default:
print("Don't know how to process a mandate " . $event->action . " event\n");
break;
}
}
我试图执行一些数据库查询,无论如何都没有工作。任何人都可以指出我做错了什么和哪里?
$responseBody = file_get_contents('php://input');
if ($responseBody <> "") {
$response_new = json_decode($responseBody, true);
foreach ($response_new["events"] as $event) {
print_r($event); // you will see all the data which you want
//if($event['resource_type'] == 'subscriptions')
//payments,mandates or etc...
//
}
}
使用电子邮件发送代码进行调试,当webhook被调用时,电子邮件发送到您的地址与响应正文,然后您将在电子邮件正文中的数据。希望你能理解
使用Laravel处理webhook的最佳方法是它的结构是添加一个中间件来验证webhook签名:
public function handle($request, Closure $next)
{
$signature = $request->header('Webhook-Signature');
if (!$signature) {
throw WebhookFailed::missingSignature();
}
if (!$this->isValid($signature, $request->getContent(), $request->route('configKey'))) {
throw WebhookFailed::invalidSignature($signature);
}
return $next($request);
}
isValid
方法将检查webhook的签名和您保存的秘密。
然后在您的控制器上,您可以处理来自webhook的事件(请记住,Gocardless可以在单个webhook请求中发送多个事件)。
public function __invoke(Request $request)
{
$payload = $request->input();
foreach ($payload['events'] as $event) {
// Do whatever do you need with the events.
}
}
return response()->json(['message' => 'ok']);
}
我们为Laravel创建了一个包,可以帮助您处理和处理Gocardless webhooks。
得到了解决方案。我在获取标头值时遇到了问题。在laravel你不能使用$headers = getallheaders();
得到标题值你需要使用use Request;
然后Request::header("Webhook-Signature");
然后解决了我的问题。