Интеграция платежного шлюза 2checkout с помощью (omnipay payum и symfony)

Я пытаюсь настроить payumbundle с 2checkout и я не могу понять, как настроить config.yml а затем как отправить информацию в 2checkout.

Перед этим я успешно настроил PayPal Express Checkout с Payum, и я немного знаком с Payum (все еще изучаю Payum)

Это то, что я сделал до сих пор

Я установил пакет омчепа 2checkout

composer require "payum/omnipay-bridge" "omnipay/2checkout"

Так как я не могу найти какой-либо пример онлайн для 2checkout, и самый близкий, который я нашел, был для полосы, так что глядя на его пример
Это мой config.yml

payum:
security:
.....
contexts:
paypal:
paypal_express_checkout_nvp:
username: ....
password: ....
signature: ....
sandbox: true

2checkout:
omnipay:
type: TwoCheckout
options:
apiKey: ....
pri: ....
act: ....
testMode: true

Здесь возникает мой первый вопрос

Q1: Как узнать, какую информацию добавить в config.yml для разных шлюзов

Теперь перейдем к коду внутри моего действия, который должен отправлять информацию в 2checkout и добавлять данные в базу данных.

$paymentName = 'TwoCheckout';

$storage = $this->get('payum')->getStorage('ClickTeck\featuresBundle\Entity\Orders');
$paymentDetails = $storage->create();

// insert order into database
$paymentDetails->setClientFname('First');
$paymentDetails->setClientLname('Last');
$paymentDetails->setClientPhone('111-111-111');
$paymentDetails->setClientEmail('xyz@abc.com');
$paymentDetails->setInvoiceId('123');
$paymentDetails->setNumber('456');
$paymentDetails->setDescription('This is description');
$paymentDetails->setCurrencyCode('USD');
$paymentDetails->setTotalAmount('20');
$paymentDetails->setClientId($clientID);
$paymentDetails->setPaymentOption($paymentName);

$storage->update($paymentDetails);$paymentDetails['amount'] = 20;
$paymentDetails["currency"] = 'USD';
$paymentDetails["description"] = "This is description";

$storage->update($paymentDetails);

$captureToken = $this->get('payum.security.token_factory')->createCaptureToken(
$paymentName,
$paymentDetails,
'payment_done' // the route to redirect after capture;
);return $this->redirect($captureToken->getTargetUrl());

Я использую ту же сущность, которую я использовал для PayPal и PayPal Payum добавили данные в details столбец базы данных, но для 2checkout он ничего не добавляет к деталям и выдает ошибку Integrity constraint violation это понятно, потому что детали не должны быть пустыми, вот мой второй вопрос

Q2: Не можем ли мы использовать одну и ту же сущность для разных способов оплаты? Или у каждого способа оплаты должна быть своя сущность? Если мы можем использовать одну и ту же сущность, почему Payum ничего не генерирует для details колонка. Что я тут не так делаю

Я буду очень признателен, если кто-то может помочь мне в этом, мне нужен пример, а не просто объяснение того, как интегрировать 2checkout. Однако объяснение тоже будет оценено.

ОБНОВИТЬ

Это мой обновленный код в моих действиях, который готовит платеж, который добавляется в базу данных очень хорошо, однако транзакция не удалась

$paymentName = 'TwoCheckout';
$storage = $this->get('payum')->getStorage('ClickTeck\featuresBundle\Entity\Orders');
/** @var Orders $details */

$details = $storage->create();

// insert order into database
$details->setClientFname($form->get('client_fname')->getData());
$details->setClientLname($form->get('client_lname')->getData());
$details->setClientPhone($form->get('client_phone')->getData());
$details->setClientEmail($form->get('client_email')->getData());
$details->setInvoiceId('123');
$details->setNumber('456');
$details->setDescription('This is description');

//change currency to dynamic before live
$details->setCurrencyCode('USD');
$details->setTotalAmount($cartTotal.".00");
$details->setClientId($clientID);
$details->setPaymentOption($paymentName);$details["sid"] = '201308888';
$details["cart_order_id"] = '123456';
$details["merchant_order_id"] = '789';
$details["total"] = $cartTotal.".00";

$details["amount"] = $cartTotal.".00";
$details["tco_currency"] = 'USD';
$details['fixed'] = 'Y';
$details['skip_landing'] = 1;
$details['card_holder_name'] = 'Hold Name';
$details['street_address'] = 'Address 1';
$details['street_address2'] = 'Address 2';
$details['city'] = 'City';
$details['state'] = 'State';
$details['zip'] = '08610';
$details['country'] = 'USA';
$details['phone'] = '111-111-111';
$details['email'] = 'dummy@xyz.com';

$details["name"] = 'a name';
$details["description"] = 'a description';
$details['card'] = new SensitiveValue(array(
'number' => $form->get('cardNumber')->getData(),
'cvv' => $form->get('cvv')->getData(),
'expiryMonth' => $form->get('expiryMonth')->getData(),
'expiryYear' => $form->get('expiryYear')->getData(),
'firstName' => $form->get('client_fname')->getData(),
));

$storage->update($details);
$captureToken = $this->get('payum.security.token_factory')->createCaptureToken(
$paymentName,
$details,
'payment_done' // the route to redirect after capture;
);
$details["returnUrl"] = $captureToken->getTargetUrl();
//return $this->redirect($captureToken->getTargetUrl());
return $this->forward('PayumBundle:Capture:do', array(
'payum_token' => $captureToken,
));

Это ответ, который я вижу, я не могу понять, почему это не удается

{"status":"failed","order":{"total_amount":500,"currency_code":"USD","details":{"sid":"201308888","cart_order_id":"123456","merchant_order_id":"789","total":"500.00","amount":"500.00","tco_currency":"USD","fixed":"Y","skip_landing":1,"card_holder_name":"Hold Name","street_address":"Address 1","street_address2":"Address 2","city":"city","state":"State","zip":"08610","country":"USA","phone":"111-111-111","email":"dummy@xyz.com","name":"a name","description":"a description","card":[],"returnUrl":"http:\/\/127.0.0.1:8000\/payment\/capture\/mjIo0HsxKQ1-DRISYUZ6fMZLUmOXD0-cPiOheqRqpH8","clientIp":"127.0.0.1","_reference":null,"_status":"failed","_status_code":null,"_status_message":null}}}

2

Решение

Q1: Как узнать, какую информацию добавить в config.yml для разных шлюзов

Платежная фабрика Payum предоставляет информацию о возможных вариантах. Его значения по умолчанию и необходимые значения. Вы должны вызвать $ factory-> createConfig () и искать payum.required_options а также payum.default_options (пример). В PayumBundle все еще проще. Пакет предоставляет фабрики, которые расширяют конфигурацию контейнера с возможными опциями. Таким образом, они будут проверены стандартным средством проверки конфигурации Symfony.

Чтобы выяснить, какие опции вы должны передать в шлюзе Omnipay, вам нужно взглянуть на методы этого шлюза setters \ getters (пример). Например, у шлюза есть метод setTestMode, чтобы настроить его в PayumBundle, вы должны определить параметры testMode, Вот как параметры, преобразованные в вызов сеттера.

2Выход должен быть настроен таким образом.

payum:
contexts:
2checkout:
omnipay:
type: TwoCheckout
options:
accountNumber: ....
secretWord: ....
testMode: true

Q2: Не можем ли мы использовать одну и ту же сущность для разных способов оплаты? Или у каждого способа оплаты должна быть своя сущность? Если мы можем использовать одну и ту же сущность, почему Payum не генерирует ничего для столбца деталей. Что я тут не так делаю

С точки зрения Payum вы можете использовать одну и ту же сущность \ модель для хранения разных платежей. Поскольку я никогда не работал с Omnipay и шлюзом 2Checkout, я не могу здесь больше помочь.

0

Другие решения

Других решений пока нет …