Я не получаю уведомления PayPal о платежах
Я успешно настроил Payum для своего приложения Symfony, я создал подписку с регулярным платежом каждый день.
На моем заявлении я никогда не получал ни одного запроса от PayPal на payum_notify_do
URL, на который хорошо ссылается моя сущность соглашения о выплате вознаграждения.
На учетной записи валидатора в песочнице PayPal я вижу, что со дня подписки я получаю платежи каждый день.
Почему я никогда не получаю уведомления о выплатах? Приложение Symfony и Payum ошибочно полагают, что пользователь никогда не платил.
Какая конфигурация фактически требуется Payum для получения уведомлений от Paypal?
Мой рабочий процесс:
- Представить детали подписки, с формой для отправки
- Когда форма отправлена:
- создать сущность Соглашения с информацией о подписке
- создать из него токен захвата
- перенаправить на токен URL (PayPal)
- Вернувшись из PayPal, я проверяю, что соглашение фиксируется
- Я создаю сущность "Регулярный платеж"
- Я перенаправляю на страницу с подробными сведениями о подписке (на которой отображаются такие сообщения, как благодарность и сведения о подписке)
Сущность Подробности соглашения, созданная на шаге 2.1, содержит следующие данные JSON:
{
"L_BILLINGAGREEMENTDESCRIPTION0": "blah blah blah",
"PAYMENTREQUEST_0_AMT": "0.00",
"L_BILLINGTYPE0": "RecurringPayments",
"NOSHIPPING": 1,
"PAYMENTREQUEST_0_PAYMENTACTION": "Sale",
"AUTHORIZE_TOKEN_USERACTION": "commit",
"RETURNURL": "https://hostname.tld/payum/capture/AAAAA-BBBBB",
"CANCELURL": "https://hostname.tld/payum/capture/AAAAA-BBBBB?cancelled=1",
"PAYMENTREQUEST_0_NOTIFYURL": "https://hostname.tld/payum/notifier/AAAAAA-BBBBB",
"TOKEN": "EC-NNNNNN",
"TIMESTAMP": "2017-11-20T13:48:58Z",
"CORRELATIONID": "ZZZZZZ",
"ACK": "Success",
"VERSION": "65.1",
"BUILD": "40680762",
"BILLINGAGREEMENTACCEPTEDSTATUS": "1",
"CHECKOUTSTATUS": "PaymentActionNotInitiated",
"CURRENCYCODE": "USD",
"AMT": "0.00",
"SHIPPINGAMT": "0.00",
"HANDLINGAMT": "0.00",
"TAXAMT": "0.00",
"NOTIFYURL": "https://hostname.tld/payum/notifier/XXX-ZZZ",
"INSURANCEAMT": "0.00",
"SHIPDISCAMT": "0.00",
"PAYMENTREQUEST_0_CURRENCYCODE": "USD",
"PAYMENTREQUEST_0_SHIPPINGAMT": "0.00",
"PAYMENTREQUEST_0_HANDLINGAMT": "0.00",
"PAYMENTREQUEST_0_TAXAMT": "0.00",
"PAYMENTREQUEST_0_INSURANCEAMT": "0.00",
"PAYMENTREQUEST_0_SHIPDISCAMT": "0.00",
"PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED": "false",
"PAYMENTREQUESTINFO_0_ERRORCODE": "0",
"EMAIL": "XXX-buyer@YYY.com",
"PAYERID": "XXX",
"PAYERSTATUS": "verified",
"FIRSTNAME": "test",
"LASTNAME": "buyer",
"COUNTRYCODE": "FR"
}
Журналы сервера показывают, что URL для захвата был хорошо запрошен с помощью реферера из sandbox.paypal.com, так что все прошло хорошо.
У меня нет ни одного случая, когда URL-адрес уведомления вызывался PayPal, несмотря на то, что я ждал несколько недель и подтвердил, что на стороне PayPal деньги были собраны (я, как 400 евро за 7 евро / день).
Я подтвердил, что URL-адрес уведомления работает, если я открываю его в браузере.
Сумма деталей соглашения действительно равна нулю, но я полагаю, что это именно то, что ожидается от подписки: ноль при оплате, затем еще одно соглашение с фактической подпиской.
Вот фактические реквизиты платежа, созданные на шаге 4 выше:
{
"TOKEN": "EC-NNNNNN",
"DESC": "blah blah blah",
"EMAIL": "XXX-buyer@YYY.com",
"AMT": "6.99",
"CURRENCYCODE": "EUR",
"BILLINGFREQUENCY": "1",
"BILLINGPERIOD": "Day",
"PROFILESTARTDATE": "2017-11-19T23:00:00Z",
"PROFILEID": "I-XXXXX",
"PROFILESTATUS": "ActiveProfile",
"TIMESTAMP": "2017-11-20T13:49:08Z",
"CORRELATIONID": "abcdef0123456789",
"ACK": "Success",
"VERSION": "65.1",
"BUILD": "39206242",
"STATUS": "Active",
"AUTOBILLOUTAMT": "NoAutoBill",
"MAXFAILEDPAYMENTS": "0",
"SUBSCRIBERNAME": "test buyer",
"NEXTBILLINGDATE": "2017-11-20T10:00:00Z",
"NUMCYCLESCOMPLETED": "0",
"NUMCYCLESREMAINING": "0",
"OUTSTANDINGBALANCE": "0.00",
"FAILEDPAYMENTCOUNT": "0",
"TRIALAMTPAID": "0.00",
"REGULARAMTPAID": "0.00",
"AGGREGATEAMT": "0.00",
"AGGREGATEOPTIONALAMT": "0.00",
"FINALPAYMENTDUEDATE": "1970-01-01T00:00:00Z",
"TOTALBILLINGCYCLES": "0",
"SHIPPINGAMT": "0.00",
"TAXAMT": "0.00",
"REGULARBILLINGPERIOD": "Day",
"REGULARBILLINGFREQUENCY": "1",
"REGULARTOTALBILLINGCYCLES": "0",
"REGULARCURRENCYCODE": "EUR",
"REGULARAMT": "6.99",
"REGULARSHIPPINGAMT": "0.00",
"REGULARTAXAMT": "0.00"
}
Так что все выглядит номинально, но у меня нет информации об оплате от PayPal.
Прочитав все это и документы, я заметил, что после регулярного платежа я перенаправил прямо на страницу подписки вместо перенаправления через токен. Я, следовательно, заменил это:
return $this->redirect($this->generateUrl('subscription_show', [
'gatewayName' => $token->getGatewayName(),
'billingAgreementId' => $agreement->getId(),
'recurringPaymentId' => $payment->getId(),
]));
с:
$doneToken = $payum->getTokenFactory()
->createToken('paypal', $payment, 'subscription_show', [
'gatewayName' => $token->getGatewayName(),
'billingAgreementId' => $agreement->getId(),
'recurringPaymentId' => $payment->getId(),
]);
return $this->redirect($doneToken->getTargetUrl());
Посмотрим через несколько дней, работает ли это.
Спустя 48 часов уведомления по-прежнему отсутствуют, несмотря на то, что на ежедневной панели активности PayPal регулярно повторяются платежи.
В журналах я видел, что я дважды заходил в PayPal (на основе ссылок), так один раз после реквизитов платежа и один раз после повторного платежа (который вел прямо на мой сайт без какого-либо пользовательского интерфейса на PayPal, в отличие от первого, который явно попросил подтверждения).
Я не знаю, что я делаю не так.
1 ответ
Я обнаружил, что PayPal не использует URL-адрес уведомления для повторяющихся платежей.
См. Как установить IPN-URL для регулярных платежей PayPal с помощью ExpressCheckout?
Итак, мне нужно было самостоятельно обрабатывать IPN на статическом URL-адресе IPN.
Вот что я сделал для этого:
- добавить зависимость PayPal-IPN
- добавить новый маршрут на моем контроллере, чтобы получать все IPN от PayPal
И тогда, при получении IPN:
- проверить IPN с новой зависимостью
- выполнить
Sync
на регулярный платеж (позвонитGetRecurringPaymentsProfileDetails
Конечная точка API на PayPal) - сохранить обновленную модель в базе данных
- если
txn_type
являетсяrecurring_payment_profile_created
, а затем отправьте электронное письмо с подтверждением покупки клиенту - если
txn_type
являетсяrecurring_payment
, затем создайте счет и отправьте его по электронной почте клиенту - возврат 204