PayPal AdaptivePayments Детали платежа PayKey

Я использую PayPal Pay API с адаптивными (цепными) платежами. Я пытаюсь перенаправить пользователя в PayPal, а затем вернуться к моему предопределенному return_url.

Проблема в том, что мне нужно иметь PayKey в моем возвращаемом URL-адресе. Причина этого: мне нужно вызвать API PaymentDetail для просмотра платежа в return_url. И я не хочу использовать IPN, так как мне нужна проверка с некоторым токеном прямо на моем обратном URL-адресе.

У меня есть проблема: PayKey генерируется со всеми параметрами, включая возвращаемый URL-адрес (следовательно, после того, как я создаю фактический массив, из которого я получаю свой ответ $. Я не могу поместить PayKey в возвращаемый URL-адрес так как он еще не сгенерирован на данный момент.

  //Create request payload with minimum required parameters
  $bodyparams = array ("requestEnvelope.errorLanguage" => "en_US",
                       "actionType" => "PAY",
                       "currencyCode" => "USD",
                       "cancelUrl" => "http://www.paypal.com", 
                       "returnUrl" => $return_url . "&payKey=${payKey}",  **// Does not work - PAYKEY NEEDED TO ADD???**
                       "receiverList.receiver(0).email" => "[email protected]", //TODO
                       "receiverList.receiver(0).amount" => $price, //TODO
                       "receiverList.receiver(0).primary" => "true", //TODO
                       "receiverList.receiver(1).email" => "[email protected]", //TODO
                       "receiverList.receiver(1).amount" => $receiver_gets, //TODO
                       "receiverList.receiver(1).primary" => "false" //TODO
                       );

   // convert payload array into url encoded query string
   $body_data = http_build_query($bodyparams, "", chr(38));   // Generates body data

   try
   {
     //create request and add headers
     $params = array("http" => array(
                     "method" => "POST",
                     "content" => $body_data,
                     "header" =>  "X-PAYPAL-SECURITY-USERID: " . $API_UserName . "\r\n" .
                     "X-PAYPAL-SECURITY-SIGNATURE: " . $API_Signature . "\r\n" .
                     "X-PAYPAL-SECURITY-PASSWORD: " . $API_Password . "\r\n" .
                     "X-PAYPAL-APPLICATION-ID: " . $API_AppID . "\r\n" .
                     "X-PAYPAL-REQUEST-DATA-FORMAT: " . $API_RequestFormat . "\r\n" .
                     "X-PAYPAL-RESPONSE-DATA-FORMAT: " . $API_ResponseFormat . "\r\n"
                     ));

     //create stream context
     $ctx = stream_context_create($params);

     //open the stream and send request
     $fp = @fopen($url, "r", false, $ctx);

     //get response
     $response = stream_get_contents($fp);

     //check to see if stream is open
     if ($response === false) {
         throw new Exception("php error message = " . "$php_errormsg");
     }

     fclose($fp);

     //parse the ap key from the response
     $keyArray = explode("&", $response);

     foreach ($keyArray as $rVal){
       list($qKey, $qVal) = explode ("=", $rVal);
               $kArray[$qKey] = $qVal;
     }

     //set url to approve the transaction
     $payPalURL = "https://www.sandbox.paypal.com/webscr?cmd=_ap-payment&paykey=" . $kArray["payKey"]; **// Here it works fine, since the PayKey is generated at this point ...**

     //print the url to screen for testing purposes
     If ( $kArray["responseEnvelope.ack"] == "Success") {
       echo '<p><a href="' . $payPalURL . '" target="_blank">' . $payPalURL . '</a></p>';
      }
     else {
       echo 'ERROR Code: ' .  $kArray["error(0).errorId"] . " <br/>";
       echo 'ERROR Message: ' .  urldecode($kArray["error(0).message"]) . " <br/>";
     }

Кто-нибудь может помочь?


person Sven Koluem    schedule 06.02.2011    source источник


Ответы (4)


Я тоже был в этом целую вечность. Я наконец-то понял. Документы Paypal трудно понять. Я нашел ответ в адаптивном руководстве PayPal в формате PDF, которое я скачал. Он указывает добавить payKey=${payKey} в конец вашего return_url. Я только что попробовал это там, и запрос PayPal на мой обратный URL теперь содержит ключ оплаты.

Итак, в рельсах, которые я использую, return_url выглядит так. Запись переменной php (я думаю) в URL-адрес в соответствии с инструкциями руководства

:return_url      => "http://***********.com/paypal-return?payKey=${payKey}"
person loubotics    schedule 17.10.2014
comment
Это очень просто. Я просматривал документы IPN PayPal, увидел это и подумал, что мне просто нужно добавить его к URL-адресу, и, конечно же. Идеально. - person Blake Connally; 30.08.2016

Кажется, вы пропустили шаг в последовательности.

Первый шаг — отправить параметры транзакции на

https://svcs.paypal.com/AdaptivePayments/Pay&yourtransactionparameters=blah
[sandbox]https://svcs.sandbox.paypal.com/AdaptivePayments/Pay&yourtransactionparameters=blah

Вы получите ключ оплаты в этом ответе.

Как только вы успешно получите ключ оплаты, вы позвоните:

https://www.paypal.com/webscr&cmd=_ap-payment&paykey=xxxx
[sandbox]https://www.sandbox.paypal.com/webscr&cmd=_ap-payment&paykey=xxxx

Во втором вызове payKey представляет остальную часть вашей транзакции, поэтому вам не нужно создавать еще одну гигантскую строку запроса.

person moluv00    schedule 02.03.2012

Измените свой код для:

//Create request payload with minimum required parameters
  $bodyparams = array ("requestEnvelope.errorLanguage" => "en_US",
                       "actionType" => "PAY",
                       "currencyCode" => "USD",
                       "cancelUrl" => "http://www.paypal.com", 
                       "returnUrl" => $return_url . '&payKey=${payKey}',  **// That's right**
                       "receiverList.receiver(0).email" => "[email protected]", //TODO
                       "receiverList.receiver(0).amount" => $price, //TODO
                       "receiverList.receiver(0).primary" => "true", //TODO
                       "receiverList.receiver(1).email" => "[email protected]", //TODO
                       "receiverList.receiver(1).amount" => $receiver_gets, //TODO
                       "receiverList.receiver(1).primary" => "false" //TODO
                       );

PHP интерпретирует ${payKey} как переменную, заключенную в двойные кавычки. Измените двойные кавычки (") на простые кавычки (')

person Yuri Giovani    schedule 04.09.2013