Как создать заказ в PayPal и одновременно отправить электронное письмо - PullRequest
1 голос
/ 27 мая 2020

Я боролся с проблемой: когда я пытаюсь отправить электронное письмо клиенту и перенаправить его на веб-сайт PayPal (для оплаты продукта), он перенаправляется на сайт PayPal, но электронное письмо не отправляется (если я не удалю форму, которая отвечает за перенаправление на сайт PayPal).

Я пытался поместить все это в одну форму и затем назвать кнопку «Отправить», как показано в скрипте.

 <form method="post" action="/order/createOrder.php">
            First Name: <input type="text" name="first_name"><br>
            Last Name: <input type="text" name="last_name"><br>
            Phone number:<br><textarea rows="5" name="phone_num" cols="30"></textarea><br>
                </div>
                    <button class="btn btn-primary float-right" name="send">Order!</button>
                </div>
            </form>

и это скрипт для электронной почты

<?php

    if (isset($_POST["send"])) {

        $to = "hellotest@gmail.com";
        $first_name =  $_POST['first_name'];
        $last_name = $_POST['last_name'];
        $phone_num = $_POST['phone_num'];
        $subject = "Zamowienie";

        foreach(Cart::GetRooms() as $room)

        $message = "Name: " . $first_name . "<br>Last name: " . $last_name . "<br>Phone Number:" . $phone_num . "<br> Room:" . $room->GetData()["title"];



        $headers = "From: testert32@gmail.com\r\n";
        $headers.= "MIME-Version: 1.0\r\n";
        $headers.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
        $headers.= "X-Priority: 1\r\n";


        mail($to, $subject, $message, $headers);
    }

это код перенаправления

<?php
require_once "../settings.php";
require_once BASE_DIR."/lib/PayPal/autoload.php";

use PayPal\Auth\OAuthTokenCredential;
use PayPal\Rest\ApiContext;
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;


$apiContext = new ApiContext(
    new OAuthTokenCredential(
        PAYPAL_CLIENT_ID,
        PAYPAL_SECRET
    )
);

$apiContext->setConfig([
    "mode" => PAYPAL_MODE
]);

// Create new payer and method
$payer = new Payer();
$payer->setPaymentMethod("paypal");

// Set redirect URLs
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl(PAYPAL_REDIRECT_SUCCESS)
  ->setCancelUrl(PAYPAL_REDIRECT_CANCEL);

$total = 0.0;
$order = [];


$item_list = new ItemList();

foreach (Cart::GetRooms() as $offer) {
      $row = $offer->GetData();
      $item_list = new ItemList();
      $item = new Item();
      $item->setQuantity(1);
      $item->setPrice($row["price"]);
      $item->setCurrency("USD");
      $item->setName( $row["title"]);
      $item->setDescription( $row["short_description"]);
      $item_list->addItem($item);

      $total += $row["price"];
      $order = $row["id"];
}

if ($total === 0.0) {
    http_response_code(404);
    exit("Error: Empty!");
}

// Set payment amount
$amount = new Amount();
$amount->setCurrency("USD")
  ->setTotal($total);

Cart::ClearCart();

// Set transaction object
$transaction = new Transaction();
$transaction->setAmount($amount)
  ->setDescription("Order #2131")
  ->setItemList($item_list);

  // Create the full payment object
$payment = new Payment();
$payment->setIntent('sale')
  ->setPayer($payer)
  ->setRedirectUrls($redirectUrls)
  ->setTransactions(array($transaction));

// Create payment with valid API context
try {
    $payment->create($apiContext);

    // Get PayPal redirect URL and redirect the customer
    $approvalUrl = $payment->getApprovalLink();

    // Redirect the customer to $approvalUrl
    header("Location: $approvalUrl");
  } catch (PayPal\Exception\PayPalConnectionException $ex) {
    echo $ex->getCode();
    echo $ex->getData();
    die($ex);
  } catch (Exception $ex) {
    die($ex);
  }

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Не будучи экспертом PHP, я бы решил эту проблему, чтобы не использовать перенаправление заголовка:

header("Location: $approvalUrl");

И вместо этого возвращать HTML с <script>, изменяющим окно. location.href должен быть $ extensionUrl


На самом деле я бы вообще не использовал перенаправления, а вместо этого обновил бы оформление заказа до этого интерфейса "в контексте": https://developer.paypal.com/demo/checkout/# / pattern / server (который поддерживает загрузку вашего сайта в фоновом режиме).

(Если вы не видели этот интерфейс в действии, вы можете проверить здесь демонстрацию на стороне клиента, которая на самом деле загружать кассу при нажатии кнопки: https://developer.paypal.com/demo/checkout/# / pattern / client )

Кроме того, похоже, что вы используете старую версию v1 / payments PayPal- PHP -SDK , поэтому, если это новая интеграция, вам следует перейти на последнюю версию SDK v2 https://github.com/paypal/Checkout-PHP-SDK

0 голосов
/ 22 июня 2020

Здесь фактическое JQuery Пример:

      paypal.Buttons({
      
    style: {
        layout: 'horizontal',
        color: 'gold',
        shape: 'pill',
        label: 'checkout',
        size: 'responsive',
        tagline: 'true',
    },
    
    // Set up the transaction
    createOrder: function(data, actions) {
        $('#paypalmsg').hide();
        $('#transmsg').show();
        $('#transmsg').html('<b>'+'WAITING ON AUTHORIZATION...'+'</b>');
        $('#chkoutmsg').hide()
        return actions.order.create({
            purchase_units: [{
                description: 'GnG Order',
                amount: {
                    value: cartTotal
                }
            }],
            application_context: {
              shipping_preference: 'NO_SHIPPING'
            }
            
        });
    },
    
    // Finalize the transaction
    onApprove: function(data, actions) {
        return actions.order.capture().then(function(details) {
          /*return actions.order.get().then(function(orderDetails) { */
                // Show a success message to the buyer
                $('#transmsg').html('<b>' + 'AUTHORIZED...' + '</b>');
                $('#transmsg').append('<br>'+'Transaction completed by: ' + details.payer.name.given_name +' '+ details.payer.name.surname + '<br>' + "Order Id: " + details.id + '<br>' + 'Status: PAID & APPROVED'  + '<br>'+ 'Thank You For Your Order'+ '<br>');
                if (details.status === "COMPLETED") {
                    window.setTimeout(function() {}, 500)
                     $('#transmsg').append('<b>' + 'Sending Order...Please Wait' + 
                    '</b>'+'<br>');
                    $('#transid').val(details.id);
                    $('#orderstat').val('APPROVED');
                    $('#orderform').submit();
                } 
          });

Надеюсь, что это поможет

D

...