«Для этого токена уже создано успешное соглашение о выставлении счетов»

Я пытаюсь настроить регулярные платежи с помощью Пакет Payum в Symfony. Должна быть возможность для нескольких повторяющихся платежей в одном порядке и, судя по панели инструментов песочницы Paypal, поскольку PROFILE_START_DATE - это DATE_ATOM, начальные платежи проходят, даже если есть несколько элементов, но когда я смотрю в Phpmyadmin, только одна запись для RecurringPaymentDetails будет "ACK": "Success", а остальные потерпят неудачу с A successful Billing Agreement has already been created for this token.

У меня есть OrderController, который обрабатывает логику, он устанавливает значения объекта, который расширяет ArrayObject

/**
 * @Route("/accounts/order/paypal/completed", name = "order_paypal_completed")
 */
public function orderPaypalCompletedAction(Request $request)
{
    $token = $this->get('payum')->getHttpRequestVerifier()->verify($request);

    $identity = $token->getDetails();
    $payment = $this->get('payum')->getStorage($identity->getClass())->find($identity);

    $gateway = $this->get('payum')->getGateway($token->getGatewayName());
    $gateway->execute($status = new GetHumanStatus($token));

    $order = $payment->getOrder();

    if ($status->isCaptured() || $status->isAuthorized()) {
        $order->setStatus(Order::STATUS_COMPLETED);

        $agreement = $status->getModel();
        $storage = $this->get('payum')->getStorage(RecurringPaymentDetails::class);
        $payments = [];
        foreach ($order->getItems() as $item) {
          $payment = $storage->create();
          $payment['TOKEN'] = $agreement['TOKEN'];
          $payment['DESC'] = $agreement['L_BILLINGAGREEMENTDESCRIPTION0'];
          $payment['EMAIL'] = $agreement['EMAIL'];
          $payment['AMT'] = $item->getPrice();
          $payment['CURRENCYCODE'] = $order->getCurrency();
          $payment['BILLINGFREQUENCY'] = $item->getDuration();
          $payment['PROFILESTARTDATE'] = date(DATE_ATOM);
          $payment['BILLINGPERIOD'] = Api::BILLINGPERIOD_DAY;

          $payments[] = $payment;
        }
        $this->addFlash('success', $this->get('translator')->trans('Payment has been successful.'));
    }

    if ($status->isPending()) {
        $this->addFlash('danger', $this->get('translator')->trans('Payment has been canceled.'));
    }

    if ($status->isFailed() || $status->isCanceled()) {
        $order->setStatus(Order::STATUS_CANCELED);
        $this->addFlash('danger', $this->get('translator')->trans('Payment has been canceled.'));
    }
    foreach ($payments as $payment) {
      $gateway->execute(new CreateRecurringPaymentProfile($payment));
      $gateway->execute(new Sync($payment));
      $recurringPaymentStatus = new GetHumanStatus($payment);
      $gateway->execute($recurringPaymentStatus);
    }

    try {
        $em = $this->getDoctrine()->getManager();
        $em->persist($order);
        $em->flush();
    } catch (\Exception $e) {
        $this->addFlash('danger', $this->get('translator')->trans('An error occurred when saving object.'));
    }
    return $this->redirectToRoute('homepage');
}

При этом я чувствую, что если из PayPal может быть возвращен только один токен, мне придется перенаправлять их обратно в Paypal для каждого элемента, что является ерундой. Есть ли способ продублировать жетон для каждого предмета или что вы предлагаете?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
242
1

Ответы 1

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

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

Другие вопросы по теме