PayPal не уведомляет меня о платежах

Я успешно настроил Payum для своего приложения Symfony, я создал подписку с регулярным платежом каждый день.

В моем приложении я никогда не получал ни одного запроса от PayPal по URL-адресу payum_notify_do, который хорошо указан в моем объекте сведений о соглашении о выплатах.

В учетной записи валидатора песочницы PayPal я вижу, что с момента подписки я получал платеж каждый день.

Почему я никогда не получаю уведомления о выплатах? Приложение Symfony и Payum ошибочно полагают, что пользователь никогда не платил.

Какая конфигурация действительно требуется Payum для получения уведомлений от Paypal?

Мой рабочий процесс:

  1. Предоставьте сведения о подписке с формой для отправки
  2. When form is submitted:
    1. create an Agreement Detail entity with the subscription information
    2. создать из него токен захвата
    3. перенаправление на URL-адрес токена (PayPal)
  3. Вернувшись из PayPal, я проверяю, что соглашение зафиксировано
  4. Я создаю объект "Подробности повторяющегося платежа"
  5. Я перенаправляю на страницу подробных сведений о подписке (на которой отображается сообщение с благодарностью и сведения о подписке)

Сущность сведений о соглашении, созданная на шаге 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": "[email protected]",
  "PAYERID": "XXX",
  "PAYERSTATUS": "verified",
  "FIRSTNAME": "test",
  "LASTNAME": "buyer",
  "COUNTRYCODE": "FR"
}

Журналы сервера показывают, что URL захвата был хорошо запрошен с помощью реферера с sandbox.paypal.com, так что все прошло хорошо.

У меня не было случаев, когда PayPal вызывал URL-адрес уведомления, несмотря на то, что я ждал несколько недель и подтвердил, что на стороне PayPal деньги были собраны (у меня есть примерно 400 евро, собранные из 7 евро в день).

Я подтвердил, что URL-адрес уведомления работает, если я открываю его в браузере.

Количество деталей соглашения действительно равно нулю, но я считаю, что это то, что ожидается от подписки: ноль при оплате, затем еще одно соглашение с фактической подпиской.
Вот фактическая информация о регулярных платежах, созданная на шаге 4 выше:

{
  "TOKEN": "EC-NNNNNN",
  "DESC": "blah blah blah",
  "EMAIL": "[email protected]",
  "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, в отличие от первого, который явно попросил подтверждения).

Я не знаю, что делаю не так.


person Benoit Duffez    schedule 20.01.2018    source источник


Ответы (1)


Я выяснил, что PayPal не использует URL-адрес уведомления для повторяющихся платежей.

См .: Как установить URL-адрес IPN для повторяющихся платежей 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
person Benoit Duffez    schedule 01.02.2018