現象・実現したいこと
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
<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);
あなたの回答
tips
プレビュー