2012-07-31 46 views
8

Estoy tratando de usar la API de pagos adaptables de Paypal y tengo dificultades para cambiarlo a producción. Todo funciona como se espera en el modo de espacio aislado y obtengo una respuesta adecuada, pero cuando cambio a mi ID de aplicación en vivo, no funciona.Paypal Adaptive Payments funciona en modo sandbox pero no en la producción

Estos son los valores de configuración que estoy usando para caja de arena

PayPal URL : https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay?paykey=[TOKEN_HERE] 
Application ID : APP-80W284485P519543T 

Estos valores me funcionan en el modo de recinto de seguridad. Pero cuando cambio a los valores de producción inferiores, deja de funcionar

PayPal URL : https://www.paypal.com/webapps/adaptivepayment/flow/pay?paykey=[TOKEN_HERE] 
Application ID : [ACTUAL APP ID] 

This is what I mean by stops working. 
  • En el modo de producción, la aplicación obtiene el paykey
  • lo anexa a la URL de Paypal y luego lo redirige a su sitio
  • en carga del sitio, me sale el siguiente mensaje

This transaction has already been approved. Please visit your PayPal Account Overview to see the details 

La URL final que termina en - https://ic.paypal.com/webapps/adaptivepayment/flow/payinit?execution=e6s1

Imágenes - http://screencast.com/t/28qJZ9CIk

También hay un botón 'Volver' allí, y cuando hago clic en él me sale llevado a un sitio diferente cada vez (se parece me envían al azar) failUrls

que he incluido el código que utilizo a continuación

$payRequest = new PayRequest(); 
$payRequest->actionType  = "PAY"; 
$payRequest->cancelUrl  = $cancelURL; //my success and fail urls 
$payRequest->returnUrl  = $returnURL; 

$payRequest->clientDetails = new ClientDetailsType(); 
$payRequest->clientDetails->applicationId = $this->config['application_id']; 
$payRequest->clientDetails->deviceId  = $this->config['device_id']; 
$payRequest->clientDetails->ipAddress  = $this->CI->input->ip_address(); 

$payRequest->currencyCode = $currencyCode; 

$payRequest->requestEnvelope = new RequestEnvelope(); 
$payRequest->requestEnvelope->errorLanguage = "en_US"; 

//I set the receiver and the amounts. I also define that these are digital goods payments  
$receiver1 = new receiver(); 
$receiver1->email = $opts['receiver_email']; 
$receiver1->amount = $opts['amount']; 
$receiver1->paymentType = 'DIGITALGOODS'; 
$payRequest->receiverList = new ReceiverList(); 
$payRequest->receiverList = array($receiver1); 

//Then I make the call 
$ap   = new AdaptivePayments(); 
$response = $ap->Pay($payRequest); 

if(strtoupper($ap->isSuccess) == 'FAILURE') { 
    log_message('error', "PAYMENT_FAIL : " . print_r($ap->getLastError(), true)); 
    return false; 
} else { 
    if($response->paymentExecStatus == "COMPLETED") { 
     header("Location: " . $this->config['success_url']); 
     exit; 
    } else { 
     $token  = $response->payKey; 
     $payPalURL = $this->config['paypal_redirect_url'] . 'paykey='.$token; 
     header("Location: ".$payPalURL); 
     exit; 
    } 
} 

Este es el código tomado de su aplicación de la muestra, así que no es seguro ¿Qué está mal aquí? Otra información que pueda ser relevante

  • estoy usando los pagos de adaptación para asegurarse de que el emisor y el receptor realmente hizo la transacción

  • he puesto el tipo de pago como 'bienes digitales'

EDITAR

he incluido un ejemplo de URL con t él pagó clave adjunta

https://www.paypal.com/webapps/adaptivepayment/flow/pay?paykey=AP-0H388650F08226841 
+1

¿Se puede incluir un eco de $ payPalURL? – Robert

+2

@Robert seguro, he actualizado la pregunta con esa información. – JohnP

Respuesta

4

Encontré el problema que me estaba dando todo este dolor.

El SDK de PayPal utiliza un par de constantes que se definen en /sdk/lib/Config/paypal_sdk_clientproperties

Las constantes contienen el nombre de usuario, contraseña, APPLICATION_ID la URL activos y de algunos otros. Estos se usan directamente en el archivo /sdk/lib/CallerServices,php. Por lo tanto, al contrario de lo que esperaría en una API, estos valores no se inyectan en la fase de configuración, por lo que si no observa ese archivo y cambia los valores, el código anterior no funcionará.

Para solucionar el problema, simplemente actualice los valores definidos en el archivo y debería estar listo para empezar.

Cuestiones relacionadas