Menggunakan PHP cURL untuk POST data di /oauth2/access_token dan MENDAPATKAN data sebagai jSON

Saya telah mengikuti langkah di Path API tentang cara Mengautentikasi Pengguna. Dalam proses autentikasi tutorial, pengguna mulai dialihkan ke URL berikut dan diminta untuk memberikan akses:

https://partner.path.com/oauth2/authenticate?response_type=code&client_id=THE_CLIENT_ID

Dan setelah itu, server akan memberikan respon berupa kode otorisasi melalui Alamat URL (saya telah menyelesaikan langkah ini dan mendapatkan kode).

Seperti yang dijelaskan dalam dokumen, Kode harus ditukar dengan token akses menggunakan /oauth2/access_token selama dengan ID Klien dan Rahasia Klien (dapatkan access_token)

Tapi saya tidak tahu cara POST data melalui cURL ke server, saya telah mencoba begitu banyak opsi dan kombinasi curl_setopt(), tetapi tetap tidak menghasilkan apa-apa.

Dari Dokumen, Permintaan terlihat seperti ini:

POST /oauth2/access_token HTTP/1.1
Host: partner.path.com
Content-Type: application/x-www-form-urlencoded
Content-Length: <LENGTH>

grant_type=authorization_code&client_id=CLIENT&client_secret=SECRET&code=CODE

Dan format cURL seperti ini:

curl -X POST \
     -F 'grant_type=authorization_code' \
     -F 'client_id=CLIENT_ID' \
     -F 'client_secret=CLIENT_SECRET' \
     -F 'code=CODE' \
     https://partner.path.com/oauth2/access_token

Dan server akan memberikan respon seperti ini:

HTTP/1.1 201 CREATED
Content-Type: application/json
Content-Length: <LENGTH>

{
    "code": 201,
    "type": "CREATED"
    "reason": "Created",
    "access_token": <ACCESS_TOKEN>,
    "user_id": <USER_ID>,
}

person Jhonny Jr.    schedule 14.07.2015    source sumber


Jawaban (3)


Untuk melakukan permintaan POST di PHP dengan cURL, Anda dapat melakukan sesuatu seperti:

$handle = curl_init('https://partner.path.com/oauth2/access_token');
$data = array('grant_type' => 'authorization_code', 'client_id' => 'CLIENT', 'client_secret' => 'SECRET', 'code' => 'CODE');
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
$resp = curl_exec($handle);

Anda kemudian dapat menggunakan json_decode($json_encoded) untuk mendapatkan array asosiatif dari respons server.

person Tris Emmy Wilson    schedule 14.07.2015
comment
Saya sudah menggunakan cara itu dan menguji ulang lagi, tetapi masih tidak berhasil :( masih memberi saya halaman kosong meskipun saya sudah menggunakan echo/print_r/var_dump dari variabel $resp - person Jhonny Jr.; 15.07.2015
comment
Apakah ini tidak berfungsi, atau Anda mendapatkan pesan kesalahan? Apakah Anda mendapat respons sama sekali dari server? - person Tris Emmy Wilson; 15.07.2015
comment
Tidak, saya tidak mendapat respons apa pun dari server, hanya saja tidak berfungsi :( tetapi ketika saya menguji menggunakan Tukang Pos, itu berfungsi dengan baik - person Jhonny Jr.; 15.07.2015
comment
Anda harus menggunakan http_build_query($data) jika tidak, content-type tidak akan disetel ke x-www-form-urlencoded - person Hans Z.; 15.07.2015

Tidak yakin apakah Anda sudah mengetahuinya atau belum karena saya melihatnya beberapa waktu yang lalu, tetapi saya baru saja mengalami masalah ini dan beginilah cara saya memecahkannya.

$code = $_GET['code'];
$url = 'https://YourPath/token?response_type=token&client_id='.$client_id.'&client_secret='.$client_secret.'&grant_type=authorization_code&code='.$code.'&redirect_uri='.$redirect_uri;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST,true);

$exec = curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info);
curl_close($ch);

$json = json_decode($exec);
if (isset($json->refresh_token)){
global $refreshToken;
$refreshToken = $json->refresh_token;
}

$accessToken = $json->access_token;
$token_type = $json->token_type;
print_r($json->access_token);
print_r($json->refresh_token);
print_r($json->token_type);

Semoga itu bisa membantu

person DennisOakdale    schedule 07.06.2016

selain jawaban Fox Wilson:

curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
person AlexanderPop    schedule 03.11.2017
comment
Anda harus menambahkan ini sebagai komentar terhadap dugaan jawaban oleh @Fox Wilson - person Otieno Rowland; 03.11.2017
comment
Tadinya saya akan melakukannya, tetapi Anda harus memiliki 50 reputasi untuk berkomentar - person AlexanderPop; 05.11.2017