PayPal не отправляет веб-хуки, даже если они отображаются как «отправленные» - PullRequest
0 голосов
/ 06 мая 2019

Я настраиваю поток подписки / регулярных платежей с помощью API PayPal PHP.Пока что в песочнице все работает нормально, кроме одной вещи - веб-крючков.Кажется, я никогда их не получаю, хотя события веб-крюка отображаются как «отправленные» в Интернете.

Я проверил события веб-крюка и URL-адрес веб-крючка в них («передач» -> «веб-крючок_url»)верно.Если я получаю доступ к этому URL в моем браузере, регистратор, который я настроил в коде, регистрирует это правильно.Однако, когда PayPal сообщает, что отправил веб-крючок, я не вижу что-либо в журналах (опять же, несмотря на то, что он успешно отправил веб-крючок в консоли разработчика).

Вот одно из событий webhook, которое, по словам PayPal, было отправлено:

{
    "id": "WH-snip-",
    "create_time": "2019-05-06T15:33:38.143Z",
    "resource_type": "sale",
    "event_type": "PAYMENT.SALE.COMPLETED",
    "summary": "Payment completed for EUR 9.99 EUR",
    "resource": {
        "billing_agreement_id": "I-snip-",
        "amount": {
            "total": "9.99",
            "currency": "EUR",
            "details": {
                "subtotal": "9.99"
            }
        },
        "payment_mode": "INSTANT_TRANSFER",
        "update_time": "2019-05-06T15:33:16Z",
        "create_time": "2019-05-06T15:33:16Z",
        "protection_eligibility_type": "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE",
        "transaction_fee": {
            "value": "0.54",
            "currency": "EUR"
        },
        "protection_eligibility": "ELIGIBLE",
        "links": [
            {
                "href": "https://api.sandbox.paypal.com/v1/payments/sale/-snip-",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "https://api.sandbox.paypal.com/v1/payments/sale/-snip-/refund",
                "rel": "refund",
                "method": "POST"
            }
        ],
        "id": "-snip-",
        "state": "completed",
        "invoice_number": ""
    },
    "status": "SUCCESS",
    "transmissions": [
        {
            "webhook_url": "-snip- (the URL is 100% correct)",
            "response_headers": {
                "Transfer-Encoding": "chunked",
                "Server": "nginx/1.10.3",
                "Connection": "keep-alive",
                "Date": "Mon, 06 May 2019 15:37:38 GMT",
                "Content-Type": "text/html; charset=UTF-8"
            },
            "transmission_id": "-snip-",
            "status": "SUCCESS",
            "timestamp": "2019-05-06T15:37:25Z"
        }
    ],
    "links": [
        {
            "href": "https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-snip-",
            "rel": "self",
            "method": "GET",
            "encType": "application/json"
        },
        {
            "href": "https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-snip-/resend",
            "rel": "resend",
            "method": "POST",
            "encType": "application/json"
        }
    ],
    "event_version": "1.0"
}

И первые несколько строк кода в реальном скрипте webhook (хотя это не должно иметь значения, я думаю, так как я регистрируюсьс самого начала, поэтому он должен по крайней мере регистрировать что-то , когда PayPal отправляет веб-крючок):

<?php
    require_once('../../vendor/autoload.php');
    include_once('../../includes/config.php');

    use \PayPal\Api\VerifyWebhookSignature;
    use \PayPal\Api\WebhookEvent;

    $ip = $_SERVER["REMOTE_ADDR"];
    $filename = __FILE__;
    $logger = new Katzgrau\KLogger\Logger('../../logs/', Psr\Log\LogLevel::DEBUG, array (
        'logFormat' => '[{date}] ['.$ip.'] [{level}] ['.$filename.'] {message}',
        'prefix' => 'log_internal_'
    ));

    $requestBody = file_get_contents('php://input');

    if($requestBody) $logger->info("Session initiated with php://input data.", $requestBody);
    else{
        $logger->warning("Session initiated WITHOUT php://input data even though php://input data was expected.");
        $logger->info("Session aborting.");
        exit();
    }

    $apiContext = new \PayPal\Rest\ApiContext(
      new \PayPal\Auth\OAuthTokenCredential(
        $ppClientId,     // ClientID
        $ppClientSecret  // ClientSecret
      )
    );

    $headers = getallheaders();
    $headers = array_change_key_case($headers, CASE_UPPER);

    $signatureVerification = new VerifyWebhookSignature();
    $signatureVerification->setAuthAlgo($headers['PAYPAL-AUTH-ALGO']);
    $signatureVerification->setTransmissionId($headers['PAYPAL-TRANSMISSION-ID']);
    $signatureVerification->setCertUrl($headers['PAYPAL-CERT-URL']);
    $signatureVerification->setWebhookId("-snip-"); //TODO: Note that the Webhook ID must be a currently valid Webhook that you created with your client ID/secret.
    $signatureVerification->setTransmissionSig($headers['PAYPAL-TRANSMISSION-SIG']);
    $signatureVerification->setTransmissionTime($headers['PAYPAL-TRANSMISSION-TIME']);

    $signatureVerification->setRequestBody($requestBody);
    $request = clone $signatureVerification;

    try {
        /** @var \PayPal\Api\VerifyWebhookSignatureResponse $output */
        $output = $signatureVerification->post($apiContext);
    } catch (Exception $ex) {
        //Error
    }

    $verificationStatus = $output->getVerificationStatus();
    $responseArray = json_decode($request->toJSON(), true);

    $event = $responseArray['webhook_event']['resource']['event_type'];

    $outputArray = json_decode($output->toJSON(), true);
...