PayPal沙箱DoExpressCheckout API仅在使用信用卡付款时始终返回10422或10486

时间:2017-06-26 04:03:20

标签: php paypal

我是EC经理。生产中的PayPal支付工作没有问题,但开发中存在问题(沙箱环境)。

如标题中所述,当仅通过信用卡付款时,通过PHP的DoExpressCheckout API始终返回10422或10486错误代码。这意味着当沙盒帐户的PayPal余额足以支付项目时,它可以正常工作。

我怀疑我的沙箱帐户设置或我的php代码存在问题。

有没有人有解决这个问题的线索?

我的PHP代码。

<?php

/** DoExpressCheckoutPayment NVP example; last modified 08MAY23.
 *
 *  Complete an Express Checkout transaction. 
*/

require_once('paypal_configure.php'); // API settings

// Set request-specific fields.
$environment = ENVIRONMENT;  // sandbox
$paymentType = urlencode("Authorization"); // or 'Sale' or 'Order'
$currencyID  = urlencode(CURRENCY);

// Set parameter
$token         = urlencode($argv[1]);
$payerID       = urlencode($argv[2]);
$paymentAmount = urlencode($argv[3]);
$invNum        = urlencode($argv[4]);

/**
 * Send HTTP POST Request
 *
 * @param   string  The API method name
 * @param   string  The POST Message fields in &name=value pair format
 * @return  array   Parsed HTTP Response body
 */
function PPHttpPost($methodName_, $nvpStr_) {
    global $environment;

    // Set up your API credentials, PayPal end point, and API version.
    $API_UserName  = urlencode(API_USERNAME);
    $API_Password  = urlencode(API_PASSWORD);
    $API_Signature = urlencode(API_SIGNATURE);
    $API_Endpoint  = "https://api-3t.paypal.com/nvp";
    if("sandbox" === $environment || "beta-sandbox" === $environment) {
        $API_Endpoint = "https://api-3t.$environment.paypal.com/nvp";
    }
    $version = urlencode('51.0');

    // setting the curl parameters.
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $API_Endpoint);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);

    // Set the curl parameters.
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);

    // Set the API operation, version, and API signature in the request.
    $nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_";

    // Set the request as a POST FIELD for curl.
    curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);

    // Get response from the server.
    $httpResponse = curl_exec($ch);

    if(!$httpResponse) {
        exit('$methodName_ failed: '.curl_error($ch).'('.curl_errno($ch).')');
    }

    // Extract the response details.
    $httpResponseAr = explode("&", $httpResponse);

    $httpParsedResponseAr = array();
    foreach ($httpResponseAr as $i => $value) {
        $tmpAr = explode("=", $value);
        if(sizeof($tmpAr) > 1) {
            $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
        }
    }

    if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {
        exit("Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint.");
    }

    return $httpParsedResponseAr;
}

/**
 * This example assumes that a token was obtained from the SetExpressCheckout API call.
 * This example also assumes that a payerID was obtained from the SetExpressCheckout API call
 * or from the GetExpressCheckoutDetails API call.
 */

// Add request-specific fields to the request string.
$nvpStr  = "&TOKEN=$token&PAYERID=$payerID&PAYMENTACTION=$paymentType&AMT=$paymentAmount&CURRENCYCODE=$currencyID";
$nvpStr .= "&INVNUM=$invNum";
// Execute the API operation; see the PPHttpPost function above.
$httpParsedResponseAr = PPHttpPost('DoExpressCheckoutPayment', $nvpStr);

// result
$resAck  = strtoupper($httpParsedResponseAr["ACK"]);
$resTime = urldecode($httpParsedResponseAr["TIMESTAMP"]);

if( $resAck == "SUCCESS" || $resAck == "SUCCESSWITHWARNING" ) {
        // get result
        $resCode   = "10000";
        $resMsg    = "_";
        $resTranid = urldecode($httpParsedResponseAr["TRANSACTIONID"]);
        $resAmount = urldecode($httpParsedResponseAr["AMT"]);
}
else {
        // get result
        $resCode   = $httpParsedResponseAr["L_ERRORCODE0"];
        $resMsg    = mb_ereg_replace(" ","###SPACE###",urldecode($httpParsedResponseAr["L_LONGMESSAGE0"]));
        $resTranid = "_";
        $resAmount = "_";
}

// return text
$rtnText  = "";
$rtnText  =     $resAck;
$rtnText .= " ".$resCode;
$rtnText .= " ".$resMsg;
$rtnText .= " ".$resTranid;
$rtnText .= " ".$resAmount;
$rtnText .= " ".$token;
$rtnText .= " ".$payerID;
$rtnText .= " ".$invNum;
$rtnText .= " ".$resTime;
$rtnText .= "\n";
echo $rtnText;
exit(0);

?>

1 个答案:

答案 0 :(得分:0)

有时沙盒帐户搞砸了。尝试创建一个新的沙盒买家帐户,并确保在此过程中添加信用卡。