Как оплатить PayPal, а затем сохранить параметры из моей формы?

У меня есть рабочий сайт (HTML, начальная загрузка)

Он имеет форму, где я собираю различные данные о пользователе (например, электронная почта, даты). После нажатия кнопки "Готово" форма отправляет все данные на сервер (который я разработал на python). Сервер регистрирует пользователя, сохраняя все данные, собранные из формы.

Я хотел бы добавить платежную систему PayPal, чтобы пользователь оплачивал регистрацию, а затем был запущен мой серверный скрипт, и все данные, которые были в форме, будут сохранены. то же самое, что и сейчас, я просто хочу, чтобы пользователь заплатил, а затем сохранил данные.

Как посоветовали многие участники, я должен сделать "Метод оплаты экспресс-оплаты" (я прав?). Но объяснения, которые я видел в Интернете, не были ясны, и я не могу понять, как это сделать.

Как это можно сделать?

1 ответ

Объяснение того, как работает Express Checkout:

Экспресс-метод оплаты - это метод транзакции PayPal, который в основном разделен на 3 этапа:

  1. SetExpressCheckout: чтобы использовать Express Checkout, вы должны вызвать API SetExpressCheckout. В вызове API вы указываете детали продуктов, суммы и RETURNURL.
  2. GetExpressCheckout: после того, как покупатель согласился на вашу покупку, он перенаправляется обратно на URL, указанный вами в RETURNURL. Теперь вы должны показать подтверждение заказа и вызвать API GetExpressCheckoutDetails **. При вызове GetExpressCheckoutDetails укажите токен. В ответе API GetExpressCheckoutDetails вы найдете PayerID.
  3. DoExpressCheckout: теперь вы готовы вызвать DoExpressCheckoutPayment и выставить счет покупателю. Не забудьте указать токен и идентификатор PayerID при вызове DoExpressCheckoutPayment.

Сначала идет функция отмены. Если платеж отменен, будет вызван этот метод.

function payment_failure()
{
    echo "payment cancelled by the user";
}

Теперь приходит способ оплаты успешно:

function payment_success()
{
    // Obtain the token from PayPal.
    if(!array_key_exists('token', $_REQUEST)) 
         exit('Token is not received.');

    // Set request-specific fields.
    $token = urlencode(htmlspecialchars($_REQUEST['token']));

    // Add request-specific fields to the request string.
    $nvpStr = "&TOKEN=$token";

    // Execute the API operation; see the PPHttpPost function above.
    $httpParsedResponseAr = $this->PPHttpPost('GetExpressCheckoutDetails', $nvpStr);

    if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) 
      {
          $payerID = urlencode($httpParsedResponseAr["PAYERID"]);
          $paymentType = urlencode('Sale');             // or 'Sale' or 'Order'
          $paymentAmount = urlencode($_SESSION['total_amount']);
          $currencyID = urlencode($_SESSION['cur']);    // or other currency code ('GBP', 'EUR', 'JPY', 'CAD', 'AUD')


                $nvpStr = "&TOKEN=$token&PAYERID=$payerID&PAYMENTACTION=$paymentType&AMT=$paymentAmount&CURRENCYCODE=$currencyID";
                $httpParsedResponseAr = $this->PPHttpPost('DoExpressCheckoutPayment', $nvpStr);
                if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) 
                { 

                    $transaction_secret=md5(uniqid());

                    unset($_SESSION['fname']);
                    unset($_SESSION['lname']);
                    unset($_SESSION['email']);
                    unset($_SESSION['password']);
                    // save the data in the database along with a secret key to uniquely identify the user later(if needed).
                }
                else  
                {
                        exit('DoExpressCheckoutDetails failed: ' . print_r($httpParsedResponseAr, true));
                    //echo "Payment failed for unknown reason";
                }
          } 
      } 
  else  
      {
        //exit('GetExpressCheckoutDetails failed: ' . print_r($httpParsedResponseAr, true));
        echo "Payment failed for unknown reason";
      }
}

Первые два метода успеха и методы отмены. Теперь приходит функция, которая принимает данные из формы отправки и вызывает ExpressCheckout методы, передав параметр в ExpressCheckout метод...

function paypal_order()
{
        $_SESSION['fname'] = $_POST['fname']; // fetching the data submitted from the form
        $_SESSION['lname'] = $_SESSION['lname']);
        $_SESSION['email'] = $_SESSION['email']);
        $_SESSION['password'] = $_SESSION['password'];

        if($_SESSION['cur']=='USD')
            $currencyID = urlencode('USD');
        else if($_SESSION['cur']=='INR')
        {
            $_SESSION['cur'] = 'USD';
            $currencyID = urlencode('USD');
        }
        else if($_SESSION['cur']=='EUR')
            $currencyID = urlencode('EUR');
        else if($_SESSION['cur']=='GBP')
            $currencyID = urlencode('GBP');   

        $paymentType = urlencode('Order'); 

        $returnURL = (base_url()."paypal-payment-success"); // this call the payment_success() method using the router technique;
        $cancelURL = (base_url()."paypal-payment-failure");  // this call the payment_failure() method using the router technique;
        $nvpStr="&METHOD=SetExpressCheckout
&RETURNURL=$returnURL
&CANCELURL=$cancelURL"; 

        $i=0;
        $str = "
&L_PAYMENTREQUEST_0_NAME$i=User-Registration
&L_PAYMENTREQUEST_0_NUMBER$i=1
&L_PAYMENTREQUEST_0_AMT$i=20
&L_PAYMENTREQUEST_0_DESC$i=User-Registration";  
      $nvpStr=$nvpStr.$str;

    $nvpStr=$nvpStr."&PAYMENTREQUEST_0_AMT=20&PAYMENTREQUEST_0_CURRENCYCODE=$currencyID";

    $httpParsedResponseAr = $this->PPHttpPost('SetExpressCheckout', $nvpStr);

    if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"]))
    {
        $token = urldecode($httpParsedResponseAr["TOKEN"]);
        $payPalURL = "https://www.paypal.com/webscr&cmd=_express-checkout&token=$token";
        if("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));
    }
}

И, наконец, следующий метод httppost, который вызывается такими вставляемыми параметрами, как SetExpressCheckout, GetExpressCheckout и DoExpressCheckout.

Следующая функция трижды вызывается в успешной транзакции экспресс-проверки:

 private function PPHttpPost($methodName_, $nvpStr_) 
 {

      // Set up your API credentials, PayPal end point, and API version.

      $environment = "sandbox"; //or "live" for original live transaction;
      $API_UserName = "expresscheckout API username goes here";
      $API_Password = "expresscheckout API password goes here";
      $API_Signature = "expresscheckout API signature goes here";

      //$API_UserName = urlencode('saswat_paypay_business_api1.gmail.com');
      //$API_Password = urlencode('1365495686');
      //$API_Signature = urlencode('AfOa1sjCuxeiTRYj4tqlG6nUGUmhAvv0pzdavzgFM3272hn8CqS5OY0A');

      $API_Endpoint = "https://api-3t.paypal.com/nvp";
      if("sandbox" === $environment) 
      {
           $API_Endpoint = "https://api-3t.$environment.paypal.com/nvp";
      }
      $version = urlencode('65.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;
 }

Отправка вашей формы должна направлять или перенаправлять данные в функцию paypal_order(), которая отвечает за вызов всех других функций.

Другие вопросы по тегам