Я пытаюсь реализовать API
PayPal payment
с помощью Laravel 5.1
. Но когда я вхожу в PayPal (sandbox)
, он использует адрес, который я использовал в своей учетной записи, а также использует имя из учетной записи PayPal, а не данные с моего сайта. Это моя проблема.
Я хочу использовать данные с моего сайта, потому что это не имеет смысла, если я ввожу адрес доставки (например) с моего сайта и не использую его. Пожалуйста, посмотрите мой код ниже для справки (или прокомментируйте ниже некоторые подробности от меня).
class PaypalPaymentController extends BaseController
{
private $_api_context;
public function __construct(){
$paypal_conf = \Config::get('paypal');
$this->_api_context = new ApiContext(new OAuthTokenCredential(
$paypal_conf['client_id'],
$paypal_conf['secret']
));
$this->_api_context->setConfig($paypal_conf['settings']);
}
public function payWithPaypal(Request $request){
$payer = new Payer;
$payer->setPaymentMethod('paypal');
$price = 0;
switch($request->get('amount')) {
case '10 books':
$price = 6200;
break;
case '20 books':
$price = 12200;
break;
case '50 books':
$price = 25200;
break;
default:
return redirect()
->route('bookstore.shipping')
->with('danger', 'Please select the right amount of book/s.');
break;
}
$item1 = new Item();
$item1->setName($request->get('amount'))
->setCurrency('PHP')
->setQuantity(1)
->setPrice($price);
$item_list = new ItemList();
$item_list->setItems([$item1]);
$amount = new Amount();
$amount->setCurrency('PHP')
->setTotal($price);
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($item_list)
->setDescription('Books transaction');
$redirect_urls = new RedirectUrls();
$redirect_urls->setReturnUrl(route('bookstore.payment-status'))
->setCancelUrl(route('bookstore.payment-status'));
$payment = new Payment();
$payment->setIntent('Sale')
->setPayer($payer)
->setRedirectUrls($redirect_urls)
->setTransactions([$transaction]);
$patchReplace = new Patch();
$patchReplace->setOp('add')
->setPath('/transactions/0/item_list/shipping_address')
->setValue(json_decode('{
"line1": "345 Lark Ave",
"city": "Montreal",
"state": "QC",
"postal_code": "H1A4K2",
"country_code": "CA"
}'));
$patchRequest = (new PatchRequest())->setPatches([$patchReplace]);
try{
$payment->create($this->_api_context);
$payment->update($patchRequest, $this->_api_context);
} catch(\Palpal\Exception\PPConnectionException $e){
if(\Config::get('app.debug')){
return redirect()
->route('bookstore.shipping')
->with('danger', 'Connection Timeout.');
}
return redirect()
->route('bookstore.shipping')
->with('danger', 'Some error occured, sorry for the inconvenience.');
}
foreach($payment->getLinks() as $link){
if($link->getRel() == 'approval_url'){
$redirect_url = $link->getHref();
break;
}
}
Session::put('paypal_payment_id', $payment->getId());
if(isset($redirect_url)){
return Redirect::away($redirect_url);
}
return redirect()
->route('bookstore.shipping')
->with('danger', 'Unknown error occured.');
}
public function getPaymentStatus(){
$payment_id = Session::get('paypal_payment_id');
Session::forget('paypal_payment_id');
if(empty(Input::get('PayerID')) || empty(Input::get('token'))){
return redirect()
->route('bookstore.shipping')
->with('danger', 'Payment failed.');
}
$payment = Payment::get($payment_id, $this->_api_context);
$execution = new PaymentExecution();
$execution->setPayerId(Input::get('PayerID'));
$result = $payment->execute($execution, $this->_api_context);
if($result->getState() == 'approved'){
// Send Email
$email_data = [
'number_of_books' => $payment->transactions[0]->item_list->items[0]->name,
'shipping' => [
'street' => $payment->payer->payer_info->shipping_address->line1,
'city' => $payment->payer->payer_info->shipping_address->city,
'state' => $payment->payer->payer_info->shipping_address->state,
'country' => $payment->payer->payer_info->shipping_address->country_code,
]
];
// Send email function here ...
return redirect()
->route('bookstore.shipping')
->with('success', 'Transaction payment success!');
}
return redirect()
->route('bookstore.shipping')
->with('danger', 'Payment failed.');
}
}
Я также рассмотрел эту ссылку, но похоже, что она не может ответить на мою проблему. Кроме того, what if
в стране есть провинция? Как мы можем добавить это?
Обновление 1
- Добавлен новый класс
Patch()
. - Измененный код в
Try Catch
.
Примечание. accepted
ответ также получит bounty
плюс up
.
Обновление 2 с помощью учебника
-
Для PHP/Laravel (я в настоящее время использую v5.1), установите этот пакет paypal/rest-api-sdk-php
-
Создайте учетную запись Sandbox в PayPal. Выберите Купить в Paypal.
-
Продолжайте, пока не увидите параметры, выберите " Магазин мира".
-
Войдите в систему developer.paypal.com.
-
Нажмите " Учетные записи". Нажмите " Создать учетную запись".
-
Выберите страну, в которой вы хотите. Выберите "Личный" (учетная запись покупателя) в "Тип учетной записи".
-
Добавить адрес электронной почты, избегать использования
-
. Вместо этого используйте_
. -
Укажите, сколько вы хотите получить PayPal Balance.
-
Нажмите "Создать учетную запись".
Сделать это жить?