Edited at

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/