Gocardless не выполняет программу после разбора веб-хука

Я внедряю gocardless api на свой сайт. Я застрял в вебхуке. Когда я отправляю веб-хук из тестовой среды песочницы на свой веб-сайт, он показывает ответ 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;
    }
}

Я пытался выполнить какой-то запрос к базе данных, все равно ничего не работает. Может ли кто-нибудь указать мне, что и где я делаю неправильно?


person Alauddin Ahmed    schedule 11.01.2019    source источник


Ответы (3)


 $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...
        //
        }
}

используйте электронную почту, отправляя код для отладки, когда вызывается веб-перехватчик, электронная почта отправляется на ваш адрес с телом ответа, после чего вы будете получать данные в теле электронной почты. Надеюсь, вы понимаете

person Saqib Khan    schedule 11.01.2019
comment
Я следую официальной документации. Ваш подход устарел, можете взглянуть на документацию? вот ссылка... разработчик. gocardless.com/getting-started/api/ - person Alauddin Ahmed; 11.01.2019

Лучший способ обработки веб-перехватчиков с помощью 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 проверит подпись вебхука и ваш сохраненный секрет.

Затем на своем контроллере вы можете обрабатывать события, поступающие от веб-перехватчика (помните, что 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.

Nestednet/Gocardless-laravel

person Eudald Arranz    schedule 05.03.2019

Получил решение. У меня возникла проблема при получении значений заголовков. В laravel вы не можете получить значение заголовка, используя $headers = getallheaders();. Вам нужно использовать use Request;, а затем Request::header("Webhook-Signature");, что затем решило мою проблему.

person Alauddin Ahmed    schedule 11.01.2019