Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@ayies128

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

More than 1 year has passed since last update.

はじめに

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

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

FeedType一覧

補足

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

  • POST_ORDER_ACKNOWLEDGEMENT_DATA
  • POST_PAYMENT_ADJUSTMENT_DATA

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/

0
Help us understand the problem. What is going on with this article?
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
ayies128
株式会社illustrious CTO。 EC業務を色々な角度から効率化できるように日々システム開発を行っています。 システム開発の話から飲みに行こうって話までなんでもどうぞ。 うどんとお酒と #UVERWorld が大好きです。 世界で売るためのECインフラサービス「lismoa」の開発運営を行なっています。 https://lismoa.com/

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?