##Yahoo ショッピング API について質問です。
ヤフーの店舗向け、受注連携プログラムを開発中です。
ヤフーのショッピングAPIを使って注文詳細やステータス変更をしたかったのですが、
できなくて困っています。お分かりになるかた、アドバイスお願い致します。
###【やりたいこと】
① 注文番号から、注文の詳細を取得する
② 任意の注文番号の注文のステータスを任意に変更する
###【やった事】
1)本番環境アプリケーションIDおよびシークレットIDを申請・取得
2)1)と、Yahooが提供しているYahooID連携用のSDK (YConnectExplicitクラス)を利用してリフレッシュトークンを行い、アクセストークンを取得
###【詰まっている事】
2)で取得したアクセストークンを利用して、 やりたいことの① の取得を試みたが、”401エラー” となって取得できなかった。
→ 詳細
getYahooOrderEntity というメソッドに ショップID(sellerId)と注文番号(orderId)を渡すと、
このメソッド内で指定しているフィールド(お届け先や商品情報) を Entityにいれて取得する、という処理です。
(いまはテストで return が void となっています)
認証エラーとなっていますが、”有効なアクセストークン” は間違いなく有効です。
この”有効なアクセストークン”を利用してユーザー情報(店情報)を取得することに成功しています。
(プログラムを実行するたびリフレッシュトークンを行ってから下記のメソッドを実行しています。)
// connection.getResponseMessage() で 「Authorization Required」
↓ のところで問題です
Java
1public Entity getYahooOrderEntity(String sellerId, String orderId) { 2 String requestString = ""; 3 try { 4 URLEncoder.encode(orderId, "UTF-8"); 5 6 String field = "OrderId,DeviceType,OrderTime,OrderStatus,StoreStatus,SendConfirmTime,SendPayTime," + 7 "BuyerComments,SellerComments,TotalCouponDiscount,BillFirstName,BillLastName,BillZipCode,BillPrefecture," + 8 "BillCity,BillAddress1,BillAddress2,BillPhoneNumber,BillMailAddress,ShipMethodName,ShipRequestDate,ShipRequestTime," + 9 "ShipNotes,ShipFirstName,ShipLastName,ShipZipCode,ShipPrefecture,ShipCity,ShipAddress1,ShipAddress2,ShipPhoneNumber," + 10 "PayCharge,ShipCharge,Discount,Adjustments,SettleAmount,TotalPrice,SettlePayAmount,ItemId,Title,Jan,ProductId," + 11 "UnitPrice,Quantity,ReleaseDate,IsShippingFree"; 12 13 // リクエスト内容 14 requestString += 15 "OrderId=" + URLEncoder.encode(orderId, "UTF-8") + "&" + 16 "Field=" + URLEncoder.encode(field, "UTF-8") + "&" + 17 "SellerId=" + URLEncoder.encode(sellerId, "UTF-8"); 18 } catch (Exception e) { 19 20 } 21 executePost("https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderInfo", requestString); 22 } 23 24private void executePost(String requestRrl, String requestString) { 25 System.out.println("===== HTTP POST Start ====="); 26 try { 27 URL url = new URL(requestRrl); 28 HttpURLConnection connection = null; 29 try { 30 connection = (HttpURLConnection) url.openConnection(); 31 connection.setDoOutput(true); 32 connection.setRequestMethod("POST"); 33 OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); 34 BufferedWriter writer = new BufferedWriter(osw); 35 int contentLength = requestString.length(); 36 writer.write("POST /ShoppingWebService/V1/orderInfo HTTP/1.1"); 37 writer.write("Host: circus.shopping.yahooapis.jp"); 38 writer.write("Authorization: Bearer " + 有効なアクセストークン); 39 writer.write("Content-Type: application/x-www-form-urlencoded"); 40 writer.write("Content-Length: " + contentLength); 41 writer.write(requestString); 42 writer.flush(); 43 44 if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { 45 // レスポンスを使って処理 46 } 47 // connection.getResponseCode() で 401 が返ってきて、 48 // connection.getResponseMessage() で 「Authorization Required」 49 System.out.println(connection.getResponseMessage()); 50 } finally { 51 if (connection != null) { 52 connection.disconnect(); 53 } 54 } 55 } catch (IOException e) { 56 e.printStackTrace(); 57 } 58 System.out.println("===== HTTP POST End ====="); 59 }
###【聞きたいこと】
① Authorization Required を直訳すると「認証が必要」ということですが、executePost() 内の writer.write("Authorization: Bearer " + 有効なアクセストークン); で認証ということではないのでしょうか。
別に認証処理があるのでしょうか…?
② この次のステップなのですが、ショッピングAPIにリクエストを投げる方法として、&でつなぐ形でもいいのでしょうか。サンプルみるとXML形式みたいになってますが、XML形式みたいなのにしたほうがいいのでしょうか。
YahooのほかのAPIのサンプルでは&でつなげていたのですが、ショッピングAPIはXMLみたいなのになってました。
③ 追加ですみません、
ヤフーショッピングAPIを利用するにあたり「API本番環境利用申請」をまだ行っていません。
こちらの申請も必要になるのでしょうか。よろしくお願い致します。
参考にしたページ
注文詳細API
http://developer.yahoo.co.jp/webapi/shopping/orderInfo.html
WebAPIの使い方(POSTリクエスト)
http://developer.yahoo.co.jp/appendix/request/rest/post.html
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。