2

PaypalのRESTfulWebサービスのアクセストークンを取得しようとしていますが、残念ながら前進していません。RESTを扱うのはこれが初めてなので、しばらくお待ちください:)

これが私が持っているものです:

  1. ペイパル開発者のウェブサイトを通じてサンドボックスアカウント用にペイパルから提供されたClient_idとシークレット。
  2. エンドポイント: https://api.sandbox.paypal.com/v1/oauth2/token

私が参照しているドキュメントは次のとおりです:https ://developer.paypal.com/webapps/developer/docs/integration/direct/make-your-first-call/

今、そのAPI呼び出しを行うことのジューシーな部分。私はPHPで開発しているので、CURLを使用して呼び出しを行っています。このようなもの;

const CLIENT_ID = ****..*** ;
const SECRET = ***..***;

$base64EncodedClientID = base64_encode(self::CLIENT_ID . ":" . self::SECRET);
$headers = array("Authorization" => "Basic " . $base64EncodedClientId, "Accept" =>"*/*", "Content-type" => "multipart/form-data");
$params = array("grant_type"=>"client_credentials");
$url = "https://api.sandbox.paypal.com/v1/oauth2/token";

 $ch = curl_init();
 curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch,CURLOPT_URL, $url);
 curl_setopt($ch,CURLOPT_POST, true);
 curl_setopt($ch,CURLOPT_HEADER, $headers);
 curl_setopt($ch,CURLOPT_POSTFIELDS,$params);
 $response = curl_exec($ch);    

かなりバニラでしょ?Paypalに期待するJSON応答が得られないことを除いて、falseです。これは、CURL要求が適切に準備されていないことを意味します。おそらく、ヘッダーを正しく設定していないか、パラメーターが正しくありません。とにかく、同じクレデンシャルを使用してコマンドラインからURLにアクセスでき、目的のJSON応答を取得できたため、URLには確実にアクセスできます。

上記のコードで私が抱えている明白な問題の1つは、ヘッダーオプションとしてclient_idとsecretを提供していることです。基本的な意味では、POSTフィールドデータの一部である必要があると言われています。ただし、このGithubコードの89行目を見ると、https://github.com/paypal/rest-api-sdk-php/blob/master/lib /PayPal/Auth/OAuthTokenCredential.php(Paypalsの公式PHP REST SDK)は、資格情報がヘッダーフィールドに設定されていることを明確に示しています。

どこをめちゃくちゃにしていますか?

4

2 に答える 2

3

curlを使用すると、Authorizationヘッダーのbase64エンコード値を手動で生成する必要はなく、CURLOPT_USERPWDオプションを使用して、clientIDとsecretをuser:pwdとして渡すだけです。

curl_setopt($curl, CURLOPT_USERPWD, $clientId . ":" . $clientSecret);

ここにサンプルがあります-get_access_token()メソッドを探してください: https ://github.com/paypal/rest-api-curlsamples/blob/master/execute_all_calls.php

于 2013-03-12T03:59:54.283 に答える
0

あなたが遭遇したのとまったく同じ問題がありました。問題は、PayPalがコンテンツタイプのapplication/x-www-form-urlencodedを受け入れることです。コードがmultipart/form-dataを送信しようとしています。CURLはデフォルトでapplication/x-www-form-urlencodedを送信しますが、データを配列として渡します。代わりに、urlエンコードされた文字列のようにデータを渡す必要があります。これはapplication/x-www-form-urlencodedデータのように見えるためです。

$params = "grant_type=client_credentials";

ヘッダーにも同じ問題があります。辞書ではなく文字列の配列として渡します。例えば:

$headers = ["Authorization Basic " . $base64EncodedClientId];

また、渡した他の2つのヘッダーは必要ありません。「Accept」ヘッダーはすべてを受け入れているため何もしません。Content-typeは1つでは間違っており、2つはデフォルトで「application/x-www-」になっています。 CURLによってform-urlencoded'なので、それをオーバーライドする必要がない限り、必要はありません。

于 2019-05-26T20:46:04.177 に答える