如何生成PayPal订单付款链接到电子邮件

时间:2020-10-12 09:25:12

标签: laravel paypal-rest-sdk

我正在尝试生成指向电子邮件的PayPal链接,以便用户以后可以为他们的订单付款。我正在使用 paypal / rest-api-sdk-php 。例如,使用以下路线:

Route::get('/order/pay/{hash}', 'Frontend\PaymentController@orderPay')->name('order.pay');

我的付款创建代码有效(请参阅代码)。当用户取消付款或付款失败时,如何返回未完成的交易并尝试再次付款?每当用户去订购付款路线时,我都应该创建新的付款吗?还是我可以简单地在PayPal中识别未完成的交易并重定向到某些PayPal链接?

use PayPal\Api\Payer;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Details;
use PayPal\Api\Amount;
use PayPal\Api\Transaction;
use PayPal\Api\RedirectURLs;
use PayPal\Api\Payment;

 /*
 * @param  \App\Order  $order
 * @return string
 */
public function createPayment($order)
{
    $transaction = $this->getTransactionByOrderHash($order->hash);

    if ($transaction) {
        if ($transaction->is_refunded) {
            return 'Paymant has already been refunded';
        }
        if ($transaction->is_payed) {
            return 'Paymant has already been payed';
        }
    }

    $price = $order->to_pay;
    $currencyCode = $order->currency->iso_code;

    try {
        $payer = new Payer();
        $payer->setPaymentMethod('paypal');

        $item = new Item();
        $item
            ->setName(__('invoice.pfa_title'))
            ->setCurrency($currencyCode)
            ->setQuantity(1)
            ->setSku($order->vs)
            ->setPrice($price);

        $itemList = new ItemList();
        $itemList->setItems([$item]);

        $details = new Details();
        $details
            ->setShipping(0)
            ->setTax(0)
            ->setSubtotal($price);

        $amount = new Amount();
        $amount
            ->setCurrency($currencyCode)
            ->setTotal($price)
            ->setDetails($details);

        $transaction = new Transaction();
        $transaction
            ->setAmount($amount)
            ->setItemList($itemList)
            ->setInvoiceNumber(uniqid());

        $redirectUrls = new RedirectUrls();
        $redirectUrls
            ->setReturnUrl(route('paypal.success', $order->hash))
            ->setCancelUrl(route('paypal.cancel'));

        $payment = new Payment();
        $payment
            ->setIntent('sale')
            ->setPayer($payer)
            ->setRedirectUrls($redirectUrls)
            ->setTransactions([$transaction]);

        $payment->create($this->apiContext);

        $approvalUrl = $this->getApprovalUrl($payment);

        if ($approvalUrl) {
            session([
                'approval_url' => $approvalUrl,
                'transaction_id' => $payment->getId(),
            ]);
            return 'payment was successful';
        }
    } catch (PayPalConnectionException $ex) {
        return json_decode($ex->getData());
    } catch (Throwable $e) {
        return $e->getMessage();
    }

    return 'payment was unsuccessful';
}

1 个答案:

答案 0 :(得分:0)

为什么使用不推荐使用的v1 / pays PayPal-PHP-SDK,而不是当前的v2 / checkout / orders Checkout-PHP-SDK

无论如何,是的,您可以在每次客户尝试结帐时创建一个新的Payment / Order对象。只需将invoice_id字段设置为您自己要付款的商品的相同但唯一发票/订单号,这样,如果客户确实尝试为此重复付款, #之前已经在您的PayPal帐户上成功完成交易的交易,默认情况下会被阻止(根据您的PayPal帐户设置)