5

だから、ホレイ-私は新しいカスタムペイメントゲートウェイを作成しようとしています。サードパーティのAPIを介して認証/キャプチャを行うように設計されていますが、サードパーティのサイトにリダイレクトする必要はありません。

私の理解では、注文がMagentoで発注/確定され、ゲートウェイが「承認とキャプチャ」に設定されている場合、ゲートウェイモデルから「キャプチャ」メソッドを実行する必要があります。現在、これを行っていません。

もちろん、管理者注文ビューから具体的にキャプチャすると、キャプチャが試行されますが、これはチェックアウトの直後に実行する必要があります(これも、すでに実行する必要があることを理解しています)。

私のゲートウェイモデルには、次のものがあります(読みやすさのために切り捨てられています)。

<?php
class Example_Gateway_Model_Payment extends Mage_Payment_Model_Method_Cc
{
    protected $_code = 'example';

    protected $_isGateway = true;
    protected $_canAuthorize = true;
    protected $_canCapture = true;
    protected $_canUseInternal = true;
    protected $_canUseCheckout = true;

    // This is an empty block class that extends Mage_Payment_Block_Form_Cc
    protected $_formBlockType = 'example/form_example';

    public function authorize(Varien_Object $payment, $amount)
    {
        Mage::log('Authorizing!');
    }

    public function capture(Varien_Object $payment, $amount)
    {
        Mage::log('** Capturing **');
        // Third-party API stuff would go here, with exceptions being thrown if the gateway determines they've provided an invalid card, etc.
    }

    public function assignData($data)
    {
        Mage::log('Assigning Data');
    }
}

この支払いモデル自体は間違いなく機能します-とのログ出力を取得assignData()し、追加した場合validate()も同様です。__construct()しかし、私が何をしても、実際に注文するときに、キャプチャメソッドも承認メソッドも起動しません。

私のconfig.xmlは次のようになります。

<?xml version="1.0"?>
<config>
    <modules>
        <Example_Gateway>
            <version>0.0.5</version>
        </Example_Gateway>
    </modules>
    <global>
        <blocks>
            <gateway>
                <class>Example_Gateway_Block</class>
            </gateway>
        </blocks>
        <models>
            <gateway>
                <class>Example_Gateway_Model</class>
            </gateway>
        </models>
        <helpers>
            <gateway>
                <class>Example_Gateway_Helper</class>
            </gateway>
        </helpers>
    </global>
    <frontend>
      <!-- Snip.. Nothing special here -->
    </frontend>
    <default>
        <payment>
            <gateway>
                <sort_order>0</sort_order>
                <model>gateway/payment</model>
                <enabled>1</enabled>
                <order_staus>processing</order_status>
                <payment_action>authorize_capture</payment_action>
                <cctypes>VI,MC,AE,DI</cctypes>
                <useccv>1</useccv>
            </gateway>
        </payment>
    </default>
</config>

追加のテーブルは必要ないので、リソースモデルは必要ないと思います。私の期待は、sales_flat_order_paymentゲートウェイ関連/提供されたデータ(txn idなど)を格納するために、関連するテーブルを使用するだけであるということです。

同様に、デフォルトのCCブロックを拡張して、標準の支払いフォームを取得しています。

私は何が欠けていますか?それは私が見落としている小さくてシンプルなものでなければなりません。

前もって感謝します!


更新: これまで、capture()メソッドを手動で呼び出すcheckout_type_onepage_save_orderイベントにオブザーバーを使用する回避策を実装しましたが、これは正しい方法ではないと確信しています。

capture()ゲートウェイがauthorize_captureに設定されている場合、Magentoが最初の注文の保存を自動的に呼び出す必要があると考えるのは間違いではありません。

4

3 に答える 3

3

解決しました!あなたはこれを必要とします:

protected $_isInitializeNeeded      = false;

なぜこれが必要なのか、私にはアイデアがありませんが、この時点で、実際に物事を成し遂げるために、Magentoの理由を理解しようとするのをあきらめました。私はあなたとまったく同じ問題を抱えていました。ソースコードをたどると、isInitializeNeededがtrueを返したときに、Payment.phpが_authorizeを呼び出していなかったことがわかりました。したがって、その線をモデルに貼り付けると、機能します。

于 2012-11-19T15:20:10.967 に答える
2

メソッドは次のようにすべきだと思います:構成に記載されている「capture」ではなく「authorize_capture」

<payment_action>authorize_capture</payment_action>

そのように:

public function authorize_capture(Varien_Object $payment, $amount)
{
    Mage::log('** Capturing **');
    // Third-party API stuff would go here, with exceptions being thrown if the gateway determines they've provided an invalid card, etc.
}

「authorize_action」が空だったために「authorize」メソッドがまったく起動されなかったという同様の問題がありました。メソッド自体にハードコーディングすることで、これを解決することができました。「getConfigPaymentAction」は、authorizeメソッドを取得するために呼び出されます。

public function getConfigPaymentAction() {
    return 'authorize';
} 
于 2015-03-13T16:08:55.403 に答える
0

さて、私はオブザーバーを使用して手動でキャプチャメソッドを呼び出しました。
最も洗練されたソリューションではありませんが、十分に機能します。

于 2012-06-12T23:46:38.770 に答える