2017-01-11 26 views
1

にコマンドラインcURLの要求を変換すると、ここではその権限APIへのコマンドラインのcURL要求のPayPalの例です:は、PHPのcURLリクエスト(ペイパルAPI)

curl https://svcs.sandbox.paypal.com/Permissions/GetAccessToken \ 
-s \ 
--insecure \ 
-H "X-PAYPAL-SECURITY-USERID: api_username" \ 
-H "X-PAYPAL-SECURITY-PASSWORD: api_password" \ 
-H "X-PAYPAL-SECURITY-SIGNATURE: api_signature" \ 
-H "X-PAYPAL-REQUEST-DATA-FORMAT: NV" \ 
-H "X-PAYPAL-RESPONSE-DATA-FORMAT: NV" \ 
-H "X-PAYPAL-APPLICATION-ID: app_id" \ 
-d requestEnvelope.errorLanguage=en_US \ 
-d token=token \ 
-d verifier=code 

私は上記のコマンドでは、私の資格情報、トークンと検証を入力しようとしました私のコマンドラインにcURL行を入力し、正常な応答を受信しました。

しかし、私がPHPアプリケーションを試したときに、私は失敗応答を得ていません。ここに私のPHPのcURLのリクエストです:ここでは

class PayPalSession 
{ 
    private $devUsername; 
    private $devPassword; 
    private $devSignature; 
    private $appId; 

    public function __construct($devUsername, $devPassword, $devSignature, $applicationId, $format) 
    { 
     $this->devUsername = $devUsername; 
     $this->devPassword = $devPassword; 
     $this->devSignature = $devSignature; 
     $this->applicationId = $applicationId; 
     $this->format = $format; 
    } 


    /** sendHttpRequest 
     Sends a HTTP request to the server for this session 
     Input: $data 
     Output: The HTTP Response as a String 
    */ 
    public function sendHttpRequest($data, $endpoint) 
    { 
     //build eBay headers using variables passed via constructor 
     $headers = $this->buildPaypalHeaders(); 

     //initialise a CURL session 
     $connection = curl_init(); 
     //set the server we are using (could be Sandbox or Production server) 
     curl_setopt($connection, CURLOPT_URL, $endpoint); 

     //stop CURL from verifying the peer's certificate 
     curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0); 
     curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0); 

     //set the headers using the array of headers 
     curl_setopt($connection, CURLOPT_HTTPHEADER, $headers); 

     //set method as POST 
     curl_setopt($connection, CURLOPT_POST, 1); 

     //set the Json body of the request 
     curl_setopt($connection, CURLOPT_POSTFIELDS, $data); 

     //set it to return the transfer as a string from curl_exec 
     curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1); 

     //Send the Request 
     $response = curl_exec($connection); 

     //print $response; 

     //close the connection 
     curl_close($connection); 

     //return the response 
     return $response; 
    } 



    /** buildPayPalHeaders 
     Generates an array of string to be used as the headers for the HTTP request to PayPal 
     Output: String Array of Headers applicable for this call 
    */ 
    private function buildPaypalHeaders() 
    { 
     $headers = array (
      // API credentials for the API Caller account 
      'X-PAYPAL-SECURITY-USERID: ' . $this->devUsername, 
      'X-PAYPAL-SECURITY-PASSWORD: ' . $this->devPassword, 
      'X-PAYPAL-SECURITY-SIGNATURE: ' . $this->devSignature, 

      // Application ID 
      'X-PAYPAL-APPLICATION-ID: ' . $this->applicationId, 

      // Input and output formats 
      'X-PAYPAL-REQUEST-DATA-FORMAT : ' . $this->format, 
      'X-PAYPAL-RESPONSE-DATA-FORMAT : ' . $this->format, 
     ); 

     return $headers; 
    } 
} 

は、上記のコードに渡される変数です:もちろん$requestToken$verifierCode

$format = 'NV'; 
$endpoint = 'https://svcs.sandbox.paypal.com/Permissions/GetAccessToken' 
$data = "requestEnvelope%5BerrorLanguage%5D=en_US&token=$requestToken&verifier=$verificationCode" 

..andはPayPalで私に提供されたものに設定しました。 。

私の問題は、私が"CURLOPT_POSTFIELDS"に渡している$データにあると疑われています。書式は "NV"(name = valueまたはkey = value)となっていますが、PayPalの例の"requestEnvelope.errorLanguage=en_US"を見ると、単純なkey = valueのペアのようには見えません。

私はこの試みた:

$requestAsArray = array('requestEnvelope' => array("errorLanguage" => "en_US"), "token" => "$requestToken", "verifier" => "$verificationCode"); 

$data = http_build_query($requestAsArray); 

をしかし、まだペイパルAPIからの応答を受信しませんでした。 JSONとしてリクエストを送信し、$formatを「JSON」に変更しようとしましたが、APIにはname = value/key = valueリクエストが必要です。ここで

は彼らのAPIへの呼び出しのためのPayPalのドキュメントです:https://developer.paypal.com/docs/classic/permissions-service/integration-guide/PermissionsUsing/

任意の助けもいただければ幸いです!

答えて

0

もしNVP形式のヘッダを使用する場合

'X-PAYPAL-REQUEST-DATA-FORMAT : NV' 

要求アレイは

$requestAsArray = array(
     'requestEnvelope.errorLanguage' =>"en_US" 
     , "token" => "$requestToken" 
     , "verifier" => "$verificationCode" 
    ); 

れるべきであり、あなたはJSON形式

のヘッダを使用WHE次いで

$data = http_build_query($requestAsArray); 

を使用します

'X-PAYPAL-REQUEST-DATA-FORMAT : JSON' 

要求配列は

$requestAsArray = array(
    'requestEnvelope' => array("errorLanguage" => "en_US") 
    , "token" => "$requestToken" 
    , "verifier" => "$verificationCode"); 

でなければなりませんし、私はPaypal適応支払い呼び出しでこのメソッドを使用すると、それは常に動作します

$data = json_encode($requestAsArray); 

を使用しています。この場合でもうまくいくはずです。