⑯MWS実践-フィード(出品/改定)-PHP-lib
- 2015年10月13日
- Amazon_MWS徹底解説
AmazonMWSでAmazonへの商品を出品、価格改定、在庫の変更を行う方法について、PHPサンプルプログラム(題名にlibと記載しているのはAmazonのライブラリを利用するためです。)をつけて具体的に説明します。
バッチファイルでダブルクリックで送信できるので、ファイル名を日付で作成するようにしておけば、毎回セラーセントラルでファイルをUploadしなくても良いので作業が楽になると思います。
処理の流れですが、「フィード」処理は”CSVファイルのUpload”になります。処理したい内容はCSVファイル内に記載しますので、フィード処理自体はCSVをUploadすることと思ってよいです。つまり、フィードというのはMWSでは処理させる仕事をまとめて依頼要求と考えてもらうのが良いと思います。要求を出しても即時で結果が出るわけではありません。状態を確認しながら数分後に処理が完了しエラーがあるかを確認できます。
処理は以下の流れで処理されます。各①~③の処理はリクエストとレスポンスのREST-APIで処理されます。
①SubmitFeedでCSVファイルをUploadします。②GetSubmissionListで①の状態を確認しDONE(完了)になれば、③GetFeedSubmissionResultで実行結果を確認するという流れです。先ほども伝えたとおり①~③全て端末(orサーバ)からAmazonへのリクエストで処理が始まります。
詳細はAmazonのこちらを参照してください。
①フィード要求処理【SubmitFeed】
CSVファイルのUpload処理です。CSVファイル内に出品追加、削除や価格改定、在庫修正などの各種要求を商品ごとに記載します。
FeedTypeを”_POST_FLAT_FILE_INVLOADER_DATA_”で行うことで出品の追加削除が行えます。また、価格改定や在庫数の修正はFeedTypeを”_POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA_”で行えます。要求の受付応答時に”FeedSubmissionId”を取得でき、状況確認・結果取得等に用います。
②フィード処理状態確認【GetFeedSubmissionList】
①で送信したフィード要求の処理状態の確認を行う。処理状態を指定して確認する必要があり”_DONE_”(処理完了)で確認を行い、該当の”FeedSubmissionId”が存在すれば処理完了と判断を行う。
③フィード結果取得【GetFeedSubmissionResult】
②で処理完了したものに対して結果の取得を行う。①で取得した”FeedSubmissionId”を用いて結果をの確認を行い、結果は完了数とエラー数等が報告される。
以下が上記の流れを一通りの処理を行うPHPプログラムです。基本的にAmazonのライブラリを利用するので処理することを記載していけば動きます。■のところは各自の状況に合わせて修正してください。また、出力画面も綺麗ではないので、定義修正してください。
【Amazonのクライアントライブラリ】はこちら
(フィードとレポートAPIはライブラリが同一でした。商品APIなどは別です。)
【MWS接続方法】はこちら
【送信ファイルの作成方法(出品追加削除)】はこちら
【送信ファイルの作成方法(価格改定・在庫修正)】はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 |
<?php /** * Marketplace Web Service PHP5 Library * Generated: Thu May 07 13:07:36 PDT 2009 */ include_once ('.config.inc.php'); // 現在のディレクトリ(パス)を取得する $path = getcwd(); // ディレクトリを指定する。 // 今回は現在のディレクトリ配下に"List"というフォルダに入れる。(ディレクトリは作成済) $outBaseDir = $path . "List"; // ■■結果を保存するフォルダ■■ $dirName = 'C:\Users\test'; // ■■送信するCSVファイル(タブ区切り)を保存したフォルダ■■ // USのAmazonに出品しているのでUSのエンドポイントを設定 $serviceUrl = "https://mws.amazonservices.com"; // HTTPの設定 $config = array ( 'ServiceURL' => $serviceUrl, 'ProxyHost' => null, 'ProxyPort' => -1, 'MaxErrorRetry' => 3, ); // ****************************基本パラメータ設定*************************** $service = new MarketplaceWebService_Client( AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, $config, APPLICATION_NAME, APPLICATION_VERSION); $marketplaceIdArray = array("Id" => array('ABCDEFGHIJKLMN')); // ■■修正要■■ // ★★★★★★★★★★★★★★★★★★★SubmitFeed★★★★★★★★★★★★★★★★★★★★ // ****************************送信パラメータ取得*************************** //ディレクトリ・ハンドルをオープン $res_dir = opendir( $dirName ); $dateWord = date('Ymd'); //ディレクトリ内のファイル名を1つずつを取得 while( $file_name = readdir( $res_dir ) ){ // 今回は日付(例:20140202)と"_AddDel_"と入っているファイル名を送信する if ( strstr($file_name, $dateWord) and strstr($file_name, "_AddDel_") ) { //■■適宜修正■■ $fullName = $dirName . "\\" . $file_name; $feed = file_get_contents($fullName); // 送信済のファイルを移動する。 $dstFullName = $dirName . "\\" . $dateWord . "loaded\\" .$file_name; rename($fullName, $dstFullName); } // 今回は日付(例:20140202)と"_revPrice_"と入っているファイル名を送信する if ( strstr($file_name, $dateWord) and strstr($file_name, "_revPrice_") ) { //■■適宜修正■■ $fullName = $dirName . "\\" . $file_name; $feed2 = file_get_contents($fullName); // 送信済のファイルを移動する。 $dstFullName = $dirName . "\\" . $dateWord . "loaded\\" .$file_name; rename($fullName, $dstFullName); } } //ディレクトリ・ハンドルをクローズ closedir( $res_dir ); /*****************************Start 追加削除**********************************/ $feedHandle = @fopen('php://temp', 'rw+'); fwrite($feedHandle, $feed); rewind($feedHandle); $request = new MarketplaceWebService_Model_SubmitFeedRequest(); $request->setMerchant(MERCHANT_ID); $request->setMarketplaceIdList($marketplaceIdArray); $request->setFeedType('_POST_FLAT_FILE_INVLOADER_DATA_'); $request->setContentMd5(base64_encode(md5(stream_get_contents($feedHandle), true))); rewind($feedHandle); $request->setPurgeAndReplace(false); $request->setFeedContent($feedHandle); rewind($feedHandle); $addSubFeedId = invokeSubmitFeed($service, $request); @fclose($feedHandle); /*****************************End 追加削除**********************************/ /********************************Start 価格改定********************************/ $feedHandle = @fopen('php://temp', 'rw+'); fwrite($feedHandle, $feed2); rewind($feedHandle); $request = new MarketplaceWebService_Model_SubmitFeedRequest(); $request->setMerchant(MERCHANT_ID); $request->setMarketplaceIdList($marketplaceIdArray); $request->setFeedType('_POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA_'); $request->setContentMd5(base64_encode(md5(stream_get_contents($feedHandle), true))); rewind($feedHandle); $request->setPurgeAndReplace(false); $request->setFeedContent($feedHandle); rewind($feedHandle); $revSubFeedId = invokeSubmitFeed($service, $request); @fclose($feedHandle); /**********************************End 価格改定*******************************/ // ★★★★★★★★★★★★★★★★★GetSubmitFeedList★★★★★★★★★★★★★★★★★★ $request = new MarketplaceWebService_Model_GetFeedSubmissionListRequest(); $request->setMerchant(MERCHANT_ID); $statusList = new MarketplaceWebService_Model_StatusList(); $request->setFeedProcessingStatusList($statusList->withStatus('_DONE_')); /******************追加削除の状態が完了するまで調査***********************/ while (true){ print date( "★★★Y年n月j日 G時i分s秒\t追加削除の状態を取得 ID=" ) . $addSubFeedId . "★★★"; $getSubId = invokeGetFeedSubmissionList($service, $request, $addSubFeedId); if ( $addSubFeedId == $getSubId) break; sleep(180); } /******************価格改定の状態が完了するまで調査***********************/ while (true){ print date( "★★★Y年n月j日 G時i分s秒\t価格改定の状態を取得 ID=" ) . $addSubFeedId . "★★★"; $getSubId = invokeGetFeedSubmissionList($service, $request, $revSubFeedId); if ( $revSubFeedId == $getSubId) break; sleep(180); } // ★★★★★★★★★★★★★★★★★GetSubmitFeedResult★★★★★★★★★★★★★★★★★★ // ファイルを開き結果を保存する。 $outDir = sprintf('%s\%s', $outBaseDir, date('Y')); if (!is_dir($outDir)) { if (!mkdir($outDir, 0777, true)) { die('Failed to create output Directory [makdir]...'); } } $filename = sprintf('%s\Result_%s_%s.txt', $outDir, date('Ymd'), date('His')); //■■適宜修正■■ $resultFilname = @fopen($filename, 'a+'); /******************追加削除の実行状態を取得***********************/ $request = new MarketplaceWebService_Model_GetFeedSubmissionResultRequest(); $request->setMerchant(MERCHANT_ID); $request->setFeedSubmissionId($addSubFeedId); $request->setFeedSubmissionResult($resultFilname); print date( "★★★Y年n月j日 G時i分s秒\t追加削除の結果を取得 ID=" ) . $addSubFeedId . "★★★"; invokeGetFeedSubmissionResult($service, $request); /******************価格改定の実行状態を取得***********************/ $request = new MarketplaceWebService_Model_GetFeedSubmissionResultRequest(); $request->setMerchant(MERCHANT_ID); $request->setFeedSubmissionId($revSubFeedId); $request->setFeedSubmissionResult($resultFilname); print date( "★★★Y年n月j日 G時i分s秒\t価格改定の結果を取得 ID=" ) . $revSubFeedId . "★★★"; invokeGetFeedSubmissionResult($service, $request); @fclose($filename); // ●●●●●●●●●●●●●●●● サブ関数 ●●●●●●●●●●●●●●●● /** * Invoke Feed Submission Action Sample */ function invokeSubmitFeed(MarketplaceWebService_Interface $service, $request) { $getFeedSubId_f = 0; try { $response = $service->submitFeed($request); printf ("Service Response\n"); printf ("=============================================================================\n"); print date( "Y" ) . "年" . date( "n月j日 G時i分s秒\t" ); printf(" SubmitFeedResponse\n"); if ($response->isSetSubmitFeedResult()) { printf(" SubmitFeedResult\n"); $submitFeedResult = $response->getSubmitFeedResult(); if ($submitFeedResult->isSetFeedSubmissionInfo()) { printf(" FeedSubmissionInfo\n"); $feedSubmissionInfo = $submitFeedResult->getFeedSubmissionInfo(); if ($feedSubmissionInfo->isSetFeedSubmissionId()) { printf(" FeedSubmissionId\n"); printf(" " . $feedSubmissionInfo->getFeedSubmissionId() . "\n"); $getFeedSubId_f = $feedSubmissionInfo->getFeedSubmissionId(); } if ($feedSubmissionInfo->isSetFeedType()) { printf(" FeedType\n"); printf(" " . $feedSubmissionInfo->getFeedType() . "\n"); } if ($feedSubmissionInfo->isSetSubmittedDate()) { printf(" SubmittedDate\n"); printf(" " . $feedSubmissionInfo->getSubmittedDate()->format(DATE_FORMAT) . "\n"); } if ($feedSubmissionInfo->isSetFeedProcessingStatus()) { printf(" FeedProcessingStatus\n"); printf(" " . $feedSubmissionInfo->getFeedProcessingStatus() . "\n"); } if ($feedSubmissionInfo->isSetStartedProcessingDate()) { printf(" StartedProcessingDate\n"); printf(" " . $feedSubmissionInfo->getStartedProcessingDate()->format(DATE_FORMAT) . "\n"); } if ($feedSubmissionInfo->isSetCompletedProcessingDate()) { printf(" CompletedProcessingDate\n"); printf(" " . $feedSubmissionInfo->getCompletedProcessingDate()->format(DATE_FORMAT) . "\n"); } } } if ($response->isSetResponseMetadata()) { printf(" ResponseMetadata\n"); $responseMetadata = $response->getResponseMetadata(); if ($responseMetadata->isSetRequestId()) { printf(" RequestId\n"); printf(" " . $responseMetadata->getRequestId() . "\n"); printf("RequestId\t"); printf($responseMetadata->getRequestId() . "\n"); } } printf(" ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n"); // FeedSubmissionId を返す return $getFeedSubId_f; } catch (MarketplaceWebService_Exception $ex) { printf("Caught Exception: " . $ex->getMessage() . "\n"); printf("Response Status Code: " . $ex->getStatusCode() . "\n"); printf("Error Code: " . $ex->getErrorCode() . "\n"); printf("Error Type: " . $ex->getErrorType() . "\n"); printf("Request ID: " . $ex->getRequestId() . "\n"); printf("XML: " . $ex->getXML() . "\n"); printf("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n"); } } /** * Get Feed Submission List Action Sample */ function invokeGetFeedSubmissionList(MarketplaceWebService_Interface $service, $request, $recFeedSubId) { $checkSubFeedId = 0; try { $response = $service->getFeedSubmissionList($request); printf ("Service Response\n"); printf ("=============================================================================\n"); printf(" GetFeedSubmissionListResponse\n"); if ($response->isSetGetFeedSubmissionListResult()) { printf(" GetFeedSubmissionListResult\n"); $getFeedSubmissionListResult = $response->getGetFeedSubmissionListResult(); if ($getFeedSubmissionListResult->isSetNextToken()) { printf(" NextToken\n"); printf(" " . $getFeedSubmissionListResult->getNextToken() . "\n"); } if ($getFeedSubmissionListResult->isSetHasNext()) { printf(" HasNext\n"); printf(" " . $getFeedSubmissionListResult->getHasNext() . "\n"); } $feedSubmissionInfoList = $getFeedSubmissionListResult->getFeedSubmissionInfoList(); foreach ($feedSubmissionInfoList as $feedSubmissionInfo) { printf(" FeedSubmissionInfo\n"); if ($feedSubmissionInfo->isSetFeedSubmissionId()) { printf(" FeedSubmissionId\n"); printf(" " . $feedSubmissionInfo->getFeedSubmissionId() . "\n"); if ( $recFeedSubId == $feedSubmissionInfo->getFeedSubmissionId() ) { $checkSubFeedId = $feedSubmissionInfo->getFeedSubmissionId(); } } if ($feedSubmissionInfo->isSetFeedType()) { printf(" FeedType\n"); printf(" " . $feedSubmissionInfo->getFeedType() . "\n"); } if ($feedSubmissionInfo->isSetSubmittedDate()) { printf(" SubmittedDate\n"); printf(" " . $feedSubmissionInfo->getSubmittedDate()->format(DATE_FORMAT) . "\n"); } if ($feedSubmissionInfo->isSetFeedProcessingStatus()) { printf(" FeedProcessingStatus\n"); printf(" " . $feedSubmissionInfo->getFeedProcessingStatus() . "\n"); } if ($feedSubmissionInfo->isSetStartedProcessingDate()) { printf(" StartedProcessingDate\n"); printf(" " . $feedSubmissionInfo->getStartedProcessingDate()->format(DATE_FORMAT) . "\n"); } if ($feedSubmissionInfo->isSetCompletedProcessingDate()) { printf(" CompletedProcessingDate\n"); printf(" " . $feedSubmissionInfo->getCompletedProcessingDate()->format(DATE_FORMAT) . "\n"); } } } if ($response->isSetResponseMetadata()) { printf(" ResponseMetadata\n"); $responseMetadata = $response->getResponseMetadata(); if ($responseMetadata->isSetRequestId()) { printf(" RequestId\n"); printf(" " . $responseMetadata->getRequestId() . "\n"); } } printf(" ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n"); // CheckしているSubFeedIdが存在したら、その値を返す return $checkSubFeedId; } catch (MarketplaceWebService_Exception $ex) { printf("Caught Exception: " . $ex->getMessage() . "\n"); printf("Response Status Code: " . $ex->getStatusCode() . "\n"); printf("Error Code: " . $ex->getErrorCode() . "\n"); printf("Error Type: " . $ex->getErrorType() . "\n"); printf("Request ID: " . $ex->getRequestId() . "\n"); printf("XML: " . $ex->getXML() . "\n"); printf("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n"); } } /** * Get Feed Submission Result Action Sample */ function invokeGetFeedSubmissionResult(MarketplaceWebService_Interface $service, $request) { try { $response = $service->getFeedSubmissionResult($request); printf ("Service Response\n"); printf ("=============================================================================\n"); printf(" GetFeedSubmissionResultResponse\n"); if ($response->isSetGetFeedSubmissionResultResult()) { $getFeedSubmissionResultResult = $response->getGetFeedSubmissionResultResult(); printf (" GetFeedSubmissionResult"); if ($getFeedSubmissionResultResult->isSetContentMd5()) { printf (" ContentMd5"); printf (" " . $getFeedSubmissionResultResult->getContentMd5() . "\n"); } } if ($response->isSetResponseMetadata()) { printf(" ResponseMetadata\n"); $responseMetadata = $response->getResponseMetadata(); if ($responseMetadata->isSetRequestId()) { printf(" RequestId\n"); printf(" " . $responseMetadata->getRequestId() . "\n"); } } printf(" ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n"); } catch (MarketplaceWebService_Exception $ex) { printf("Caught Exception: " . $ex->getMessage() . "\n"); printf("Response Status Code: " . $ex->getStatusCode() . "\n"); printf("Error Code: " . $ex->getErrorCode() . "\n"); printf("Error Type: " . $ex->getErrorType() . "\n"); printf("Request ID: " . $ex->getRequestId() . "\n"); printf("XML: " . $ex->getXML() . "\n"); printf("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n"); } } ?> |