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

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

ただいまの
回答率

87.78%

【Laravel/PHP】HubSpotのAPIを叩いたら「Invalid input JSON」のエラーが発生する

受付中

回答 0

投稿 編集

flag 質問者が4日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 28

score 4

実現したいこと

ユーザーをHubSpotに追加するPOST /crm/v3/objects/contactsを実装したいです。
https://developers.hubspot.jp/docs/api/crm/contacts

デプロイ

Herokuで行っています。
Papertrailをインストールしているので、heroku logs --tailでLogを確認しています。

コードの構成

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;

// Log
use Illuminate\Support\Facades\Log;

class HubSpotController extends Controller
{
  public function store(Request $request)
  {
    try {
      // env
      $HubSpotApiKey = config("env.hubspot_api_key");

      // guzzle
      $client = new Client();

      // HubSpot Value
      $profileName = "aaa";
      $profileEmail = "aaa@gmail.com";

      Log::info($profile["name"]);
      Log::info($profile["email"]);

      $data = array(
        "properties" => [
          "email" => $profileEmail,
          "firstname" => $profileName
        ]
      );

      $formParams = json_encode($data, JSON_UNESCAPED_UNICODE);

      Log::info($formParams);

      $hubspot = $client->request("POST", "https://api.hubapi.com/crm/v3/objects/contacts?hapikey=" . $HubSpotApiKey, [
        "headers" => [
          'content-type' => 'application/json'
        ],
        'form_params' => [$formParams]
      ]);

      Log::info($hubspot);
    } catch (\GuzzleHttp\Exception\BadResponseException $e) {
      Log::info($e);
      return $e->getResponse()->getBody()->getContents();
    }
  }
}

Log::info

ログ出力した内容に関しては以下の通りです。

Log::info($profile["name"]);
→ production.INFO: aaa
Log::info($profile["email"]);
→ production.INFO: aaa@gmail.com
Log::info($formParams);
Log::info($hubspot);
Log::info($formParams);
→ production.INFO: {"properties":{"email":"aaa@gmail.com","firstname":"aaa"}}
Log::info($hubspot);
→ production.INFO: GuzzleHttp\Exception\ClientException: Client error: `POST https://api.hubapi.com/crm/v3/objects/contacts?hapikey=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` resulted in a `400 Bad Request` response:
→ {"status":"error","message":"Invalid input JSON on line 1, column 3: Unexpected character ('=' (code 61)): Expected spac (truncated...)

エラーの原因

以下のform_paramsで使う値がJSON化されていないこと。

$data = array(
  "properties" => [
    "email" => $profileEmail,
    "firstname" => $profileName
  ]
);

$formParams = json_encode($data, JSON_UNESCAPED_UNICODE);

しかし、Log::info($formParams)を見る限り、JSON化されているように思えました。

cURLでの実装

公式サイトのPHPでは、cURLコマンドを使用しているのでこちらのコードで検証してみました。
cURLでは、うまくいきました。
https://developers.hubspot.jp/docs/api/crm/contacts

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;

// Log
use Illuminate\Support\Facades\Log;

class HubSpotController extends Controller
{
  public function store(Request $request)
  {
    try {
      // env
      $HubSpotApiKey = config("env.hubspot_api_key");

      // HubSpot Value
      $profileName = "aaa";
      $profileEmail = "aaa@gmail.com";

      Log::info($profile["name"]);
      Log::info($profile["email"]);


      // Register HubSpot
      $data = array(
        "properties" => [
          "email" => $profileEmail,
          "firstname" => $profileName
        ]
      );

      $formParams = json_encode($data, JSON_UNESCAPED_UNICODE);

      Log::info($formParams);

      $curl = curl_init();

      curl_setopt_array($curl, array(
        CURLOPT_URL => "https://api.hubapi.com/crm/v3/objects/contacts?hapikey=" . $HubSpotApiKey,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $formParams,
        CURLOPT_HTTPHEADER => array(
          "accept: application/json",
          "content-type: application/json"
        ),
      ));

      $response = curl_exec($curl);
      $err = curl_error($curl);
      curl_close($curl);

      if ($err) {
        Log::info($err);
      } else {
        Log::info($response);
      }
    } catch (\GuzzleHttp\Exception\BadResponseException $e) {
      Log::info($e);
      return $e->getResponse()->getBody()->getContents();
    }
  }
}

質問事項

なぜこのようなエラーが発生するのでしょうか?
また、このエラー解消のためにはどのようにすればいいのでしょうか?

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

同じタグがついた質問を見る