2016-02-07 6 views
7

Sylius(sylius/sylius-standard、v0.16)を使用して従来のオフライン決済ゲートウェイを実装する方法について、 。Sylius 0.16とPayumを使用してオフサイト決済ゲートウェイを実装する際に注文を確定する方法

は、これまでのところ、私はこの私のバンドルのビルドで()メソッドました:

public function build(ContainerBuilder $container) 
{ 
    /** @var PayumExtension $payum */ 
    $payum = $container->getExtension('payum'); 
    $payum->addGatewayFactory(new PayWayOffsiteGatewayFactory()); 
} 

は、ここに私のconfig.ymlです:

sylius_payment: 
    gateways: 
     payway_offsite: PayWay 

payum: 
    gateways: 
     payway_offsite: 
      payway_offsite: 
       secret_key: %tcompayway.secret_key% 
       shop_id: %tcompayway.shop_id% 
       username: %tcompayway.username% 
       password: %tcompayway.password% 
       sandbox: %tcompayway.sandbox% 

%のcompaywayは*%フィールドはスキップし、大丈夫ofcourseのように構成されています。この部分。 は、その後、私は私のPayWayOffsiteGatewayFactoryクラスでこれを得た:

class PayWayOffsiteGatewayFactory extends AbstractGatewayFactory 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return 'payway_offsite'; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function addConfiguration(ArrayNodeDefinition $builder) 
    { 
     parent::addConfiguration($builder); 

     $builder->children() 
      ->scalarNode('secret_key')->isRequired()->cannotBeEmpty()->end() 
      ->scalarNode('shop_id')->isRequired()->cannotBeEmpty()->end() 
      ->scalarNode('username')->isRequired()->cannotBeEmpty()->end() 
      ->scalarNode('password')->isRequired()->cannotBeEmpty()->end() 
      ->booleanNode('sandbox')->defaultTrue()->end() 
      ->end(); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    protected function getPayumGatewayFactoryClass() 
    { 
     return 'WebBurza\PaymentBundle\Payum\PayWay\PayWayGatewayFactory'; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    protected function getComposerPackage() 
    { 
     return 'webburza/tcompayway'; 
    } 
} 

そしてPayWayGatewayFactoryクラス:これまでのところ、私は印象の下だ

class PayWayGatewayFactory extends GatewayFactory 
{ 
    /** 
    * {@inheritDoc} 
    * @throws \Payum\Core\Exception\InvalidArgumentException 
    */ 
    protected function populateConfig(ArrayObject $config) 
    { 
     $config->defaults(array(
      'payum.factory_name'   => 'payway_offsite', 
      'payum.factory_title'   => 'PayWay Offsite', 
      'payum.action.capture'   => new CaptureOffsiteAction(), 
      'payum.action.capture_null'  => new CaptureOffsiteNullAction(), 
      'payum.action.status'   => new StatusAction(), 
      'payum.action.convert_payment' => new ConvertPaymentAction(), 
     )); 

     if (false == $config['payum.api']) { 
      $config['payum.default_options'] = array(
       'secret_key' => '', 
       'shop_id'  => '', 
       'username'  => '', 
       'password'  => '', 
       'sandbox'  => true 
      ); 
      $config->defaults($config['payum.default_options']); 
      $config['payum.required_options'] = [ 
       'secret_key', 
       'shop_id', 
       'username', 
       'password', 
       'sandbox' 
      ]; 

      $config['payum.api'] = function (ArrayObject $config) { 

       $config->validateNotEmpty($config['payum.required_options']); 

       $api = new Api([ 
        'secret_key'=> $config['secret_key'], 
        'shop_id' => $config['shop_id'], 
        'username' => $config['username'], 
        'password' => $config['password'], 
        'sandbox' => $config['sandbox'], 
       ], $config['payum.http_client']); 

       return $api; 

      }; 
     } 
    } 
} 

このすべては、私ならば(私を修正して大丈夫より、小さいです私は間違っている)。私は私のCaptureOffsiteActionのexecuteメソッドを取得するために管理してきました: - 私はキャプチャプロセスを開始すると(メソッドを実行) -

public function execute($captureRequest) 
    { 
     RequestNotSupportedException::assertSupports($this, $captureRequest); 
     $model = ArrayObject::ensureArrayObject($captureRequest->getModel()); 

     $httpRequest = new GetHttpRequest(); 
     $this->gateway->execute($httpRequest); 

     if ($httpRequest->method === 'POST') { 
      $status = new GetHumanStatus($model); 

      if (isset($httpRequest->request['pgw_transaction_id']) && $httpRequest->request['pgw_transaction_id'] > 0) { 
       // mark this order id as paid, convert cart to order, etc. 

      } else { 
       // mark as failed/cancelled, redirect back to cart 
      } 
      return; 

     } 

     $model['successUrl'] = $captureRequest->getToken()->getTargetUrl(); 
     $model['failureUrl'] = $captureRequest->getToken()->getTargetUrl(); 
     $offsiteUrl = $this->api->getOffsiteUrl(); 

     $data = $this->api->prepareOffsitePayment($model->toUnsafeArray()); 
     $headers = ['application/x-www-form-urlencoded']; 

     throw new HttpPostRedirect(
      $offsiteUrl, 
      $data, 
      200, 
      $headers 
     ); 

    } 

まず、私はこの権利を得たかどうかを確認することができます物事は予想通り、私はで終わる作業HttpPostRedirectを経由して正しい注文ID、価格などで決済することができます。この部分は大丈夫です。

成功したURLに戻ると、CaptureOffsiteAction :: executeで再び終了し、pgw_transaction_idを確認します。これが設定されていると、支払いから戻ってきたことになり、 /失敗した支払い。

質問は以下のとおりです。成功のお支払いの場合は

  • - どのように私は、 '閉じる' ないため(キャプチャとしてなど、注文するカート、マークの支払いを変換?)

  • 他の支払いゲートウェイには他にもたくさんのメトコがあることがわかります。ポストリダイレクトによるオフサイト支払いのみに興味があります.StatusActionは何をしていますか?それはいつ呼び出されますか?

は、これまでのところ私は(他の、非Sylius関連のプロジェクトに)Payum(およびPayumBundle)非常に混乱が、私はOmniPayを使用してその日の下に2つのオフサイト・ゲートウェイを実装するために管理していますがように見えることはできませんこのPayum物を解く。 :(

すべてのヘルプ感謝、事前に感謝返事が遅れて申し訳ありません

答えて

2

- !。私は私が間違っていた場所を把握するために管理

全体的なアイデアは、アクションの連続的な呼び出しです。私の場合、それは次のようになります。

  • CaptureOffsiteAction
  • StatusAction

私の最初のエラーがPayumが特定のワークフローのためにのみ1アクションを使用していることを考えていました。ドキュメントはちょっと混乱していました(少なくとも私のように思えました)ので、PGからの返品時にStatusActionが実際に注文ステータスを処理する部分を取得しませんでした。

だから私は集まって何から:

  • CaptureOffsiteActionが支払いゲートウェイへのリダイレクトを処理し、リターン
  • にチェックポストバック要求を次にStatusActionが引き継ぎ、および適切な状況のためのチェックが完了順序をマークするために、新

    public function execute($request) 
    { 
        RequestNotSupportedException::assertSupports($this, $request); 
    
        $model = new ArrayObject($request->getModel()); 
        if (null === $model['EXECCODE']) { 
         $request->markNew(); 
         return; 
        } 
    
        if (Api::STATUS_SUCCESS === $model['EXECCODE']) { 
         $request->markCaptured(); 
         return; 
        } 
    
        $request->markFailed(); 
    } 
    
    0:またはここに私のStatusActionは、例えばメソッドを実行しています

を失敗しました。

そして、ここで最終CaptureOffsiteActionだ::メソッドを実行します。

public function execute($captureRequest) 
{ 
    RequestNotSupportedException::assertSupports($this, $captureRequest); 
    $model = ArrayObject::ensureArrayObject($captureRequest->getModel()); 

    $httpRequest = new GetHttpRequest(); 
    $this->gateway->execute($httpRequest); 

    if ($httpRequest->method === 'POST') { 
     // TODO: properly validate response signature here 

     if (isset($httpRequest->request['pgw_transaction_id'])) { 
      $model['EXECCODE'] = Api::STATUS_SUCCESS; 
     } else { 
      $model['EXECCODE'] = $httpRequest->request['pgw_result_code']; 
     } 

     return; 
    } 

    $model['successUrl'] = $captureRequest->getToken()->getTargetUrl(); 
    $model['failureUrl'] = $captureRequest->getToken()->getTargetUrl(); 
    $offsiteUrl = $this->api->getOffsiteUrl(); 

    $data = $this->api->prepareOffsitePayment($model->toUnsafeArray(), $captureRequest); 

    $headers = ['application/x-www-form-urlencoded']; 

    throw new HttpPostRedirect(
     $offsiteUrl, 
     $data, 
     200, 
     $headers 
    ); 
} 

が、これはあなたのいくつかを役に立てば幸い!乾杯。

+0

これを理解し、Payboxを適切に実装するには、2日間かかりました。ご意見をいただきありがとうございます。あなたの答えを受け入れることを忘れないでください。 – Aurel

関連する問題