我通过参考另一种方法创建了自己的付款方式。我想存储我的支付网关的交易 ID 以在成功支付操作时订购支付详细信息 (sales/order_payment)。
如何将事务 ID 存储到此表中?
我通过参考另一种方法创建了自己的付款方式。我想存储我的支付网关的交易 ID 以在成功支付操作时订购支付详细信息 (sales/order_payment)。
如何将事务 ID 存储到此表中?
虽然上述答案有效,但我认为可能有更好的方法来存储信息。
将以下方法添加到您的支付模块模型中。
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;
}
这可能不适用于您的实现,但我认为这可能是一种更简洁的存储信息的方式。
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;
}
}
在我的情况下,我对这个问题进行了以下排序:
将函数capture()
at更改为以下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);
就这些。