Yahoo ショッピングAPI について
- 評価
- クリップ 0
- VIEW 4,134
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」
↓ のところで問題です
public Entity getYahooOrderEntity(String sellerId, String orderId) {
String requestString = "";
try {
URLEncoder.encode(orderId, "UTF-8");
String field = "OrderId,DeviceType,OrderTime,OrderStatus,StoreStatus,SendConfirmTime,SendPayTime," +
"BuyerComments,SellerComments,TotalCouponDiscount,BillFirstName,BillLastName,BillZipCode,BillPrefecture," +
"BillCity,BillAddress1,BillAddress2,BillPhoneNumber,BillMailAddress,ShipMethodName,ShipRequestDate,ShipRequestTime," +
"ShipNotes,ShipFirstName,ShipLastName,ShipZipCode,ShipPrefecture,ShipCity,ShipAddress1,ShipAddress2,ShipPhoneNumber," +
"PayCharge,ShipCharge,Discount,Adjustments,SettleAmount,TotalPrice,SettlePayAmount,ItemId,Title,Jan,ProductId," +
"UnitPrice,Quantity,ReleaseDate,IsShippingFree";
// リクエスト内容
requestString +=
"OrderId=" + URLEncoder.encode(orderId, "UTF-8") + "&" +
"Field=" + URLEncoder.encode(field, "UTF-8") + "&" +
"SellerId=" + URLEncoder.encode(sellerId, "UTF-8");
} catch (Exception e) {
}
executePost("https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderInfo", requestString);
}
private void executePost(String requestRrl, String requestString) {
System.out.println("===== HTTP POST Start =====");
try {
URL url = new URL(requestRrl);
HttpURLConnection connection = null;
try {
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
BufferedWriter writer = new BufferedWriter(osw);
int contentLength = requestString.length();
writer.write("POST /ShoppingWebService/V1/orderInfo HTTP/1.1");
writer.write("Host: circus.shopping.yahooapis.jp");
writer.write("Authorization: Bearer " + 有効なアクセストークン);
writer.write("Content-Type: application/x-www-form-urlencoded");
writer.write("Content-Length: " + contentLength);
writer.write(requestString);
writer.flush();
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
// レスポンスを使って処理
}
// connection.getResponseCode() で 401 が返ってきて、
// connection.getResponseMessage() で 「Authorization Required」
System.out.println(connection.getResponseMessage());
} finally {
if (connection != null) {
connection.disconnect();
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("===== HTTP POST End =====");
}
【聞きたいこと】
① 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
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
自己解決しました。
Authorization はヘッダーでするんですね。
あと ③ もやらないでも本物の注文情報が取得できました^^;
参考にしたサイト↓
再入門!HTTP/2.0が主流になる前にHTTP/1.1の基本を知ろう
http://www.casleyconsulting.co.jp/blog-engineer/%E6%9C%AA%E5%88%86%E9%A1%9E/%E5%86%8D%E5%85%A5%E9%96%80%EF%BC%81%EF%BC%81http2-0%E3%81%8C%E4%B8%BB%E6%B5%81%E3%81%AB%E3%81%AA%E3%82%8B%E5%89%8D%E3%81%ABhttp1-1%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%82%92%E7%9F%A5%E3%82%8D%E3%81%86/
ソース修正後
public void getYahooOrderEntity(String sellerId, String orderId) {
String requestString = "";
try {
URLEncoder.encode(orderId, "UTF-8");
String field = "OrderId,DeviceType,OrderTime,OrderStatus,StoreStatus,SendConfirmTime,SendPayTime," +
"BuyerComments,SellerComments,TotalCouponDiscount,BillFirstName,BillLastName,BillZipCode,BillPrefecture," +
"BillCity,BillAddress1,BillAddress2,BillPhoneNumber,BillMailAddress,ShipMethodName,ShipRequestDate,ShipRequestTime," +
"ShipNotes,ShipFirstName,ShipLastName,ShipZipCode,ShipPrefecture,ShipCity,ShipAddress1,ShipAddress2,ShipPhoneNumber," +
"PayCharge,ShipCharge,Discount,Adjustments,SettleAmount,TotalPrice,SettlePayAmount,ItemId,Title,Jan,ProductId," +
"UnitPrice,Quantity,ReleaseDate,IsShippingFree";
// requestString +=
// "OrderId=" + URLEncoder.encode(orderId, "UTF-8") + "&" +
// "Field=" + URLEncoder.encode(field, "UTF-8") + "&" +
// "SellerId=" + URLEncoder.encode(sellerId, "UTF-8");
requestString =
"<Req>" +
"<Target>" +
"<OrderId>" + orderId + "</OrderId>" +
"<Field>" + field + "</Field>" +
"</Target>" +
"<SellerId>" + sellerId + "</SellerId>" +
"</Req>";
} catch (Exception e) {
}
executePost("https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderInfo", requestString);
}
private void executePost(String requestRrl, String requestString) {
System.out.println("===== HTTP POST Start =====");
try {
URL url = new URL(requestRrl);
HttpURLConnection connection = null;
try {
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Host", "circus.shopping.yahooapis.jp");
connection.setRequestProperty("Authorization", "Bearer " + 有効なアクセストークン);
OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
BufferedWriter writer = new BufferedWriter(osw);
//int contentLength = requestString.length();
//writer.write("POST /ShoppingWebService/V1/orderInfo HTTP/1.1");
//writer.write("Host: circus.shopping.yahooapis.jp");
//writer.write("Authorization: Bearer " + tmYahooAuth.getAccessToken());
//writer.write("Content-Type: application/x-www-form-urlencoded");
//writer.write("Content-Length: " + contentLength);
//writer.write("\n");
writer.write(requestString);
writer.flush();
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
try {
InputStreamReader isr = new InputStreamReader(connection.getInputStream(), "UTF-8");
BufferedReader reader = new BufferedReader(isr);
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {}
}
System.out.println(connection.getResponseMessage());
} finally {
if (connection != null) {
connection.disconnect();
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("===== HTTP POST End =====");
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる