質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.70%

Yahoo ショッピングAPI について

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,044

teratail_user

score 12

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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で質問しよう!

  • ただいまの回答率 89.70%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる