Paypal Adaptive Payments works in sandbox mode but not production

Viewed 3373

I'm trying to use Paypal's adaptive payments API and having a tough time switching it to production. Everything works as expected on sandbox mode and I get a proper response, but when I switch to my live APP ID it doesn't work.

These are the configuration values I'm using for sandbox

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

These values work for me in sandbox mode. But when I switch to the below production values, it stops working

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.
  • In production mode, the application gets the paykey
  • Appends it to the Paypal URL and then redirects it to their site
  • On site load, I get the following message

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

The final URL it ends up on - https://ic.paypal.com/webapps/adaptivepayment/flow/payinit?execution=e6s1

Screenshot - http://screencast.com/t/28qJZ9CIk

There is also a 'Return' button there, and when I click on it I get taken to a different site each time (Looks like I get sent to random failUrls)

I've included the code I use below

$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;
    }
}

This is code taken from their sample implementation, so not really sure what's going wrong here. Other information that might be relevant

  • I'm using adaptive payments to make sure that the sender and receiver actually did the transaction

  • I have set the payment type as 'DIGITAL GOODS'

EDIT

I've included a sample URL with the pay key attached

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