Gocardless не выполняет программу после разбора webhook
Я внедряю API без gocard на моем сайте. Я застрял в webhook. Когда я отправляю веб-крючок из тестовой среды песочницы на мой веб-сайт, он показывает 200 ответов, но после этого код не выполняется. а также я не вижу ничего в теле ответа, оно показывает ноль.
Для этого я использую 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;
}
}
Я пытался выполнить какой-то запрос к базе данных, все равно ничего не работает. Может кто-нибудь указать мне, что и где я делаю неправильно?
2 ответа
$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 и его структура - добавить промежуточное программное обеспечение для проверки подписи веб-крючка:
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 и ваш сохраненный секрет.
Затем на вашем контроллере вы можете обрабатывать события, поступающие из веб-крючка (помните, что Gocardless может отправлять более одного события в одном запросе веб-крючка).
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");
который тогда решил мою проблему.