2016-10-23 6 views
2

Я новичок в Magento, и я реализую собственный способ оплаты в magento2.1, но я полностью потерян. Необходимый поток информации следующим образом:redirect payment gateway magento2

  1. Клиент идет к кассе и поступает всю информацию и идет к методу оплаты, где он будет выбирать свой собственный метод и нажмите кнопку «Оформить заказ».

  2. После нажатия кнопки я должен зафиксировать информацию о заказе, продуктах, размере, адресе доставки и добавить другую информацию, например («подпись» - хеш для проверки, «urlResponse» и «urlConfirmation» и некоторые другие), а затем мне нужно отправить эти параметры в запрос «Отправить» на URL-адрес поставщика шлюза. Мне не нужно делать какие-либо проверки, просто хватайте данные, добавляйте еще и отправляйте их.

После прочтения учебников Макса Пронько

https://www.maxpronko.com/blog/magento-2-payment-gateway-api

(я не мог скопировать другую ссылку, из-за отсутствие очков, но в конце этого одного есть ссылка к другому).

Я попытался реализовать его, но мне не повезло. Как я понимаю, после нажатия кнопки «Разместить заказ» запрос отправляется методу захвата, где я могу выполнить необходимую логику, а затем создать TransferObject, а затем отправить его (как?).

Это структура у меня есть:

custom payment file structure

в Vendor/PayU/и т.д./интерфейс/di.xml я есть:

<?xml version="1.0"?> 
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> 
    <preference for="Magento\Payment\Gateway\Command\CommandPoolInterface" type="Magento\Payment\Gateway\Command\CommandPool" /> 

    <virtualType name="Vendor\PayU\Model\Payment\Command\CaptureGateway" type="Magento\Payment\Gateway\Command\GatewayCommand"> 
     <arguments> 
      <argument name="requestBuilder" xsi:type="object">Vendor\PayU\Model\Payment\Request\Capture</argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="Vendor\PayU\Gateway\Command\CommandPool" type="Magento\Payment\Gateway\Command\CommandPool"> 
     <arguments> 
      <argument name="commands" xsi:type="array"> 
       <item name="capture" xsi:type="string">Vendor\PayU\Model\Payment\Command\CaptureGateway</item> 
      </argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="PayUPaymentMethodAdapter" type="Magento\Payment\Model\Method\Adapter"> 
     <arguments> 
      <argument name="code" xsi:type="const">Vendor\PayU\Model\Payment::METHOD_CODE</argument> 
      <argument name="valueHandlerPool" xsi:type="object">PayUValueHandlerPool</argument> 
      <argument name="validatorPool" xsi:type="object">PayUValidatorPool</argument> 
      <argument name="commandPool" xsi:type="object">PayUCommandPool</argument> 
      <argument name="formBlockType" xsi:type="object">Magento\Payment\Block\Form\Cc</argument> 
      <argument name="infoBlockType" xsi:type="object">Magento\Payment\Block\Info\Cc</argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="PayUConfig" type="Magento\Payment\Gateway\Config\Config"> 
     <arguments> 
      <argument name="methodCode" xsi:type="const">Vendor\PayU\Model\Payment::METHOD_CODE</argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="PayUConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler"> 
     <arguments> 
      <argument name="configInterface" xsi:type="object">PayUConfig</argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="PayUValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool"> 
     <arguments> 
      <argument name="handlers" xsi:type="array"> 
       <item name="default" xsi:type="string">PayUConfigValueHandler</item> 
      </argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="CountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator"> 
     <arguments> 
      <argument name="config" xsi:type="object">PayUConfig</argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="PayUGlobalValidator" type="Magento\Payment\Gateway\Validator\ValidatorComposite"> 
     <arguments> 
      <argument name="validators" xsi:type="array"> 
       <item name="country" xsi:type="string">CountryValidator</item> 
      </argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="PayUValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool"> 
     <arguments> 
      <argument name="validators" xsi:type="array"> 
       <item name="global" xsi:type="string">PayUGlobalValidator</item> 
      </argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="PayUCaptureGatewayCommand" type="Magento\Payment\Gateway\Command\GatewayCommand"> 
     <arguments> 
      <argument name="requestBuilder" xsi:type="object">Vendor\PayU\Model\Payment\Request\Capture</argument> 
      <argument name="handler" xsi:type="object">Vendor\PayU\Model\Payment\Response\Capture</argument> 
      <argument name="transferFactory" xsi:type="object">Vendor\PayU\Gateway\Http\TransferFactory</argument> 
     </arguments> 
    </virtualType> 

    <virtualType name="PayUCommandPool" type="Magento\Payment\Gateway\Command\CommandPool"> 
     <arguments> 
      <argument name="commands" xsi:type="array"> 
       <item name="capture" xsi:type="string">PayUCaptureGatewayCommand</item> 
      </argument> 
     </arguments> 
    </virtualType> 

    <type name="Vendor\PayU\Model\Payment"> 
     <arguments> 
      <argument name="commandPool" xsi:type="object">Vendor\PayU\Gateway\Command\CommandPool</argument> 
     </arguments> 
    </type> 
</config> 

В Vendor/PayU/Модель/Оплата .php i имеют:

<?php 

namespace Vendor\PayU\Model; 

use Magento\Payment\Model\InfoInterface; 
use Magento\Payment\Gateway\Command\CommandPoolInterface; 
use Magento\Payment\Gateway\CommandInterface; 

class Payment implements MethodInterface, PaymentMethodInterface 
{ 
    /** 
    * @var \Magento\Payment\Gateway\Command\CommandPoolInterface 
    */ 
    protected $commandPool; 

    /** 
    * @var CommandPoolInterface 
    */ 
    public function __construct(CommandPoolInterface $commandPool) { 
     $this->commandPool = $commandPool; 
    } 

    /** 
    * @param InfoInterface $payment 
    * @param float $amount 
    * @return $this 
    * @api 
    */ 
    public function capture(InfoInterface $payment, $amount) 
    { 
     /** @var CommandInterface $captureGatewayCommand */ 
     $captureGatewayCommand = $this->commandPool->get('capture'); 

     $captureGatewayCommand->execute([ 
      'payment' => $payment, 
      'amount' => $amount 
     ]); 
    }  
} 

Я реализую правильные классы? Какие еще файлы мне нужны? Я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении.

ответ

0

Во-первых, посмотрите на magento 2 официальных образца модулей. https://github.com/magento/magento2-samples/tree/2.1/sample-module-payment-gateway Как я знаю, у вас не должно быть реальной модели оплаты. Вы только что создали модель оплаты в файле di.xml. По коду:

<virtualType name="PayUPaymentMethodAdapter" type="Magento\Payment\Model\Method\Adapter"> 
    <arguments> 
     <argument name="code" xsi:type="const">Vendor\PayU\Model\Payment::METHOD_CODE</argument> 
     <argument name="valueHandlerPool" xsi:type="object">PayUValueHandlerPool</argument> 
     <argument name="validatorPool" xsi:type="object">PayUValidatorPool</argument> 
     <argument name="commandPool" xsi:type="object">PayUCommandPool</argument> 
     <argument name="formBlockType" xsi:type="object">Magento\Payment\Block\Form\Cc</argument> 
     <argument name="infoBlockType" xsi:type="object">Magento\Payment\Block\Info\Cc</argument> 
    </arguments> 
</virtualType> 

PayUPaymentMethodAdapter ваша модель оплаты, которая содержит все необходимые данные, вы должны просто поставить все neeeded вещи (команды, валидаторы и т.д.) и Magento будет вызывать автоматически. Таким образом, Magento \ Payment \ Model \ Method \ Adapter - это просто Facade, который содержит все функциональные возможности платежного модуля. Команда Magento 2 использует шаблон Command Design для всех действий по оплате, таких как (void, capture, authorize). Вы должны определить соответствующие команды, и Magento \ Payment \ Model \ Method \ Adapter вызовет их автоматически. Пожалуйста, проверьте способ оплаты пурпурных образцов.

+0

Спасибо за ваш ответ.Я смотрю пример, который вы мне посоветовали, но я не смог заставить его работать. Это вызывает ошибку в следующей ссылке: http://imgur.com/xpsmPfs. Я предполагаю, что проблема заключается в аргументах, которые имеют xsi: type = "const", потому что, если я прокомментирую эти строки (все virtualType), страница загружается без проблем (URL-адрес кода: http://imgur.com/ fOa1bjn). Вы знаете, что может быть проблемой? Благодарю. –

+0

Можете ли вы показать мне класс, который я имею в виду \ Vender \ PayUGateway \ Model \ ConfigProvider Создали ли вы класс с константой PAYMENT_METHOD_CODE? Также проверьте пространство имен. Кажется, magento не может найти константу. Пожалуйста, убедитесь, что все правильно. – Mistery

+0

Это мой ConfigProvider.php: http://imgur.com/fnadayV Я проверил пространство имен. Возможно, вы заметили, что я изменил имя поставщика для целей вопроса в обоих скриншотах, но я написал их правильно в обоих файлах в моей «рабочей» версии. –