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

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

新規登録して質問してみよう
ただいま回答率
85.48%
公開鍵認証

公開鍵認証とは、公開鍵と秘密鍵の2つの鍵の組を利用する、SSHで利用される認証方式です。

PHP

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

Yahoo! Query Language

Yahoo! Query Language(YQL)は、米ヤフーが提供しているAPIサービスです。Web上からxmlやjson形式でデータ出力を行います。Yahoo!の検索エンジンをSQLのように操作できます。

API

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

Q&A

0回答

549閲覧

phpにてYahoo!ショッピング注文詳細APIにて公開鍵認証を利用するにあたりエラー原因不明

yosio111

総合スコア0

公開鍵認証

公開鍵認証とは、公開鍵と秘密鍵の2つの鍵の組を利用する、SSHで利用される認証方式です。

PHP

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

Yahoo! Query Language

Yahoo! Query Language(YQL)は、米ヤフーが提供しているAPIサービスです。Web上からxmlやjson形式でデータ出力を行います。Yahoo!の検索エンジンをSQLのように操作できます。

API

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

0グッド

2クリップ

投稿2023/08/25 01:20

編集2023/08/25 02:14

現象・実現したいこと

Yahoo!ショッピングAPIの注文詳細APIにて公開鍵認証を利用したいが実行時にエラーが発生します。
原因が分かりません。どうかアドバイスを戴きたいです。

前提

PHPにて実装。公開鍵認証を利用しない形での注文詳細APIの実行は問題なく実行可能。
また公開鍵の申請、発行は済んでいます。
アクセストークンは直前にリフレッシュトークンにて取得しています。
https://auth.login.yahoo.co.jp/yconnect/v2/token)
公開鍵参考ページ
https://developer.yahoo.co.jp/webapi/shopping/help/#effectivepublickey
注文詳細API参考ページ
https://developer.yahoo.co.jp/webapi/shopping/orderInfo.html

発生している問題・エラーメッセージ

HTTP/1.1 401 Unauthorized
Date: Thu, 24 Aug 2023 21:34:51 GMT
Connection: close
Cache-Control: no-store
Content-Type: application/xml
Content-Language: en
X-Frame-Options: SAMEORIGIN
X-YahooJ-AuthError: Required authentication information is not found.
Content-Length: 140

<?xml version="1.0" encoding="utf-8"?>

<Error><Message>Bad Request: Authentication parameters in your request incompleted.</Message></Error>

該当のソースコード

// Yahoo! JAPAN API アクセストークン
$accessToken = "<アクセストークン>";

// 公開鍵認証情報の準備
$sellerId = "<ストアアカウント>";
$publicKeyPath = "./public.key"; // 公開鍵ファイルのパス
$keyVersion = "1";

// 認証情報作成 (ストアアカウントと unixtimestamp を : で結合する)
$authenticationValue = $sellerId . ":" . time();

// 公開鍵の読み込み
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyPath));

// 認証情報の暗号化実行
openssl_public_encrypt($authenticationValue, $encryptedAuthenticationValue, $publicKey);

// 認証情報の Base64 エンコード実行
$encodedAuthenticationValue = base64_encode($encryptedAuthenticationValue);

// リクエストヘッダーの設定
$requestHeaders = array(
"Authorization: Bearer " . $accessToken,
"X-sws-signature: " . $encodedAuthenticationValue,
"X-sws-signature-version: " . $keyVersion
);

// リクエスト内容 (XML データ)
$param = <<<EOD
<Req>
<Target>
<OrderId><注文ID></OrderId>
<Field>OrderStatus,ShipStatus</Field>
</Target>
<SellerId><ストアアカウント></SellerId>
</Req>
EOD;

// API エンドポイント URL
$url = 'https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderInfo';

// cURL セッションの初期化
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
curl_setopt($ch, CURLOPT_HEADER, true);

// API リクエストの実行 ↓こちら実行後responseにエラー格納
$response = curl_exec($ch);

// cURL セッションのクローズ
curl_close($ch);

// API レスポンスの表示
echo $response;

試したこと

キーの開始文字を省く必要もあるかと思い、 認証情報の暗号化実行前に消してみましたがエラー変わらず。
//開始・終了文字削除
$publicKey = str_replace([
'-----BEGIN PUBLIC KEY-----',
'-----END PUBLIC KEY-----',
"\r\n",
"\n",
], [
'',
'',
"\n",
''
], $publicKey);

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問