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

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

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

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

Я установил пакет omnipay 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

Тут возникает мой первый вопрос

Вопрос 1. Как узнать, какую информацию добавить в 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('[email protected]');
$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, это понятно, потому что детали не должны быть пустыми, поэтому вот мой второй вопрос

Вопрос 2. Нельзя ли использовать одну и ту же сущность для разных способов оплаты? Или у каждого способа оплаты должна быть своя сущность? Если мы можем использовать одну и ту же сущность, почему 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'] = '[email protected]';

$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":"[email protected]","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}}}

person Baig    schedule 10.02.2015    source источник


Ответы (1)


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

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

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

2Checkout, я думаю, должен быть настроен таким образом.

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

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

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

person Maksim Kotlyar    schedule 11.02.2015
comment
Большое спасибо, что ответили мне, вчера я просмотрел файл геттеров и сеттеров, чтобы узнать, что добавить в config.yml. на будущее, какой простой способ узнать, в каком файле есть геттеры и сеттеры? После правильной настройки config.yml с данными платежа в столбце сведений теперь сохраняются данные, однако данные карты не сохраняются, и я сейчас работаю над этим. Поскольку payum поддерживает Omnipay, знаете ли вы, как передать данные кредитной карты? - person Baig; 11.02.2015
comment
У вас есть идеи, когда мы готовим массив для отправки на шлюз, как быстро узнать, какие параметры должны быть отправлены, например, в этом случае 2checkout? - person Baig; 11.02.2015
comment
данные карты не сохраняются, и я работаю над этим сейчас. - НЕ ДОЛЖЕН БЫТЬ СОХРАНЕН В БАЗЕ ДАННЫХ. Это правильное поведение. вы должны использовать перенаправление symfony вместо перенаправления или запрашивать кредитную карту после того, как вы перенаправили пользователя для захвата действия. - person Maksim Kotlyar; 11.02.2015
comment
да, я не сохраняю их, и я использую переадресацию Symfony. Пожалуйста, взгляните на обновленный вопрос, я добавил более подробную информацию в разделе ОБНОВЛЕНИЕ. - person Baig; 11.02.2015