Laravel Paypal Payout.如何使其完整?它返回json响应



我已经使用他们的文档创建了单批支付。这样我就可以把钱寄给卖家。

但我不知道之后该怎么办。我该如何显示付款表格,用户可以登录PayPal并支付金额?

这是我在控制器功能中的代码

public function payViaPaypal(){

$payouts = new PayPalApiPayout();
$senderBatchHeader = new PayPalApiPayoutSenderBatchHeader();
$senderBatchHeader->setSenderBatchId(uniqid('invoice-1qaqw23wdwdwew').microtime('true'))
->setEmailSubject("You have a Payout!");
$senderItem = new PayPalApiPayoutItem();
$senderItem->setRecipientType('Email')
->setNote('Thanks for your patronage!')
->setReceiver('sb-cwdzv2614448@business.example.com')
->setSenderItemId(uniqid().microtime('true'))
->setAmount(new PayPalApiCurrency('{
"value":"1.0",
"currency":"USD"
}'));
$payouts->setSenderBatchHeader($senderBatchHeader)
->addItem($senderItem);

$request = clone $payouts;
$redirect_url = null;
try {
$output = $payouts->create(null, $this->api_context);
} catch (Exception $e) {
dd('here',$this->errorDetails($e));
}
//        dd("Created Single Synchronous Payout", "Payout", $output->getBatchHeader()->getPayoutBatchId(), $request, $output);
$redirect_url = null;
foreach($output->getLinks() as $link) {
if($link->getRel() == 'self') {
$redirect_url = $link->getHref();
break;
}
}
return $output;
}

当我点击route访问这段代码时,我收到了这个json响应。

{ "batch_header": { "payout_batch_id": "79CTFV2X5TS58", "batch_status": "PENDING", "sender_batch_header": { "sender_batch_id": "invoice-1qaqw23wdwdwew5f0f5003612091594839043.3978", "email_subject": "You have a Payout!" } }, "links": [ { "href": "https://api.sandbox.paypal.com/v1/payments/payouts/79CTFV2X5TS58", "rel": "self", "method": "GET", "enctype": "application/json" } ] }

我预计用户将被带到PayPal支付页面,用户将在那里登录并支付金额,之后PayPal将通知我有关付款的信息。

但我试图通过互联网找到解决方案,但找不到任何例子/解决方案。

Payouts用于将资金从您的账户发送到另一个账户。没有可显示或登录的表单。您是API呼叫者,付款将自动被批准为来自您的帐户。

如果您希望用户使用表单批准从其帐户向其他帐户付款,请使用发票:https://developer.paypal.com/docs/invoicing/

或者,也许你不需要发票,只需要一个带有"收款人"收件人集的常规PayPal结账:https://developer.paypal.com/docs/checkout/integration-features/custom-payee/

我使用了错误的方法。

解决方案是创建一个支付对象,并在其中添加收款人(将作为卖家接收付款(的电子邮件地址。

需要两个功能。

1创建支付对象2使用API从贝宝获取付款详细信息,然后执行此付款,以便将金额转移到收款人账户。

以下需要3条路线

  1. 创建支付对象
  2. 获取详细信息支付对象详细信息(查看客户是否使用贝宝结账支付了金额(并执行付款以汇款(这是成功url(
  3. 取消url(当客户取消付款时(。它将把客户重定向回平台(网站(

以下是的完整代码示例

路线

create payment object
Route::get('/invoices/process-payment','VendorPayPalController@processPaymentInvoiceViaCheckout');
when payment object is created then get its details and execute payment to send money.
Route::get('/invoices/response-success','VendorPayPalController@paypalResponseSuccess');
when cancel to pay 
Route::get('/invoices/response-cancel','VendorPayPalController@paypalResponseCancel');

控制器

<?php
namespace AppHttpControllersVendor;
use AppHttpControllersController;
use IlluminateHttpRequest;
use PayPalApiAmount;
use PayPalApiDetails;
use PayPalApiItem;
use PayPalApiItemList;
use PayPalApiPayee;
use PayPalApiPayer;
use PayPalApiPayment;
use PayPalApiPaymentExecution;
use PayPalApiRedirectUrls;
use PayPalApiTransaction;
use PayPalAuthOAuthTokenCredential;
use PayPalExceptionPayPalConnectionException;
use PayPalRestApiContext;
use PHPUnitTextUIResultPrinter;
class PayPalController extends Controller
{
private $api_context;
public function __construct()
{
$this->api_context = new ApiContext(
new OAuthTokenCredential(config('paypal.client_id'), config('paypal.secret'))
);
$this->api_context->setConfig(config('paypal.settings'));
}
public function processPaymentInvoiceViaCheckout(){
$payer = new Payer();
$payer->setPaymentMethod("paypal");
$item1 = new Item();
$item1->setName('Ground Coffee 40 oz')
->setCurrency('USD')
->setQuantity(1)
//            ->setSku("123123") // Similar to `item_number` in Classic API
->setPrice(7.5);
$item2 = new Item();
$item2->setName('Granola bars')
->setCurrency('USD')
->setQuantity(5)
//            ->setSku("321321") // Similar to `item_number` in Classic API
->setPrice(2);
$itemList = new ItemList();
$itemList->setItems(array($item1, $item2));
$details = new Details();
$details->setShipping(1.2)
->setTax(1.3)
->setSubtotal(17.50);
$amount = new Amount();
$amount->setCurrency("USD")
->setTotal(20)
->setDetails($details);
$payee = new Payee();
//this is the email id of the seller who will receive this amount
$payee->setEmail("seller-paypal-businness-account-email@business.example.com");
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($itemList)
->setDescription("Payment description")
->setPayee($payee)
->setInvoiceNumber(uniqid());
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl(url('/invoices/response-success'))
->setCancelUrl(url('/invoices/response-cancel'));
$payment = new Payment();
$payment->setIntent("sale")
->setPayer($payer)
->setRedirectUrls($redirectUrls)
->setTransactions(array($transaction));
$request = clone $payment;
try {
//create payment object
$createdPayment = $payment->create($this->api_context);
//get payment details to get payer id so that payment can be executed and transferred to seller.
$paymentDetails = Payment::get($createdPayment->getId(), $this->api_context);
$execution = new PaymentExecution();
$execution->setPayerId($paymentDetails->getPayer());
$paymentResult = $paymentDetails->execute($execution,$this->api_context);
} catch (Exception $ex) {
//handle exception here
}
//Get redirect url
//The API response provides the url that you must redirect the buyer to. Retrieve the url from the $payment->getApprovalLink() method
$approvalUrl = $payment->getApprovalLink();
return redirect($approvalUrl);
}
public function paypalResponseCancel(Request $request)
{
//normally you will just redirect back customer to platform
return redirect('invoices')->with('error','You can cancelled payment');
}
public function paypalResponseSuccess(Request $request)
{
if (empty($request->query('paymentId')) || empty($request->query('PayerID')) || empty($request->query('token'))){
//payment was unsuccessful
//send failure response to customer
}
$payment = Payment::get($request->query('paymentId'), $this->api_context);
$execution = new PaymentExecution();
$execution->setPayerId($request->query('PayerID'));
// Then we execute the payment.
$result = $payment->execute($execution, $this->api_context);

dd($request->all(),$result);
//payment is received,  send response to customer that payment is made.
}
}

你也可以阅读这个官方例子

最新更新