1

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

如何将事务 ID 存储到此表中?

4

3 回答 3

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 回答
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 回答
1

在我的情况下,我对这个问题进行了以下排序:

将函数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);

就这些。

于 2013-02-15T01:11:56.550 回答