2012-03-02 37 views
9

Básicamente estoy tratando de usar la llamada PAY de Adaptive Payments para enviar fondos desde mi cuenta de PayPal a otras cuentas de forma programática e inmediata. According to the documentation, siempre que especifique el remitenteEmail (mi propia dirección de PayPal, utilizada para configurar los Pagos adaptables), esto debería funcionar al pie de la letra.Paypal Adaptive Pay IMPLICIT Pay API

Sin embargo, cuando realizo la llamada, siempre obtengo el resultado "CREADO" en lugar de "COMPLETADO". Creado significa que el sistema todavía quiere que inicie sesión manualmente en PayPal y apruebe los pagos. Realmente necesito que estos pagos ocurran automáticamente en el momento. Cualquier ayuda sería apreciada.

Aquí es mi cadena de solicitud:

currencyCode=USD& 
returnUrl=http%3A%2F%2Fwww.website.com%2F& 
actionType=PAY& 
cancelUrl=http%3A%2F%2Fwww.website.com%2F& 
receiverList.receiver%280%29.email=receiver%40gmail.com& 
receiverList.receiver%280%29.amount=1.00& 
requestEnvelope.senderEmail=me%40gmail.com& 
clientDetails.deviceId=mydevice& 
clientDetails.ipAddress=127.0.0.1& 
clientDetails.applicationId=APP-ZZZZZZZZZZZZZ& 
requestEnvelope.errorLanguage=en_US& 
memo=memo& 
feesPayer=EACHRECEIVER& 
ipnNotificationUrl=http%3A%2F%2Fwww.website.com%2Fpay.php 

Y aquí es la respuesta de PayPal:

[responseEnvelope.timestamp] => 2012-03-01T19:09:57.290-08:00 
[responseEnvelope.ack] => Success 
[responseEnvelope.correlationId] => 71efd416a2100 
[responseEnvelope.build] => 2486531 
[payKey] => AP-ZZZZZZZZZZZZZZZ 
[paymentExecStatus] => CREATED 
+0

En el caso mencionado anteriormente, ¿requiere PayPal que vuelva a ingresar la contraseña? – Sripaul

Respuesta

21

olvidar todo lo que he dicho antes. El problema no es una incoherencia entre Sandbox y Live tampoco, sino un parámetro incorrecto para 'senderEmail'.

basta con cambiar:

[email protected]& 

Para:

[email protected]& 

Por ejemplo, las siguientes declaraciones de un 'COMPLETADO' pago implícita.

<?php 

function AdaptiveCall($bodyparams, $method, $payKey) { 

try 
{ 

    $body_data = http_build_query($bodyparams, "", chr(38)); 
    $url = trim("https://svcs.sandbox.paypal.com/AdaptivePayments/".$method.""); 
    $params = array("http" => array( 
         "method" => "POST", 
         "content" => $body_data, 
          "header" => "X-PAYPAL-SECURITY-USERID: xxxxxxxxx\r\n" . 
             "X-PAYPAL-SECURITY-SIGNATURE: xxxxxxxxxxx\r\n" . 
             "X-PAYPAL-SECURITY-PASSWORD: xxxxxxx\r\n" . 
             "X-PAYPAL-APPLICATION-ID: APP-80W284485P519543T\r\n" . 
             "X-PAYPAL-REQUEST-DATA-FORMAT: NV\r\n" . 
             "X-PAYPAL-RESPONSE-DATA-FORMAT: NV\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"); 
    } 

    //close the stream 
    fclose($fp); 

    //parse the ap key from the response 

    $keyArray = explode("&", $response); 

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

//print the response to screen for testing purposes 
    If ($kArray["responseEnvelope.ack"] == "Success") { 
     echo "<strong>".$method ."</strong><br>"; 
     foreach ($kArray as $key =>$value){ 
     echo $key . ": " .$value . "<br/>"; 

    } 
    // Return payKey 
    global $payKey; 
    if(!empty($kArray['payKey'])) { $payKey = $kArray['payKey']; return($payKey); } 

    } 
    else { 
     echo 'ERROR Code: ' . $kArray["error(0).errorId"] . " <br/>"; 
     echo 'ERROR Message: ' . urldecode($kArray["error(0).message"]) . " <br/>"; 
    } 

    } 


catch(Exception $e) { 
    echo "Message: ||" .$e->getMessage()."||"; 
    } 
} 



//Create Pay body 
$bodyparams = array ( "requestEnvelope.errorLanguage" => "en_US", 
         'actionType' => 'PAY', 
         'currencyCode' => 'USD', 
         'receiverList.receiver(0).email' => '[email protected]', 
         'receiverList.receiver(0).amount' => '1.00', 
         'senderEmail' => 'xxxxxxxxx', 
         'memo' => 'Test memo', 
         'ipnNotificationUrl' => 'http://xxxxxxxx', 
         'cancelUrl' => 'http://xxxxxxxxx', 
         'returnUrl' => 'http://xxxxxxxxxx' 
        ); 

        // Call Pay API 
AdaptiveCall($bodyparams, "Pay"); 

?> 

respuesta de Pago:
responseEnvelope.timestamp: 2012-03-03T09% 3A10% 3A00% 3A22.900-08
responseEnvelope.ack: Éxito
responseEnvelope.correlationId: 4bc5cfc4a7514
responseEnvelope.build: 2486531
payKey: AP-1XJ7636763429720C
paymentExecStatus: Completo

+17

¿Puedo comprarle una taza de café o algo así? =) –

+0

Estoy haciendo más o menos lo mismo. Pero no sé qué hacer con 'returnUrl' y' cancelUrl'. ¿Podríamos omitirlos cuando no hay flujo web? –

+0

De acuerdo con PayPal "** siempre se requiere ** pero solo se usa para pagos que requieren aprobación (pagos explícitos)", por lo que puede utilizar algunas URL falsas – Matanya

Cuestiones relacionadas