Я пытаюсь настроить регулярные платежи с помощью Payum Bundle в Symfony. Должна существовать возможность для нескольких повторяющихся платежей в одном заказе и, судя по панели мониторинга Sandp в 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 для каждого элемента, который является бессмысленным. Есть ли способ дублировать токен для каждого предмета или что вы предлагаете?