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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2394閲覧

セブンアフィリエイトAPIのリクエストが実行できない

NOBUTUNA

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

4クリップ

投稿2019/05/30 09:32

実行したいAPIは以下公式ページの「商品検索」APIとなります。
https://7af.omni7.jp/af_static_site/API1.html

こちらを実行するにあたり、以下記載のソースを作成しましたが、このようなエラーが返ってきています。

{"ApiError":{"ApiErrorStatus":"NotAuthenticated","ApiErrorMessage":"リクエストパラメータに誤りがあります。(Signature)"}}

エラーとなっていSignatureの作成方法は以下セブンアフィリエイトAPI公式に記載されている内容に沿ってプログラムを作成しましたが、間違っている箇所が見つからない状態です。
https://7af.omni7.jp/af_static_site/static_063.html

PHP

1<?php 2 3$secret_key = '自身の秘密鍵'; 4$timestamp = gmdate('Y-m-d\TH:i:s\Z'); 5//署名を作成 6$params = Array(); 7$params['ApiUserId'] = '自身のApiUserId'; 8$params['Timestamp'] = $timestamp; 9$params['ResponseFormat'] = 'JSON'; 10$params['KeywordIn'] = '4902506352651'; 11ksort($params); 12//リクエストパラメータをパイプ「|」で繋ぐ 13$str = 'GET|' . 'https://7af-api.omni7.jp/af_api/affiliate/rest/GetShoppingCategory'; 14//リクエストパラメータを「key=value」の組に分解 15foreach ($params as $key => $value) { 16$str .= '|' . $key . '=' . $value; 17} 18//できた文字列をUTF-8でURLエンコードする 19$enc_str = rawurlencode($str); 20 21echo $enc_str; 22//API秘密鍵を用いてHMAC-SHA256で署名 23$hash = hash_hmac('sha256', $enc_str, $secret_key); 24//できた署名をBase64でエンコードする 25$signature = base64_encode($hash); //←できた署名情報 26 27//リクエストURL組み立て 28$url = 'https://7af-api.omni7.jp/af_api/affiliate/rest/GetShoppingCategory?'; 29$url .= 'ApiUserId=' . $params['ApiUserId'] . '&'; 30$url .= 'Timestamp=' . $params['Timestamp'] . '&'; 31$url .= 'ResponseFormat=' . $params['ResponseFormat'] . '&'; 32$url .= 'KeywordIn=' . $params['KeywordIn'] . '&'; 33$url .= 'Signature=' . $signature; 34$json = file_get_contents($url);

なぜエラーが返ってくるのか検討はつきますでしょうか?
大変お手数ですがご助力いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/30 12:02

リクエストパラメータをパイプ「|」で繋ぐ、って話の出典はどこですか?
NOBUTUNA

2019/05/31 06:19

質問ありがとうございます。 https://7af.omni7.jp/af_static_site/static_063.html こちらのセブンアフィリエイト公式サイトの情報になります。 もしかしたら会員登録しなければ見れないページかもしれません 4番目の項目に以下記載があり、そちらをもとに作成いたしました。 それぞれを'|'(縦棒)で連結して、UTF-8でURLエンコードする。
guest

回答2

0

回答がつかないようなので...


{"ApiError":{"ApiErrorStatus":"NotAuthenticated","ApiErrorMessage":"リクエストパラメータに誤りがあります。(Signature)"}}

エンドポイントとリクエストパラメータの組み合わせがあっていないように思われます。

プログラムで、

$params = Array();
$params['ApiUserId'] = '自身のApiUserId';
$params['Timestamp'] = $timestamp;
$params['ResponseFormat'] = 'JSON';
$params['KeywordIn'] = '4902506352651';
ksort($params);
//リクエストパラメータをパイプ「|」で繋ぐ
$str = 'GET|' . 'https://7af-api.omni7.jp/af_api/affiliate/rest/GetShoppingCategory';

と指定されていますが、エンドポイントが、 GetShoppingCategory であれば、カテゴリ検索 に記載されている通り、共通パラメータ以外では、CategoryCode のリクエストパラメータしか使えません。 ( つまり、 KeywordIn は使えない。 )

リクエストパラメータ KeywordIn を使うのであれば、商品検索 のエンドポイントの SearchProduct を使う必要があるのではないでしょうか?


(追記)

API キーを取得して試してみました。

エンドポイントの問題を修正した上で、

//API秘密鍵を用いてHMAC-SHA256で署名
$hash = hash_hmac('sha256', $enc_str, $secret_key);

$hash = hash_hmac('sha256', $enc_str, $secret_key, true);

にすることで、

{"SearchProductResponse":{"TotalAmount":"0","Products":""}}

のようにエラーはでなくなり、データが取得されるようになりました。

KeywordIn を API ページの例に有る ペットフード にすると

{"SearchProductResponse":{"TotalAmount":"185","Products":{"Product":[{"ProductCode":"1106401787","ProductName":"ペットフード・ペット用医療品の最新動向","AffiliateUrl":"https://7af-ent.omni7.jp/relay/affiliate/entranceProcess.do?url=https%3A%2F%2F7net.omni7.jp%2Fdetail%2F1106401787&affid=2794940000006751&admainid=10000001&link=7&ver=1","PersonName":"有原圭三/監修","Manufacturer":"シーエムシー出版","IsbnCode":"978-4-7813-0872-2","SalesPrice":"75,600","Point":"700","ImageUrl":"https://img.omni7.jp/co/productimage/0001/product/87/1106401787/image/1106401787_main_m.jpg","ReleaseDate":"2014-04-03T05:49:27Z","Description":"関連法規・制度の解説、ペットフード製造技術を詳述"}, (以下略)

のように JSON の取得が可能でした。

投稿2019/06/06 00:55

編集2019/06/06 13:33
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NOBUTUNA

2019/06/06 08:56 編集

回答いただきありがとうございます。 指摘いただいた箇所を修正し試してみましたが、取得することができませんでした。 再度見直したところ、パラメーターの値をエンコードするとの記載が公式にあり、リクエストURL例に & と = 以外のパラメーターはエンコードされていたため、以下コードに修正しましたが結果は変わりませんでした (秘密鍵/アプリIDは入力し確認) > <?php $secret_key = '秘密鍵'; $timestamp = gmdate('Y-m-d\TH:i:s\Z'); //署名を作成 $params = Array(); $params['ApiUserId'] = '自身のアプリID'; $params['Timestamp'] = $timestamp; $params['ResponseFormat'] = 'JSON'; $params['KeywordIn'] = '4902506352651'; ksort($params); //リクエストパラメータをパイプ「|」で繋ぐ $str = 'GET|' . 'https://7af-api.omni7.jp/af_api/affiliate/rest/SearchProduct'; //リクエストパラメータを「key=value」の組に分解 foreach ($params as $key => $value) { $str.= '|' . $key . '=' . $value; } //できた文字列をUTF-8でURLエンコードする $enc_str = rawurlencode($str); //API秘密鍵を用いてHMAC-SHA256で署名 $hash = hash_hmac('sha256', $enc_str, $secret_key); //できた署名をBase64でエンコードする $signature = base64_encode($hash); //←できた署名情報 //リクエストURL組み立て $url = 'https://7af-api.omni7.jp/af_api/affiliate/rest/SearchProduct?'; $url.= 'ApiUserId=' . rawurlencode($params['ApiUserId']) . '&'; $url.= 'Timestamp=' . rawurlencode($params['Timestamp']) . '&'; $url.= 'ResponseFormat=' . rawurlencode($params['ResponseFormat']) . '&'; $url.= 'KeywordIn=' . rawurlencode($params['KeywordIn']) . '&'; $url.= 'Signature=' . $signature; $json = file_get_contents($url);
CHERRY

2019/06/06 13:36

すでに別の方法で、解決されたようですが、実際に試したところ、データ取得できるのが確認できたので、回答を更新しておきます。
NOBUTUNA

2019/06/06 15:11

大変助かりました ありがとうございます。 ```ここに言語を入力 $hash = hash_hmac('sha256', $enc_str, $secret_key); ``` 上記から以下に改修することで解決することができました。 ```ここに言語を入力 $hash = hash_hmac('sha256', $enc_str, $secret_key, true); ```
guest

0

自己解決

ご協力いただきありがとうございます。
セブンネットAPIは使用せず、別手段で情報を取得することができたため、一旦はそちらの処理で代用しようと思います。
できればAPIにて取得したかったですが、今回の質問はこれでクローズにしようと思います。
お忙しいところ確認していただきありがとうございます。

投稿2019/06/06 08:59

NOBUTUNA

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問