0

我是 Rails 的新手(但一般来说对 Web 开发并不陌生)。我正在使用 mws-connect gem ( https://github.com/devmode/mws ) 连接到 Amazon Marketplace Web Service。我正在尝试取消订单,根据亚马逊 MWS API 文档,需要发送以下 xml 代码(据我所知):

<?xml version="1.0"?> 
     <AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd"> 
        <Header> 
            <DocumentVersion>1.01</DocumentVersion> 
            <MerchantIdentifier> M_IDENTIFIER</MerchantIdentifier> 
        </Header> 
        <MessageType>
            OrderAcknowledgment
        </MessageType> 
        <Message> 
            <MessageID>1</MessageID> 
            <OrderAcknowledgement> 
                <AmazonOrderID>050-1234567-1234567</AmazonOrderID> 
                <StatusCode>Failure</StatusCode> 
                <CancelReason>Reason for cancellation</CancelReason>
            </OrderAcknowledgment> 
        </Message> 
    </AmazonEnvelope>

gem 文档并不清楚如何执行此操作,因为这些示例都是关于如何添加或更新产品列表的,我对其进行了测试并且工作正常。我已经尝试了所有我能想到的方法来手动构建“提要”请求来提交它,并使用类的其余部分来处理提交的东西,因为我知道这是可行的。我在 SalesOrder 类中的当前代码示例是:

def self.cancel_amazon_order(amazon_order_id, cancel_reason)
  mws = Mws.connect(
    merchant: 'merchant_id',
    access: 'access_key',
    secret: 'secret'
  )
  cancel_feed = Mws::Feed.new 'merchant_id', :order_acknowledgement do
    @messages << {
      MessageID: '1',
      OrderAcknowledgement: {
        AmazonOrderID: amazon_order_id,
        StatusCode: 'Failure',
        CancelReason: cancel_reason
      }
    }
  end
end

此代码不会引发任何错误,但是当我尝试这样做时cancel_feed.to_xml(我可以看到是提交提要的下一步),我收到一条错误消息

ArgumentError:尚未定义命名空间缩进

是否有任何 Rails 专业人士可能知道如何使这个 gem 工作,无论是 to_xml 方法,还是更好的如何让取消本身通过?我觉得我离得不远了。我来自 PHP 背景,所以我对此的思考过程可能有点偏离。到目前为止,我一直很喜欢 Rails,但我在这个上拔了头发,感谢任何帮助!

4

1 回答 1

2

如果有人感兴趣,我最终得到的解决方案是:

mws = Mws.connect merchant: AMAZON_CONFIG['merchant_id'], access: AMAZON_CONFIG['access'], secret: AMAZON_CONFIG['secret']

cancel_xml = Nokogiri::XML::Builder.new do | xml |
  xml.AmazonEnvelope('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:noNamespaceSchemaLocation' => 'amznenvelope.xsd') {
    xml.Header {
      xml.DocumentVersion '1.01'
      xml.MerchantIdentifier AMAZON_CONFIG['merchant_id']
    }
    xml.MessageType 'OrderAcknowledgement'
    xml.Message {
      xml.MessageID '1'
      xml.OrderAcknowledgement {
        xml.AmazonOrderID order_id
        xml.StatusCode 'Failure'
        items.each do | item |
          xml.Item {
            xml.AmazonOrderItemCode item[:item_code]
            xml.CancelReason 'NoInventory'
          }
        end

      }
    }
  }
end.to_xml

mws.feeds.submit cancel_xml, {feed_type: :order_acknowledgement}
于 2013-02-05T19:16:15.377 回答