将交易ID存储到magento订单支付表中

时间:2012-09-18 12:04:03

标签: magento

我已经通过参考另一种方法创建了我自己的付款方式。我想存储我的支付网关的交易ID,以便在成功付款操作时订购付款详情(sales / order_payment)。

如何将交易ID存储到此表?

3 个答案:

答案 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);

就是这样。我希望它能以某种方式提供帮助。