问题描述
我正在尝试生成指向电子邮件的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';
}
解决方法
为什么使用不推荐使用的v1 / pays PayPal-PHP-SDK,而不是当前的v2 / checkout / orders Checkout-PHP-SDK
?
无论如何,是的,您可以在每次客户尝试结帐时创建一个新的Payment / Order对象。只需将invoice_id字段设置为您自己要付款的商品的相同但唯一发票/订单号,这样,如果客户确实尝试为此重复付款, #之前已经在您的PayPal帐户上成功完成交易的交易,默认情况下会被阻止(根据您的PayPal帐户设置)