我已经通过参考另一种方法创建了我自己的付款方式。我想存储我的支付网关的交易ID,以便在成功付款操作时订购付款详情(sales / order_payment)。
如何将交易ID存储到此表?
答案 0 :(得分: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;
}
}
答案 1 :(得分: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;
}
这可能不适用于您的实施,但我认为这可能是一种更简洁的方式来存储信息。
答案 2 :(得分:1)
就我而言,我已经按照以下方式对此问题进行了排序:
将app / code / local / SecurePay / Sxml / Model / Sxml.php中的函数capture()更改为:
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);
就是这样。我希望它能以某种方式提供帮助。