php - 定期付款 Paypal Express Checkout .....

标签 php paypal payment-gateway paypal-subscriptions

当我关注 paypal Existing Example 时,我无法在 paypal 快速结帐中获取订单信息,我该怎么做,我给出了我无法获取订单信息的地方,如下所示 -

/** SetExpressCheckout NVP example; last modified 08MAY23.
 *
 *  Initiate an Express Checkout transaction. 
*/

$environment = 'sandbox';   // or 'beta-sandbox' or 'live'

/**
 * 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('super_secret_username');
    $API_Password = urlencode('super_secret_password');
    $API_Signature = urlencode('super_secret_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');

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

    // Turn off the server and peer verification (TrustManager Concept).
    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;
}

// Set request-specific fields.
$paymentAmount = urlencode('105.87');
$currencyID = urlencode('USD');                         // or other currency code ('GBP', 'EUR', 'JPY', 'CAD', 'AUD')
$paymentType = urlencode('Authorization');              // or 'Sale' or 'Order'

$returnURL = urlencode("http://localhost/paypal/new/success.php");
$cancelURL = urlencode('http://localhost/paypal/new/cencel.php');

// Add request-specific fields to the request string.
$nvpStr = "&Amt=$paymentAmount&ReturnUrl=$returnURL&CANCELURL=$cancelURL&PAYMENTACTION=$paymentType&CURRENCYCODE=$currencyID";


// Execute the API operation; see the PPHttpPost function above.
$httpParsedResponseAr = PPHttpPost('SetExpressCheckout', $nvpStr);

if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) {
    // Redirect to paypal.com.
    $token = urldecode($httpParsedResponseAr["TOKEN"]);
    $payPalURL = "https://www.paypal.com/webscr&cmd=_express-checkout&token=$token";
    if("sandbox" === $environment || "beta-sandbox" === $environment) {
        $payPalURL = "https://www.$environment.paypal.com/webscr&cmd=_express-checkout&token=$token";
    }
    header("Location: $payPalURL");
    exit;
} else  {
    exit('SetExpressCheckout failed: ' . print_r($httpParsedResponseAr, true));
}

使用此脚本我如何获得订单总数。

我需要使用 Payal Express Checkout 进行 Paypal 定期付款的脚本。我还需要更新并取消定期付款。

最佳答案

要成功发布您的代码,必须设置一些额外的参数。如果比较两个示例,我还会清除一些您会发现的其他错误。主要有:

  1. $returnURL$cancelURL必须是真实的 URL 并且没有方法 urlencode()

  2. $version必须设置为 urlencode('124.0') ;

  3. SetExpressCheckout 的参数必须按照示例中的设置。

  4. 我建议在线测试,只需在 $0.01 中设置价格即可

    按照下面的例子:

 

<br/>/** SetExpressCheckout NVP example; last modified 08MAY23.
 *
 *  Initiate an Express Checkout transaction. 
*/

$environment = 'live';   // or 'beta-sandbox' or 'live'<br/>

/**
 * 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
 */
<br/>
function PPHttpPost($methodName_, $nvpStr_) {<br/>
    global $environment;<br/>
<br/>
    // Set up your API credentials, PayPal end point, and API version.<br/>
    $API_UserName = urlencode('super_secret_username');<br/>
    $API_Password = urlencode('super_secret_password');<br/>
    $API_Signature = urlencode('super_secret_signature');<br/>
    $API_Endpoint = "https://api-3t.paypal.com/nvp";<br/>
    if("sandbox" === $environment || "beta-sandbox" === $environment) {<br/>
        $API_Endpoint = "https://api-3t.$environment.paypal.com/nvp";<br/>
    }<br/>
    $version = urlencode('124.0');<br/>
<br/>
    // Set the curl parameters.<br/>
    $ch = curl_init();<br/>
    curl_setopt($ch, CURLOPT_URL, $API_Endpoint);<br/>
    curl_setopt($ch, CURLOPT_VERBOSE, 1);<br/>
<br/>
    // Turn off the server and peer verification (TrustManager Concept).<br/>
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);<br/>
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);<br/>
<br/>
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br/>
    curl_setopt($ch, CURLOPT_POST, 1);<br/>
<br/>
    // Set the API operation, version, and API signature in the request.<br/>
    $nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature&$nvpStr_";<br/>
<br/>
    // Set the request as a POST FIELD for curl.<br/>
    curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);<br/>
<br/>
    // Get response from the server.<br/>
    $httpResponse = curl_exec($ch);<br/>

    if(!$httpResponse) {<br/>
        exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')');<br/>
    }<br/>
<br/>
    // Extract the response details.<br/>
    $httpResponseAr = explode("&", $httpResponse);<br/>
<br/>
    $httpParsedResponseAr = array();<br/>
    foreach ($httpResponseAr as $i => $value) {<br/>
        $tmpAr = explode("=", $value);<br/>
        if(sizeof($tmpAr) > 1) {<br/>
            $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];<br/>
        }<br/>
    }<br/>
<br/>
    if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {<br/>
        exit("Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint.");<br/>
    }<br/>
<br/>
    return $httpParsedResponseAr;<br/>
}<br/>

// Set request-specific fields.
$paymentAmount = urlencode('105.87');
$currencyID = urlencode('USD');                         // or other currency code ('GBP', 'EUR', 'JPY', 'CAD', 'AUD')
$paymentType = urlencode('Authorization');              // or 'Sale' or 'Order'
<br/>
$returnURL = "http://localhost/paypal/new/success.php"; // Please provide a real URL !!!!!<br/>
$cancelURL = 'http://localhost/paypal/new/cencel.php'; // Please provide a real URL !!!!!<br/>

//Parameters for SetExpressCheckout, which will be sent to PayPal   <br/>
$paypal_data =  array(
    'RETURNURL'                     => $returnURL,<br/>
    'CANCELURL'                     => $cancelURL,<br/>
    'PAYMENTREQUEST_0_CURRENCYCODE' => $$currencyID,<br/>
    'PAYMENTREQUEST_0_PAYMENTACTION'=> 'SALE',<br/>
    'PAYMENTREQUEST_0_DESC'         => 'Hosted Saas Tier 1 and Community Management Services',<br/>
    'PAYMENTACTION'                 => $paymentType,<br/>
    'L_BILLINGTYPE0'                => 'RecurringPayments',<br/>
    'L_BILLINGAGREEMENTDESCRIPTION0'=> 'Description of Community Management Services',<br/>
    'L_PAYMENTREQUEST_0_NAME0'      => 'Community Management Services 8 hours for $0.01',<br/>
    'L_PAYMENTREQUEST_0_NUMBER0'    => '010101',<br/>
    'L_PAYMENTREQUEST_0_QTY0'       => '1',<br/>
    'L_PAYMENTREQUEST_0_AMT0'       => $paymentAmount,<br/>
<br/>
    /**
     * If you want second recurring payment in the same session
     * 'L_BILLINGTYPE1'             => 'RecurringPayments',
     * 'L_BILLINGAGREEMENTDESCRIPTION1'=> 'Description of Hosted Saas Tier 1',
     * 'L_PAYMENTREQUEST_0_NAME1'       => 'Hosted Saas Tier 1',
     * 'L_PAYMENTREQUEST_0_NUMBER1' => '212121',
     * 'L_PAYMENTREQUEST_0_QTY1'        => '1',
     * 'L_PAYMENTREQUEST_0_AMT1'        => '0.02',
     */<br/>
    'PAYMENTREQUEST_0_ITEMAMT'      => $paymentAmount,
    'PAYMENTREQUEST_0_AMT'          => $paymentAmount

);

$nvpStr = http_build_query($paypal_data);<br/>
// Execute the API operation; see the PPHttpPost function above.<br/>
$httpParsedResponseAr = PPHttpPost('SetExpressCheckout', $nvpStr);<br/>

if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) {<br/>
    // Redirect to paypal.com.<br/>
    $token = urldecode($httpParsedResponseAr["TOKEN"]);<br/>
    $payPalURL = "https://www.paypal.com/webscr&cmd=_express-checkout&token=$token";<br/>
    if("sandbox" === $environment || "beta-sandbox" === $environment) {<br/>
        $payPalURL = "https://www.$environment.paypal.com/webscr&cmd=_express-checkout&token=$token";<br/>
    }<br/>
    header("Location: $payPalURL");<br/>
    exit;<br/>
} else  {<br/>
    exit('SetExpressCheckout failed: ' . print_r($httpParsedResponseAr, true));<br/>
}<br/>

关于php - 定期付款 Paypal Express Checkout .....,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9633742/

相关文章:

php - 使用 PayPal 即时付款通知时使用 PHP 获取自定义变量的值

php - Paypal -快速结帐-购物车项目金额总计与订单金额不符(10413)

asp.net - 一些发卡银行拒绝 3D Secure 请求

php - 需要按日期逐行阅读

php - 能够通过“添加到购物车”网址传递变量并在结帐时查询它们吗?

php - fgets() : SSL: An existing connection was forcibly closed by the remote host

stripe-payments - 使用异步 3DS 付款和 webhook 进行订单确认

php - 取消 Paypal 定期付款

php - 根据单击的特定提交按钮的值更新列

php - 如何在外部调用PHP函数