Laravel 贝宝付款。如何使它完整?它returnsjson响应
Laravel Paypal Payout. How to make it complete ? It returns json response
我已经使用他们的 documentation 创建了单批付款。以便我可以汇款给卖家。
但是我不知道之后我应该做什么。如何显示付款表格,用户可以在其中登录 PayPal 并支付金额?
这是我在控制器函数中的代码
public function payViaPaypal(){
$payouts = new \PayPal\Api\Payout();
$senderBatchHeader = new \PayPal\Api\PayoutSenderBatchHeader();
$senderBatchHeader->setSenderBatchId(uniqid('invoice-1qaqw23wdwdwew').microtime('true'))
->setEmailSubject("You have a Payout!");
$senderItem = new \PayPal\Api\PayoutItem();
$senderItem->setRecipientType('Email')
->setNote('Thanks for your patronage!')
->setReceiver('sb-cwdzv2614448@business.example.com')
->setSenderItemId(uniqid().microtime('true'))
->setAmount(new \PayPal\Api\Currency('{
"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;
}
当我点击路由访问此代码时,我收到此 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 会通知我有关付款的信息。
但我试图通过互联网找到解决方案,但没有 example/solution 我能找到。
付款用于将钱从您的帐户发送到另一个帐户。没有可显示或登录的表格。您是 API 来电者,付款会自动批准为来自您的帐户。
如果您想要一个表单供用户批准从他们的帐户向其他帐户付款,请使用发票:https://developer.paypal.com/docs/invoicing/
或者,也许您不需要发票表格,而只需要具有 'payee' 收件人集的常规 PayPal Checkout:https://developer.paypal.com/docs/checkout/integration-features/custom-payee/
我使用了错误的方法。
解决方案是创建一个付款对象并在其中添加收款人(作为卖家接收付款的人)电子邮件地址。
需要两个函数。
1 创建支付对象
2 使用 API 从 paypal 获取付款详情,然后执行此付款,以便可以将金额转入收款账户。
需要3条路线才能跟随
- 创建支付对象
- 获取详情支付对象详情(查看客户是否使用paypal结账支付了金额)并执行支付汇款(成功url)
- 取消url(当客户取消付款时)。它将客户重定向回平台(网站)
这是完整的代码示例
路线
create payment object
Route::get('/invoices/process-payment','Vendor\PayPalController@processPaymentInvoiceViaCheckout');
when payment object is created then get its details and execute payment to send money.
Route::get('/invoices/response-success','Vendor\PayPalController@paypalResponseSuccess');
when cancel to pay
Route::get('/invoices/response-cancel','Vendor\PayPalController@paypalResponseCancel');
控制器
<?php
namespace App\Http\Controllers\Vendor;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payee;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\PaymentExecution;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Exception\PayPalConnectionException;
use PayPal\Rest\ApiContext;
use PHPUnit\TextUI\ResultPrinter;
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.
}
}
你也可以看看这个官方example
我已经使用他们的 documentation 创建了单批付款。以便我可以汇款给卖家。
但是我不知道之后我应该做什么。如何显示付款表格,用户可以在其中登录 PayPal 并支付金额?
这是我在控制器函数中的代码
public function payViaPaypal(){
$payouts = new \PayPal\Api\Payout();
$senderBatchHeader = new \PayPal\Api\PayoutSenderBatchHeader();
$senderBatchHeader->setSenderBatchId(uniqid('invoice-1qaqw23wdwdwew').microtime('true'))
->setEmailSubject("You have a Payout!");
$senderItem = new \PayPal\Api\PayoutItem();
$senderItem->setRecipientType('Email')
->setNote('Thanks for your patronage!')
->setReceiver('sb-cwdzv2614448@business.example.com')
->setSenderItemId(uniqid().microtime('true'))
->setAmount(new \PayPal\Api\Currency('{
"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;
}
当我点击路由访问此代码时,我收到此 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 会通知我有关付款的信息。
但我试图通过互联网找到解决方案,但没有 example/solution 我能找到。
付款用于将钱从您的帐户发送到另一个帐户。没有可显示或登录的表格。您是 API 来电者,付款会自动批准为来自您的帐户。
如果您想要一个表单供用户批准从他们的帐户向其他帐户付款,请使用发票:https://developer.paypal.com/docs/invoicing/
或者,也许您不需要发票表格,而只需要具有 'payee' 收件人集的常规 PayPal Checkout:https://developer.paypal.com/docs/checkout/integration-features/custom-payee/
我使用了错误的方法。
解决方案是创建一个付款对象并在其中添加收款人(作为卖家接收付款的人)电子邮件地址。
需要两个函数。
1 创建支付对象 2 使用 API 从 paypal 获取付款详情,然后执行此付款,以便可以将金额转入收款账户。
需要3条路线才能跟随
- 创建支付对象
- 获取详情支付对象详情(查看客户是否使用paypal结账支付了金额)并执行支付汇款(成功url)
- 取消url(当客户取消付款时)。它将客户重定向回平台(网站)
这是完整的代码示例
路线
create payment object
Route::get('/invoices/process-payment','Vendor\PayPalController@processPaymentInvoiceViaCheckout');
when payment object is created then get its details and execute payment to send money.
Route::get('/invoices/response-success','Vendor\PayPalController@paypalResponseSuccess');
when cancel to pay
Route::get('/invoices/response-cancel','Vendor\PayPalController@paypalResponseCancel');
控制器
<?php
namespace App\Http\Controllers\Vendor;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payee;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\PaymentExecution;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Exception\PayPalConnectionException;
use PayPal\Rest\ApiContext;
use PHPUnit\TextUI\ResultPrinter;
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.
}
}
你也可以看看这个官方example