Q&A

短期のチャネルアクセストークンをPHPで発行しようとするとエラーとなる

前提・実現したいこと

短期アクセストークンをPHPで取得したい。

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

curlを走らせると以下のようなエラーとなってしまいます。***はIDとシークレットですので伏せました。

array (
  'error' => 'invalid_request',
  'error_description' => 'Parameter conditions "grant_type=refresh_token" OR "grant_type=client_credentials" OR "grant_type=authorization_code" not met for actual request parameters: "grant_type={client_credentials}, client_id={*********}, client_secret={*******************"}',
)

該当のソースコード

<?php
    //ポストデータ
    $post_data = [
        'grant_type'    => 'client_credentials',
        'client_id'     => LINE_CHANNEL_ID,
        'client_secret' => LINE_CHANNEL_SECRET
    ];
    $post_data = http_build_query($post_data);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/v2/oauth/accessToken');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/x-www-form-urlencoded'
        )
    );
    $result = curl_exec($ch);
    $res_curl = curl_getinfo($ch);
    curl_close($ch);

    $response = substr($result, $res_curl['header_size']);

試したこと

ネット上にあったfile_get_contentsだと取得できましたが、cURLで出来たらなと考えています。

補足情報(FW/ツールのバージョンなど)

http_build_queryがあっても無くても同じエラーが出力されています。

  • 1
  • 2
  • 718
  • twitter facebook

これに変更したらいけました^^

body: new URLSearchParams({
      grant_type: grant_type,
      client_id: client_id,
      client_secret: client_secret,
    }),
  • 0

私もこのエラーに直面しています。 以下のコードで同じエラーが起きます。

const params = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: JSON.stringify({
      grant_type: grant_type,
      client_id: client_id,
      client_secret: client_secret,
    }),
  };
	const result = await fetch('https://api.line.me/v2/oauth/accessToken', params).then((res) =>
      res.json(),
    );
  • 0
本当によろしいですか? question.vm