Help us understand the problem. What is going on with this article?

Rails MWS オーダーのキャンセル

More than 1 year has passed since last update.

はじめに

Rails + MWSでAmazonのオーダーのキャンセル処理をする方法を紹介します。

MWSでオーダーをキャンセルするにはSubmitFeedを使用します。
このSubmitFeedは指定するFeedTypeによって色々な情報を更新することができます。
今回はオーダーのキャンセルということで、POST_ORDER_ACKNOWLEDGEMENTDATA_というフィードタイプを指定します。

FeedType一覧

補足

厳密にいうとオーダーのキャンセルができるフィードタイプは以下の2種類になります。

  • POST_ORDER_ACKNOWLEDGEMENTDATA_
  • POST_PAYMENT_ADJUSTMENTDATA_

POST_PAYMENT_ADJUSTMENT_DATAは公式リファレンスにもある通り、キャンセル目的で使うのであれば「注文の一部キャンセル」に使用するそうです。
正直僕にはまだ使いどころが想像できません。(返金はこのフィードタイプで行います)

フィードの解説

Amazonが提供してくれているPOST_ORDER_ACKNOWLEDGEMENT_DATAフィードの例は以下のような感じです。
Messageのブロックがオーダーの単位ですね。

<?xml version="1.0"?>
<AmazonEnvelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
 <Header>
   <DocumentVersion>1.01</DocumentVersion>
   <MerchantIdentifier>M__45765</MerchantIdentifier>
 </Header>
 <MessageType>OrderAcknowledgement</MessageType>
 <Message>
   <MessageID>1</MessageID>
   <OperationType>Update</OperationType>
   <OrderAcknowledgement>
     <AmazonOrderID>503-4691292-7715199</AmazonOrderID>
     <StatusCode>Success</StatusCode>
   </OrderAcknowledgement>
 </Message>
 <Message>
   <MessageID>2</MessageID>
   <OperationType>Update</OperationType>
   <OrderAcknowledgement>
     <AmazonOrderID>503-5507100-9985598</AmazonOrderID>
     <StatusCode>Success</StatusCode>
   </OrderAcknowledgement>
 </Message>
</AmazonEnvelope>

オーダーをキャンセするす場合のMessageの中身はこんな感じです。

 <Message>
   <MessageID>1</MessageID>
   <OperationType>Update</OperationType>
   <OrderAcknowledgement>
     <AmazonOrderID>{AmazonOrderID}</AmazonOrderID>
     <StatusCode>Failure</StatusCode>
     <Item>
       <AmazonOrderItemCode>{AmazonOrderItemCode}</AmazonOrderItemCode>
       <CancelReason>{CancelReason}</CancelReason>
     </Item>
   </OrderAcknowledgement>
 </Message>

軽く説明すると、
キャンセルするにはStatusCodeにFailureを指定する必要があります。
また、キャンセル理由を指定するにはItemブロックを作成してOrderItemごとに指定する必要があります。

セラーセントラルから手動でキャンセルする時にはオーダー単位でキャンセル理由を指定してキャンセル処理をしますよね?
MWSからキャンセルを行う場合は上のXMLでいうところのItemブロックは実は任意です。
つまりキャンセル理由は本当は不要なんですねー。
キャンセル理由なしでキャンセルするの怖いので実際やったことはないですけどね:angel:

ちなみにCancelReasonは以下から選んでください。

  • NoInventory - ShippingAddressUndeliverable
  • CustomerExchange
  • BuyerCanceled
  • GeneralAdjustment
  • CarrierCreditDecision
  • RiskAssessmentInformationNotValid
  • CarrierCoverageFailure
  • CustomerReturn
  • MerchandiseNotReceived

実装

事前準備

Rails MWS APIを利用するまでの事前準備
こちらよりpeddlerのclientインスタンスを作成できる状態にしておいてください:point_up:

フィードのサブミット

peddlerのclientインスタンスを使用すればフィードのサブミットはめちゃくちゃ簡単です。
これだけですからね。

client = MWS.feeds(
  primary_marketplace_id: 'primary_marketplace_id',
  aws_access_key_id: '',
  aws_secret_access_key: 'aws_secret_access_key',
  merchant_id: 'merchant_id',
  auth_token: 'auth_token'
)
feed = 'サブミットするフィードの内容'
client.submit_feed(feed,'_POST_ORDER_ACKNOWLEDGEMENT_DATA_')

フィードの作成

問題はフィードの作成が少し難しいというところです。
XML作るのとかめんどくさいですしね。
いつもbuilderというgemを使用しているのでそれを使った実装を紹介します。
脳死でこのメソッドをコピペしたらいいんじゃないでしょうか?

def self.feed_generate(seller_id, datas)
  feed = ''
  xml = Builder::XmlMarkup.new(target: feed)
  xml.instruct!

  xml.AmazonEnvelope do
    xml.Header do
      xml.DocumentVersion('1.01')
      xml.MerchantIdentifier(seller_id)
    end
    xml.MessageType('OrderAcknowledgement')
    index = 1
    datas.each do |data|
      xml.Message do
        xml.MessageID(index.to_s)
        xml.OperationType('Update')
        xml.OrderAcknowledgement do
          xml.AmazonOrderID(data[:order_id])
          xml.StatusCode('Failure')
          xml.Item do
            xml.AmazonOrderItemCode(data[:order_item_id])
            xml.CancelReason(data[:cancel_reason])
          end
        end
      end
      index += 1
    end
  end
  feed
end

終わりに

やってみるとそんなに難しいことはないんですねえ。
注意すべきとことは、このフィードタイプでは例え1つしかOrderItemを指定していなくても、
オーダーが丸っとキャンセルされるというところですかね...

ブログで見る方はこちら
http://nabesys.com/article/2018/08/03587/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした