使用(omnipay payum和symfony)集成支付网关2结账


Integrating payment gateway 2checkout using (omnipay payum and symfony)

我正试图用2checkout设置payumbundle,但我似乎不明白如何设置config.yml,然后如何向2checkout发送信息。

在此之前,我已经用Payum成功设置了PayPal快速结账,我对Payum有些熟悉(仍在学习Payum)

这就是我迄今为止所做的

我已经安装了omnipay 2 Checkout捆绑包

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

由于我似乎在网上找不到任何2 checkout的例子,而我找到的最接近的例子是stripe,所以看看它的例子这是我的配置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列中添加了数据,但对于2检查,它没有添加任何详细信息,并给出了一个错误Integrity constraint violation,这是可以理解的,因为详细信息不应该为空,所以这是我的第二个问题

Q2:我们是否可以将同一实体用于不同的支付方式?或者每种支付方式都应该有自己的实体?如果我们可以使用相同的实体,那么为什么payum不会为details列生成任何内容。我做错了什么

如果有人能在这方面帮助我,我将不胜感激。我需要看到一个例子,而不仅仅是关于如何集成2 Checkout的解释。不过,我们也将感谢您的解释。

更新

这是我在操作中更新的代码,准备将其添加到数据库中的付款,但交易失败

$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}}}

Q1:我如何知道在config.yml中为不同的网关添加哪些信息

Payum的支付工厂提供有关可能选项的信息。它的默认值和必需值。您必须调用$factory->createConfig()并查找payum.required_optionspayum.default_options(示例)。在PayumBundle中,事情更加简单。该捆绑包为扩展容器配置的工厂提供了可能的选项。因此,它们将由Symfony的标准配置验证器进行验证。

要了解您必须在Omnipay网关中传递哪些选项,您必须查看网关setters''getters方法(示例)。例如,网关具有方法setTestMode,要在PayumBundle中配置它,您必须定义一个选项testMode。这就是选项转换为setter调用的方式。

2我想必须这样配置Checkout。

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

Q2:我们是否可以使用相同的实体来进行不同的支付方式?或者每种支付方式都应该有自己的实体?如果我们可以使用相同的实体,那么为什么payum不会为details列生成任何内容。我在这里做错了什么

从Payum的角度来看,您可以使用相同的实体''模型来存储不同的付款。由于我从未使用过Omnipay和2Checkout网关,因此我无法在这里提供更多帮助。