別の方法を参考にして、独自のお支払い方法を作成しました。支払いアクションが成功したときに支払いの詳細(sales / order_payment)を注文するために、支払いゲートウェイのトランザクションIDを保存したくありません。
トランザクションIDをこのテーブルに保存するにはどうすればよいですか?
別の方法を参考にして、独自のお支払い方法を作成しました。支払いアクションが成功したときに支払いの詳細(sales / order_payment)を注文するために、支払いゲートウェイのトランザクションIDを保存したくありません。
トランザクションIDをこのテーブルに保存するにはどうすればよいですか?
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;
}
}
上記の答えは機能しますが、情報を保存するためのより良い方法があると思います。
次の方法を支払いモジュールモデルに追加します。
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;
}
これはあなたの実装ではうまくいかないかもしれませんが、情報を保存するための少しクリーンな方法かもしれないと思います。
私の場合、この問題を次のように分類しました。
の関数を次のように変更し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);
以上です。