1

別の方法を参考にして、独自のお支払い方法を作成しました。支払いアクションが成功したときに支払いの詳細(sales / order_payment)を注文するために、支払いゲートウェイのトランザクションIDを保存したくありません。

トランザクションIDをこのテーブルに保存するにはどうすればよいですか?

4

3 に答える 3

2

1)SQLインストールスクリプトをモジュールに追加します。ここで、注文オブジェクトに新しい属性を追加します

$installer = new Mage_Sales_Model_Mysql4_Setup;
$attribute  = array(
        'type'          => 'text',
        'backend_type'  => 'text',
        'frontend_input' => 'text',
        'is_user_defined' => true,
        'label'         => 'Transaction Code',
        'visible'       => true,
        'required'      => false,
        'user_defined'  => false,  
        'searchable'    => false,
        'filterable'    => false,
        'comparable'    => false,
        'default'       => ''
);
$installer->addAttribute('order', 'new_transaction_id', $attribute);
$installer->endSetup();

次に、オブザーバーを追加して支払いイベントをフックできるため、yoru config.xmlにコードを追加して、オブザーバーがイベントにフックできるようにする必要があります。

<events>
   <sales_order_payment_pay>
      <observers>
        <my_observer>
            <type>singleton</type>
            <class>mymodule/observer</class>
            <method>save_transaction</method>
        </my_observer>
      </observers>
   </sales_order_payment_pay>     
</events>

次に、オブザーバーモデルをモジュールに追加します。

<?php
class Company_Mymodule_Model_Observer
{
    public function save_transaction($event)
    {
        $order = $event->getInvoice()->getOrder(); // Mage_Sales_Model_Order

        /**
         * You would need to have your tranaction id from your gateway
         * which would depend on how you have made your module..
         * ....
         */
        try {
            $order->setNewTransactionId($transactionId);
            $order->save();
        }
        catch(Exception $e) {
            // do something nice
        }

        return $this;
    }
}
于 2012-09-18T15:30:03.937 に答える
2

上記の答えは機能しますが、情報を保存するためのより良い方法があると思います。

次の方法を支払いモジュールモデルに追加します。

public function assignData($data)
{
    if (!($data instanceof Varien_Object)) {
        $data = new Varien_Object($data);
    }

    $info = $this->getInfoInstance();

    $info->setYourCustomTransactionId($data->getYourCustomTransactionId());

    return $this;
}

これはうまくいくでしょうが。お支払いモジュールに別の方法を追加することをお勧めします。setAdditionalInformationを作成し、assignDataメソッドを使用してデータを設定します。お支払い方法が別のMagento支払いクラスから派生している場合、この方法がすでに存在するかどうかはわかりません。

public function setAdditionalInformation($key, $value)
{
    if (is_object($value)) {
        Mage::throwException(Mage::helper('paypal')->__('Payment transactions disallow storing objects.'));
    }
    $info = $this->_getData('additional_information');
    if (!$info) {
        $info = array();
    }
    $info[$key] = $value;
    return $this->setData('additional_information', $info);
}

次に、データの割り当てでこれを行います。

public function assignData($data)
{
    if (!($data instanceof Varien_Object)) {
        $data = new Varien_Object($data);
    }

    $info = $this->getInfoInstance();

    $info->setAdditionalInformation(array(
        'trans_id' => $data->getYourCustomTransactionId()
    ));

    return $this;
}

これはあなたの実装ではうまくいかないかもしれませんが、情報を保存するための少しクリーンな方法かもしれないと思います。

于 2013-01-17T20:38:18.543 に答える
1

私の場合、この問題を次のように分類しました。

の関数を次のように変更しcapture()ますapp/code/local/SecurePay/Sxml/Model/Sxml.php

    if($approved)
    {
        $transaction_id = $sxml->getResult('transaction_id');
        
        $xmlResponse = $sxml->getResult('response');
        $response = simplexml_load_string(htmlspecialchars_decode($xmlResponse))->children();
        
        $payment->setAdditionalInformation('txnID', (string) $response->Payment->TxnList->Txn->txnID);
        $payment->setAdditionalInformation('purchaseOrderNo', (string) $response->Payment->TxnList->Txn->purchaseOrderNo);          
        $payment->setCcTransId(''.$transaction_id);

以上です。

于 2013-02-15T01:11:56.550 に答える