【问题标题】:how to setup recurring payments in paypal如何在paypal中设置定期付款
【发布时间】:2013-12-17 16:12:35
【问题描述】:

我正在尝试使用 PHP 在贝宝中设置定期付款。但我遇到的问题是我不知道我做的是否正确。我有这个类向 Paypal API 发出请求:

<?php
class Paypal {

   protected $_errors = array();


   protected $_credentials = array(
      'USER' => 'my-user-id',
      'PWD' => 'my-pass',
      'SIGNATURE' => 'my-signature',
   );


   protected $_endPoint = 'https://api-3t.sandbox.paypal.com/nvp';


   protected $_version = '74.0';

   public function request($method,$params = array()) {
      $this -> _errors = array();
      if( empty($method) ) { 
         $this -> _errors = array('API method is missing');
         return false;
      }

      $requestParams = array(
         'METHOD' => $method,
         'VERSION' => $this -> _version
      ) + $this -> _credentials;


      $request = http_build_query($requestParams + $params);

      $http_header = array(
        'X-PAYPAL-SECURITY-USERID' => 'my-user-id',
        'X-PAYPAL-SECURITY-PASSWORD' => 'my-pass',
        'X-PAYPAL-SECURITY-SIGNATURE' => 'my-signature',
        'X-PAYPAL-REQUEST-DATA-FORMAT' => 'JSON',
        'X-PAYPAL-RESPONSE-DATA-FORMAT' => 'JSON'
      );


      $curlOptions = array (
        CURLOPT_HTTPHEADER => $http_header,
        CURLOPT_URL => $this -> _endPoint,
        CURLOPT_VERBOSE => 1,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $request
      );

      $ch = curl_init();
      curl_setopt_array($ch,$curlOptions);


      $response = curl_exec($ch);

      if (curl_errno($ch)) {
         $this -> _errors = curl_error($ch);
         curl_close($ch);
         return false;

      } else  {
         curl_close($ch);
         $responseArray = array();
         parse_str($response,$responseArray); 
         return $responseArray;
      }
   }
}
?>

然后我发出这样的初始请求:

session_start();
require_once('Paypal.php');
$paypal = new Paypal();
$amount = 1;

$requestParams = array(
   'RETURNURL' => 'http://localhost/tester/paypal/new_test/test_done.php',
   'CANCELURL' => 'http://localhost/tester/paypal/new_test/test_cancel.php',
   'NOSHIPPING' => '1',
   'ALLOWNOTE' => '1',
   'L_BILLINGTYPE0' => 'RecurringPayments',
   'L_BILLINGAGREEMENTDESCRIPTION0' => 'site donation'
);

$orderParams = array(
   'PAYMENTREQUEST_0_AMT' => '1',
   'PAYMENTREQUEST_0_CURRENCYCODE' => 'USD',
   'PAYMENTREQUEST_0_ITEMAMT' => $amount
);

$item = array(
   'L_PAYMENTREQUEST_0_NAME0' => 'site donation',
   'L_PAYMENTREQUEST_0_DESC0' => 'site donation',
   'L_PAYMENTREQUEST_0_AMT0' => $amount,
   'L_PAYMENTREQUEST_0_QTY0' => '1'
);


$response = $paypal->request('SetExpressCheckout', $requestParams + $orderParams + $item);
$sandbox_location = 'https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=';


if(is_array($response) && $response['ACK'] == 'Success'){
    $token = $response['TOKEN'];
    $_SESSION['token'] = $token;
    header('Location: ' . $sandbox_location . urlencode($token)); 
}

?>

如您所见,我正在使用SetExpressCheckout API 方法来获取我需要的令牌并将其存储在会话中,以便稍后在请求CreateRecurringPaymentsProfile 时使用它。

我目前被重定向到与此类似的页面:

一旦用户完成使用贝宝登录并确认金额,它将重定向到我指定的包含此代码的成功页面:

session_start();
require_once('Paypal.php');

$amount = 1;
$paypal = new Paypal();

$token_param = array('TOKEN' => $_SESSION['token']);

$current_date = date('Y-m-d');

$recurring_payment_params = array(
  'PROFILESTARTDATE' => gmdate('Y-m-d H:i:s', strtotime($current_date . ' + 1 months')),
  'DESC' => 'site donation',
  'BILLINGPERIOD' => 'Month',
  'BILLINGFREQUENCY' => '1',
  'TOTALBILLINGCYCLES' => '0',
  'AMT' => $amount
);


$recurringpayment_response = $paypal->request('CreateRecurringPaymentsProfile', $recurring_payment_params + $token_param);

这可行,我已经在沙盒帐户中验证了定期付款配置文件已创建,并且下一个到期帐单是下个月。但问题是,在他们为订阅付费的贝宝界面(前面的屏幕截图)中并没有真正可见。也许我弄错了重定向网址? (https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=) 还是我必须向 SetExpressCheckout 方法添加其他参数?请帮忙。

【问题讨论】:

    标签: php paypal


    【解决方案1】:

    您只显示登录屏幕。登录后,您将看到有关订阅的信息,按钮将显示“同意​​并付款”或“同意并继续”(取决于返回 URL 中的用户操作值),而不仅仅是“付款”或“继续”。

    【讨论】:

    • 顺便说一句,你可能对我的PHP class library for PayPal 感兴趣。它本质上与您在此处所做的相同,但它为您为每个可能的 API 调用设置了每个可能的参数,因此您所要做的就是填写值。它还包括 cmets,其中包含从 PayPal 文档中提取的每个参数的详细信息,因此确实可以节省大量时间。
    • 是的,如果我将快速结账设置为定期付款,则会出现同意并继续按钮,但在阅读文本后,似乎并不能直接看出它是定期付款。但是我在代码中的做法是正确的吧?
    • 从我看来它看起来不错,是的。如果您真的想确定,您只需确保您的客户知道他们正在注册订阅,然后再发送到 PayPal。
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2014-11-17
    • 2013-11-09
    • 2020-01-03
    • 2016-07-11
    • 2013-02-15
    • 2013-06-30
    相关资源
    最近更新 更多