wyyl/plugins/Paypal/Controllers/PaypalController.php

131 lines
4.2 KiB
PHP

<?php
/**
* PaypalController.php
*
* @copyright 2022 opencart.cn - All Rights Reserved
* @link http://www.guangdawangluo.com
* @author Edward Yang <yangjin@opencart.cn>
* @created 2022-08-10 18:57:56
* @modified 2022-08-10 18:57:56
*
* https://www.zongscan.com/demo333/1311.html
* https://clickysoft.com/how-to-integrate-paypal-payment-gateway-in-laravel/
* https://www.positronx.io/how-to-integrate-paypal-payment-gateway-in-laravel/
*
*/
namespace Plugin\Paypal\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Srmklive\PayPal\Services\PayPal;
class PaypalController
{
private PayPal $paypalClient;
/**
* PaypalController constructor.
* @throws \Throwable
*/
public function __construct()
{
$paypalSetting = plugin_setting('paypal');
$config = [
'mode' => $paypalSetting['sandbox_mode'] ? 'sandbox' : 'live',
'sandbox' => [
'client_id' => $paypalSetting['sandbox_client_id'],
'client_secret' => $paypalSetting['sandbox_secret'],
],
'live' => [
'client_id' => $paypalSetting['live_client_id'],
'client_secret' => $paypalSetting['live_secret'],
],
'payment_action' => 'Sale', // Can only be 'Sale', 'Authorization' or 'Order'
'currency' => 'USD',
'notify_url' => '', // Change this accordingly for your application.
'locale' => 'en_US', // force gateway language i.e. it_IT, es_ES, en_US ... (for express checkout only)
'validate_ssl' => true, // Validate SSL when creating api client.
];
config(['paypal' => null]);
$this->paypalClient = new PayPal($config);
$token = $this->paypalClient->getAccessToken();
$this->paypalClient->setAccessToken($token);
}
public function test()
{
}
/**
* 创建 paypal 订单
* @param Request $request
* @return JsonResponse
* @throws \Throwable
*/
public function create(Request $request): JsonResponse
{
$orderId = $request->get('order_number');
dd($orderId);
$data = json_decode($request->getContent(), true);
$order = $this->paypalClient->createOrder([
"intent" => "CAPTURE",
"purchase_units" => [
[
"amount" => [
"currency_code" => "USD",
"value" => $data['amount']
],
'description' => 'test'
]
],
]);
$mergeData = array_merge($data, ['status' => TransactionStatus::PENDING, 'vendor_order_id' => $order['id']]);
DB::beginTransaction();
Order::create($mergeData);
DB::commit();
return response()->json($order);
//return redirect($order['links'][1]['href'])->send();
// echo('Create working');
}
public function capture(Request $request)
{
$data = json_decode($request->getContent(), true);
$orderId = $data['orderId'];
$this->paypalClient->setApiCredentials(config('paypal'));
$token = $this->paypalClient->getAccessToken();
$this->paypalClient->setAccessToken($token);
$result = $this->paypalClient->capturePaymentOrder($orderId);
// $result = $result->purchase_units[0]->payments->captures[0];
try {
DB::beginTransaction();
if ($result['status'] === "COMPLETED") {
$transaction = new Transaction;
$transaction->vendor_payment_id = $orderId;
$transaction->payment_gateway_id = $data['payment_gateway_id'];
$transaction->user_id = $data['user_id'];
$transaction->status = TransactionStatus::COMPLETED;
$transaction->save();
$order = Order::where('vendor_order_id', $orderId)->first();
$order->transaction_id = $transaction->id;
$order->status = TransactionStatus::COMPLETED;
$order->save();
DB::commit();
}
} catch (Exception $e) {
DB::rollBack();
dd($e);
}
return response()->json($result);
}
}