実現したいこと
ユーザーをHubSpotに追加するPOST /crm/v3/objects/contacts
を実装したいです。
https://developers.hubspot.jp/docs/api/crm/contacts
デプロイ
Herokuで行っています。
Papertrailをインストールしているので、heroku logs --tail
でLogを確認しています。
コードの構成
php:HubspotController.php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use GuzzleHttp\Client; 7 8// Log 9use Illuminate\Support\Facades\Log; 10 11class HubSpotController extends Controller 12{ 13 public function store(Request $request) 14 { 15 try { 16 // env 17 $HubSpotApiKey = config("env.hubspot_api_key"); 18 19 // guzzle 20 $client = new Client(); 21 22 // HubSpot Value 23 $profileName = "aaa"; 24 $profileEmail = "aaa@gmail.com"; 25 26 Log::info($profile["name"]); 27 Log::info($profile["email"]); 28 29 $data = array( 30 "properties" => [ 31 "email" => $profileEmail, 32 "firstname" => $profileName 33 ] 34 ); 35 36 $formParams = json_encode($data, JSON_UNESCAPED_UNICODE); 37 38 Log::info($formParams); 39 40 $hubspot = $client->request("POST", "https://api.hubapi.com/crm/v3/objects/contacts?hapikey=" . $HubSpotApiKey, [ 41 "headers" => [ 42 'content-type' => 'application/json' 43 ], 44 'form_params' => [$formParams] 45 ]); 46 47 Log::info($hubspot); 48 } catch (\GuzzleHttp\Exception\BadResponseException $e) { 49 Log::info($e); 50 return $e->getResponse()->getBody()->getContents(); 51 } 52 } 53}
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:HubspotController.php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use GuzzleHttp\Client; 7 8// Log 9use Illuminate\Support\Facades\Log; 10 11class HubSpotController extends Controller 12{ 13 public function store(Request $request) 14 { 15 try { 16 // env 17 $HubSpotApiKey = config("env.hubspot_api_key"); 18 19 // HubSpot Value 20 $profileName = "aaa"; 21 $profileEmail = "aaa@gmail.com"; 22 23 Log::info($profile["name"]); 24 Log::info($profile["email"]); 25 26 27 // Register HubSpot 28 $data = array( 29 "properties" => [ 30 "email" => $profileEmail, 31 "firstname" => $profileName 32 ] 33 ); 34 35 $formParams = json_encode($data, JSON_UNESCAPED_UNICODE); 36 37 Log::info($formParams); 38 39 $curl = curl_init(); 40 41 curl_setopt_array($curl, array( 42 CURLOPT_URL => "https://api.hubapi.com/crm/v3/objects/contacts?hapikey=" . $HubSpotApiKey, 43 CURLOPT_RETURNTRANSFER => true, 44 CURLOPT_ENCODING => "", 45 CURLOPT_MAXREDIRS => 10, 46 CURLOPT_TIMEOUT => 30, 47 CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 48 CURLOPT_CUSTOMREQUEST => "POST", 49 CURLOPT_POSTFIELDS => $formParams, 50 CURLOPT_HTTPHEADER => array( 51 "accept: application/json", 52 "content-type: application/json" 53 ), 54 )); 55 56 $response = curl_exec($curl); 57 $err = curl_error($curl); 58 curl_close($curl); 59 60 if ($err) { 61 Log::info($err); 62 } else { 63 Log::info($response); 64 } 65 } catch (\GuzzleHttp\Exception\BadResponseException $e) { 66 Log::info($e); 67 return $e->getResponse()->getBody()->getContents(); 68 } 69 } 70}
質問事項
なぜこのようなエラーが発生するのでしょうか?
また、このエラー解消のためにはどのようにすればいいのでしょうか?
よろしくお願いいたします。
あなたの回答
tips
プレビュー