Я настраиваю поток подписки / регулярных платежей с помощью 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);