Bläddra i källkod

添加支付方式

llp 1 vecka sedan
förälder
incheckning
0d894532c7

+ 70 - 68
bootstrap/cache/services.php

@@ -64,40 +64,41 @@
     60 => 'Longyi\\Pay\\AwxKlarna\\Providers\\AwxKlarnaServiceProvider',
     61 => 'Longyi\\Pay\\Applepay\\Providers\\ApplepayServiceProvider',
     62 => 'Longyi\\Pay\\Airwallex\\Providers\\AirwallexServiceProvider',
-    63 => 'Webkul\\Attribute\\Providers\\AttributeServiceProvider',
-    64 => 'Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider',
-    65 => 'Webkul\\CMS\\Providers\\CMSServiceProvider',
-    66 => 'Webkul\\CartRule\\Providers\\CartRuleServiceProvider',
-    67 => 'Webkul\\CatalogRule\\Providers\\CatalogRuleServiceProvider',
-    68 => 'Webkul\\Category\\Providers\\CategoryServiceProvider',
-    69 => 'Webkul\\Checkout\\Providers\\CheckoutServiceProvider',
-    70 => 'Webkul\\Core\\Providers\\CoreServiceProvider',
-    71 => 'Webkul\\Core\\Providers\\EnvValidatorServiceProvider',
-    72 => 'Webkul\\Customer\\Providers\\CustomerServiceProvider',
-    73 => 'Webkul\\DataGrid\\Providers\\DataGridServiceProvider',
-    74 => 'Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider',
-    75 => 'Webkul\\DebugBar\\Providers\\DebugBarServiceProvider',
-    76 => 'Webkul\\FPC\\Providers\\FPCServiceProvider',
-    77 => 'Webkul\\GDPR\\Providers\\GDPRServiceProvider',
-    78 => 'Webkul\\Installer\\Providers\\InstallerServiceProvider',
-    79 => 'Webkul\\Inventory\\Providers\\InventoryServiceProvider',
-    80 => 'Webkul\\MagicAI\\Providers\\MagicAIServiceProvider',
-    81 => 'Webkul\\Marketing\\Providers\\MarketingServiceProvider',
-    82 => 'Webkul\\Notification\\Providers\\NotificationServiceProvider',
-    83 => 'Webkul\\Payment\\Providers\\PaymentServiceProvider',
-    84 => 'Webkul\\Paypal\\Providers\\PaypalServiceProvider',
-    85 => 'Webkul\\Product\\Providers\\ProductServiceProvider',
-    86 => 'Webkul\\Rule\\Providers\\RuleServiceProvider',
-    87 => 'Webkul\\Sales\\Providers\\SalesServiceProvider',
-    88 => 'Webkul\\Shipping\\Providers\\ShippingServiceProvider',
-    89 => 'Webkul\\Shop\\Providers\\ShopServiceProvider',
-    90 => 'Webkul\\Sitemap\\Providers\\SitemapServiceProvider',
-    91 => 'Webkul\\SocialLogin\\Providers\\SocialLoginServiceProvider',
-    92 => 'Webkul\\SocialShare\\Providers\\SocialShareServiceProvider',
-    93 => 'Webkul\\Tax\\Providers\\TaxServiceProvider',
-    94 => 'Webkul\\Theme\\Providers\\ThemeServiceProvider',
-    95 => 'Webkul\\User\\Providers\\UserServiceProvider',
-    96 => 'Webkul\\BagistoApi\\Providers\\BagistoApiServiceProvider',
+    63 => 'Longyi\\Pay\\Afterpay\\Providers\\AfterpayServiceProvider',
+    64 => 'Webkul\\Attribute\\Providers\\AttributeServiceProvider',
+    65 => 'Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider',
+    66 => 'Webkul\\CMS\\Providers\\CMSServiceProvider',
+    67 => 'Webkul\\CartRule\\Providers\\CartRuleServiceProvider',
+    68 => 'Webkul\\CatalogRule\\Providers\\CatalogRuleServiceProvider',
+    69 => 'Webkul\\Category\\Providers\\CategoryServiceProvider',
+    70 => 'Webkul\\Checkout\\Providers\\CheckoutServiceProvider',
+    71 => 'Webkul\\Core\\Providers\\CoreServiceProvider',
+    72 => 'Webkul\\Core\\Providers\\EnvValidatorServiceProvider',
+    73 => 'Webkul\\Customer\\Providers\\CustomerServiceProvider',
+    74 => 'Webkul\\DataGrid\\Providers\\DataGridServiceProvider',
+    75 => 'Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider',
+    76 => 'Webkul\\DebugBar\\Providers\\DebugBarServiceProvider',
+    77 => 'Webkul\\FPC\\Providers\\FPCServiceProvider',
+    78 => 'Webkul\\GDPR\\Providers\\GDPRServiceProvider',
+    79 => 'Webkul\\Installer\\Providers\\InstallerServiceProvider',
+    80 => 'Webkul\\Inventory\\Providers\\InventoryServiceProvider',
+    81 => 'Webkul\\MagicAI\\Providers\\MagicAIServiceProvider',
+    82 => 'Webkul\\Marketing\\Providers\\MarketingServiceProvider',
+    83 => 'Webkul\\Notification\\Providers\\NotificationServiceProvider',
+    84 => 'Webkul\\Payment\\Providers\\PaymentServiceProvider',
+    85 => 'Webkul\\Paypal\\Providers\\PaypalServiceProvider',
+    86 => 'Webkul\\Product\\Providers\\ProductServiceProvider',
+    87 => 'Webkul\\Rule\\Providers\\RuleServiceProvider',
+    88 => 'Webkul\\Sales\\Providers\\SalesServiceProvider',
+    89 => 'Webkul\\Shipping\\Providers\\ShippingServiceProvider',
+    90 => 'Webkul\\Shop\\Providers\\ShopServiceProvider',
+    91 => 'Webkul\\Sitemap\\Providers\\SitemapServiceProvider',
+    92 => 'Webkul\\SocialLogin\\Providers\\SocialLoginServiceProvider',
+    93 => 'Webkul\\SocialShare\\Providers\\SocialShareServiceProvider',
+    94 => 'Webkul\\Tax\\Providers\\TaxServiceProvider',
+    95 => 'Webkul\\Theme\\Providers\\ThemeServiceProvider',
+    96 => 'Webkul\\User\\Providers\\UserServiceProvider',
+    97 => 'Webkul\\BagistoApi\\Providers\\BagistoApiServiceProvider',
   ),
   'eager' => 
   array (
@@ -147,40 +148,41 @@
     43 => 'Longyi\\Pay\\AwxKlarna\\Providers\\AwxKlarnaServiceProvider',
     44 => 'Longyi\\Pay\\Applepay\\Providers\\ApplepayServiceProvider',
     45 => 'Longyi\\Pay\\Airwallex\\Providers\\AirwallexServiceProvider',
-    46 => 'Webkul\\Attribute\\Providers\\AttributeServiceProvider',
-    47 => 'Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider',
-    48 => 'Webkul\\CMS\\Providers\\CMSServiceProvider',
-    49 => 'Webkul\\CartRule\\Providers\\CartRuleServiceProvider',
-    50 => 'Webkul\\CatalogRule\\Providers\\CatalogRuleServiceProvider',
-    51 => 'Webkul\\Category\\Providers\\CategoryServiceProvider',
-    52 => 'Webkul\\Checkout\\Providers\\CheckoutServiceProvider',
-    53 => 'Webkul\\Core\\Providers\\CoreServiceProvider',
-    54 => 'Webkul\\Core\\Providers\\EnvValidatorServiceProvider',
-    55 => 'Webkul\\Customer\\Providers\\CustomerServiceProvider',
-    56 => 'Webkul\\DataGrid\\Providers\\DataGridServiceProvider',
-    57 => 'Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider',
-    58 => 'Webkul\\DebugBar\\Providers\\DebugBarServiceProvider',
-    59 => 'Webkul\\FPC\\Providers\\FPCServiceProvider',
-    60 => 'Webkul\\GDPR\\Providers\\GDPRServiceProvider',
-    61 => 'Webkul\\Installer\\Providers\\InstallerServiceProvider',
-    62 => 'Webkul\\Inventory\\Providers\\InventoryServiceProvider',
-    63 => 'Webkul\\MagicAI\\Providers\\MagicAIServiceProvider',
-    64 => 'Webkul\\Marketing\\Providers\\MarketingServiceProvider',
-    65 => 'Webkul\\Notification\\Providers\\NotificationServiceProvider',
-    66 => 'Webkul\\Payment\\Providers\\PaymentServiceProvider',
-    67 => 'Webkul\\Paypal\\Providers\\PaypalServiceProvider',
-    68 => 'Webkul\\Product\\Providers\\ProductServiceProvider',
-    69 => 'Webkul\\Rule\\Providers\\RuleServiceProvider',
-    70 => 'Webkul\\Sales\\Providers\\SalesServiceProvider',
-    71 => 'Webkul\\Shipping\\Providers\\ShippingServiceProvider',
-    72 => 'Webkul\\Shop\\Providers\\ShopServiceProvider',
-    73 => 'Webkul\\Sitemap\\Providers\\SitemapServiceProvider',
-    74 => 'Webkul\\SocialLogin\\Providers\\SocialLoginServiceProvider',
-    75 => 'Webkul\\SocialShare\\Providers\\SocialShareServiceProvider',
-    76 => 'Webkul\\Tax\\Providers\\TaxServiceProvider',
-    77 => 'Webkul\\Theme\\Providers\\ThemeServiceProvider',
-    78 => 'Webkul\\User\\Providers\\UserServiceProvider',
-    79 => 'Webkul\\BagistoApi\\Providers\\BagistoApiServiceProvider',
+    46 => 'Longyi\\Pay\\Afterpay\\Providers\\AfterpayServiceProvider',
+    47 => 'Webkul\\Attribute\\Providers\\AttributeServiceProvider',
+    48 => 'Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider',
+    49 => 'Webkul\\CMS\\Providers\\CMSServiceProvider',
+    50 => 'Webkul\\CartRule\\Providers\\CartRuleServiceProvider',
+    51 => 'Webkul\\CatalogRule\\Providers\\CatalogRuleServiceProvider',
+    52 => 'Webkul\\Category\\Providers\\CategoryServiceProvider',
+    53 => 'Webkul\\Checkout\\Providers\\CheckoutServiceProvider',
+    54 => 'Webkul\\Core\\Providers\\CoreServiceProvider',
+    55 => 'Webkul\\Core\\Providers\\EnvValidatorServiceProvider',
+    56 => 'Webkul\\Customer\\Providers\\CustomerServiceProvider',
+    57 => 'Webkul\\DataGrid\\Providers\\DataGridServiceProvider',
+    58 => 'Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider',
+    59 => 'Webkul\\DebugBar\\Providers\\DebugBarServiceProvider',
+    60 => 'Webkul\\FPC\\Providers\\FPCServiceProvider',
+    61 => 'Webkul\\GDPR\\Providers\\GDPRServiceProvider',
+    62 => 'Webkul\\Installer\\Providers\\InstallerServiceProvider',
+    63 => 'Webkul\\Inventory\\Providers\\InventoryServiceProvider',
+    64 => 'Webkul\\MagicAI\\Providers\\MagicAIServiceProvider',
+    65 => 'Webkul\\Marketing\\Providers\\MarketingServiceProvider',
+    66 => 'Webkul\\Notification\\Providers\\NotificationServiceProvider',
+    67 => 'Webkul\\Payment\\Providers\\PaymentServiceProvider',
+    68 => 'Webkul\\Paypal\\Providers\\PaypalServiceProvider',
+    69 => 'Webkul\\Product\\Providers\\ProductServiceProvider',
+    70 => 'Webkul\\Rule\\Providers\\RuleServiceProvider',
+    71 => 'Webkul\\Sales\\Providers\\SalesServiceProvider',
+    72 => 'Webkul\\Shipping\\Providers\\ShippingServiceProvider',
+    73 => 'Webkul\\Shop\\Providers\\ShopServiceProvider',
+    74 => 'Webkul\\Sitemap\\Providers\\SitemapServiceProvider',
+    75 => 'Webkul\\SocialLogin\\Providers\\SocialLoginServiceProvider',
+    76 => 'Webkul\\SocialShare\\Providers\\SocialShareServiceProvider',
+    77 => 'Webkul\\Tax\\Providers\\TaxServiceProvider',
+    78 => 'Webkul\\Theme\\Providers\\ThemeServiceProvider',
+    79 => 'Webkul\\User\\Providers\\UserServiceProvider',
+    80 => 'Webkul\\BagistoApi\\Providers\\BagistoApiServiceProvider',
   ),
   'deferred' => 
   array (

+ 1 - 0
bootstrap/providers.php

@@ -21,6 +21,7 @@ return [
     Longyi\Pay\AwxKlarna\Providers\AwxKlarnaServiceProvider::class,
     Longyi\Pay\Applepay\Providers\ApplepayServiceProvider::class,
     Longyi\Pay\Airwallex\Providers\AirwallexServiceProvider::class,
+    Longyi\Pay\Afterpay\Providers\AfterpayServiceProvider::class,
     Webkul\Attribute\Providers\AttributeServiceProvider::class,
     Webkul\BookingProduct\Providers\BookingProductServiceProvider::class,
     Webkul\CMS\Providers\CMSServiceProvider::class,

+ 1 - 0
composer.json

@@ -79,6 +79,7 @@
             "Longyi\\Pay\\Applepay\\": "packages/Longyi/Pay/Applepay/src/",
             "Longyi\\Pay\\AwxKlarna\\": "packages/Longyi/Pay/AwxKlarna/src/",
             "Longyi\\Pay\\AwxAfterpay\\": "packages/Longyi/Pay/AwxAfterpay/src/",
+            "Longyi\\Pay\\Afterpay\\": "packages/Longyi/Pay/Afterpay/src/",
             "Webkul\\Admin\\": "packages/Webkul/Admin/src",
             "Webkul\\Attribute\\": "packages/Webkul/Attribute/src",
             "Webkul\\BookingProduct\\": "packages/Webkul/BookingProduct/src",

+ 16 - 46
packages/Longyi/Gift/src/Http/Controllers/Shop/GiftController.php

@@ -111,62 +111,33 @@ class GiftController extends Controller
                ->where('customer_id', $customerId)->first();
            $cart = Cart::getCart();
            if (!$giftCard) {
-               return (new JsonResource([
-                   'data'     => new CustomCartResource (Cart::getCart()),
-                   'message'  => trans('Coupon not found.'),
-               ]))->response()->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
+               return ApiResponse::error('Coupon not found.');
            }
            $remainingGiftcardAmount = core()->convertPrice($giftCard->remaining_giftcard_amount);
            if ($remainingGiftcardAmount <= 0) {
-               return (new JsonResource([
-                   'data'     => new CustomCartResource(Cart::getCart()),
-                   'message'  => trans('Gift card already used.'),
-               ]))->response()->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
+               return ApiResponse::error('Gift card already used.');
            }
            if (!empty($cart->giftcard_amount)) {
-               return (new JsonResource([
-                   'data'     => new CustomCartResource(Cart::getCart()),
-                   'message'  => trans('The shopping cart has been paid with a gift card.'),
-               ]))->response()->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
+               return ApiResponse::error('The shopping cart has been paid with a gift card.');
            }
-
-
            $cartTotal = $cart->grand_total;
            $remainingAmount = $remainingGiftcardAmount - $cartTotal;
-
-           if ($remainingAmount >= 0) {
-               // Apply the gift card to the cart
-               GiftCards::setGiftCardCode($giftCard);
-               Cart::collectTotals();
-
-               return response()->json([
-                   'message' => 'Gift card applied successfully',
-                   'remaining_amount' => $remainingAmount,
-                   'giftcard_number' => $giftCard->giftcard_number,
-               ]);
-           } else {
-               // Apply the gift card to the cart
-               GiftCards::setGiftCardCode($giftCard);
-               Cart::collectTotals();
-               // Gift card amount becomes zero as it's fully used
-               return response()->json([
-                   'message' => 'Gift card applied successfully',
-                   'remaining_amount' => 0,
-                   'giftcard_number' => $giftCard->giftcard_number,
-               ]);
-           }
+           // Apply the gift card to the cart
+           GiftCards::setGiftCardCode($giftCard);
+           Cart::collectTotals();
+           // Gift card amount becomes zero as it's fully used
+           return ApiResponse::success([
+               'remaining_amount' => $remainingAmount >= 0 ? $remainingAmount : 0,
+               'giftcard_number' => $giftCard->giftcard_number,
+           ]);
        } catch (\Exception $e) {
-           return (new JsonResource([
-               'data'    => new CustomCartResource(Cart::getCart()),
-               'message' => trans('error'),
-               'error' => $e->getMessage()
-           ]))->response()->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
+           return ApiResponse::error($e->getMessage());
        }
    }
     /**
      * Remove applied Giftcard from the cart.
      */
-    public function destroyGiftCard(): JsonResource
+    public function destroyGiftCard()
     {
         // Get the cart instance
         $cart = Cart::getCart();
@@ -188,10 +159,9 @@ class GiftController extends Controller
         }
 
         // Return response with updated cart data
-        return new JsonResource([
-            'data'     => new CustomCartResource(Cart::getCart()),
-            'message'  => trans('gift::app.giftcard.remove'),
-        ]);
+        return ApiResponse::success([
+                'data'     => new CustomCartResource(Cart::getCart())
+            ], trans('gift::app.giftcard.remove'));
     }
 
     /**

+ 12 - 0
packages/Longyi/Pay/Afterpay/src/Config/payment-methods.php

@@ -0,0 +1,12 @@
+<?php
+
+return [
+    'afterpay'  => [
+        'code'        => 'afterpay',
+        'title'       => 'Afterpay',
+        'description' => 'Afterpay',
+        'class'       => 'Longyi\Pay\Afterpay\Payment\Afterpay',
+        'active'      => true,
+        'sort'        => 1,
+    ],
+];

+ 82 - 0
packages/Longyi/Pay/Afterpay/src/Config/system.php

@@ -0,0 +1,82 @@
+<?php
+
+return [
+    [
+        'key'    => 'sales.payment_methods.afterpay',
+        'name'   => 'Afterpay',
+        'info'   => 'Information about Afterpay',
+        'sort'   => 5,
+        'fields' => [
+            [
+                'name'          => 'title',
+                'title'         => 'Title',
+                'type'          => 'text',
+                'validation'    => 'required',
+                'channel_based' => false,
+                'locale_based'  => true,
+            ], [
+                'name'          => 'description',
+                'title'         => 'Description',
+                'type'          => 'textarea',
+                'channel_based' => false,
+                'locale_based'  => true,
+            ], [
+                'name' => 'mode',
+                'title' => 'Mode',
+                'type' => 'select',
+                'options' => [
+                    [
+                        'title' => 'live',
+                        'value' => 'live',
+                    ], [
+                        'title' => 'test',
+                        'value' => 'test',
+                    ],
+                ],
+                'depend' => 'active:1',
+                'validation' => 'required_if:active,1',
+                'channel_based' => false,
+                'locale_based' => true,
+            ], [
+                'name' => 'client_id',
+                'title' => 'ClientId',
+                'type' => 'text',
+                'depend' => 'active:1',
+                'validation' => 'required_if:active,1',
+                'channel_based' => false,
+                'locale_based' => true,
+            ], [
+                'name' => 'secret_id',
+                'title' => 'Secret',
+                'type' => 'password',
+                'depend' => 'active:1',
+                'validation' => 'required_if:active,1',
+                'channel_based' => false,
+                'locale_based' => true,
+            ], [
+                'name' => 'webhook_id',
+                'title' => 'WebhookId',
+                'type' => 'text',
+                'depend' => 'active:1',
+                'validation' => 'required_if:active,1',
+                'channel_based' => false,
+                'locale_based' => true,
+            ], [
+                'name'          => 'sort',
+                'title'         => 'Sort Order',
+                'type'          => 'text',
+                'validation'    => 'numeric',
+                'channel_based' => true,
+                'locale_based'  => false,
+                'default'       => 5,
+            ], [
+                'name'          => 'active',
+                'title'         => 'Status',
+                'type'          => 'boolean',
+                'validation'    => 'required',
+                'channel_based' => false,
+                'locale_based'  => true,
+            ]
+        ]
+    ]
+];

+ 38 - 0
packages/Longyi/Pay/Afterpay/src/Http/Controllers/AfterpayController.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace Longyi\Pay\Afterpay\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Longyi\Pay\Afterpay\Payment\Afterpay;
+use Webkul\Sales\Repositories\OrderRepository;
+
+class AfterpayController extends Controller
+{
+    public function __construct(
+        protected OrderRepository $orderRepository,
+        protected Afterpay $afterpay,
+    ) {}
+    public function return(Request $request)
+    {
+        $orderId = $request->input('order_id');
+        $status = $request->input('status');
+        $orderToken = $request->input('orderToken');
+        try {
+            switch ($status) {
+                case 'SUCCESS':
+                    $this->afterpay->paymentsSuccess($orderId, $orderToken);
+                    return redirect()->route('shop.checkout.onepage.success');
+                    break;
+                case 'CANCELLED':
+                    //跳转到订单列表
+                    return redirect()->route('shop.checkout.cart.index');
+                    break;
+                default:
+                    break;
+            }
+        } catch (\Exception $e) {
+           //记录日志
+            \Log::error($e->getMessage() . ' orderId=' . $orderId);
+        }
+    }
+}

+ 12 - 0
packages/Longyi/Pay/Afterpay/src/Http/Controllers/Controller.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace Longyi\Pay\Afterpay\Http\Controllers;
+
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Routing\Controller as BaseController;
+
+class Controller extends BaseController
+{
+    use DispatchesJobs, ValidatesRequests;
+}

+ 6 - 0
packages/Longyi/Pay/Afterpay/src/Http/routes.php

@@ -0,0 +1,6 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use Longyi\Pay\Afterpay\Http\Controllers\AfterpayController;
+
+Route::get('afterpay/webhook/return', [AfterpayController::class, 'return'])->name('afterpay.return');

+ 221 - 0
packages/Longyi/Pay/Afterpay/src/Payment/Afterpay.php

@@ -0,0 +1,221 @@
+<?php
+
+namespace Longyi\Pay\Afterpay\Payment;
+
+use GuzzleHttp\Client;
+use Illuminate\Support\Facades\Storage;
+use Webkul\Payment\Payment\Payment;
+use Webkul\Sales\Models\Order;
+use Webkul\Sales\Repositories\OrderRepository;
+use Webkul\Checkout\Facades\Cart;
+use function Symfony\Component\Translation\t;
+
+class Afterpay extends Payment
+{
+    protected $clientId;
+    protected $apikey;
+    protected $secret;
+    protected $currentOrder;
+    protected $createPaymentUlr = 'https://global-api-sandbox.afterpay.com/v2/checkouts';
+    protected $capturePaymentUlr = 'https://global-api-sandbox.afterpay.com/v2/payments/capture';
+
+    public function __construct()
+    {
+        if ($this->getConfigData('mode') == 'live') {
+            $this->createPaymentUlr = 'https://global-api.afterpay.com/v2/checkouts';
+            $this->capturePaymentUlr = 'https://global-api-sandbox.afterpay.com/v2/payments/capture';
+        }
+        $this->clientId = $this->getConfigData('client_id');
+        $this->apikey = $this->getConfigData('secret_id');
+        $this->secret = $this->getConfigData('webhook_id');
+    }
+
+    protected $code  = 'afterpay';
+
+    public function getRedirectUrl()
+    {
+    }
+
+    public function setOrder($order = null): self
+    {
+        $this->currentOrder = $order;
+        return $this;
+    }
+
+    public function getOrder()
+    {
+        return $this->currentOrder;
+    }
+
+    public function createGatewayOrder()
+    {
+        try {
+            return $this->createPayment($this->getOrder(), ['merchantOrderId' => $this->getOrder()->increment_id]);
+        } catch (\Exception $e) {
+            throw new \Exception($e->getMessage());
+        }
+    }
+
+    public function createPayment($order, $override)
+    {
+        $shop = $order->shipping_address;
+        $bill = $order->billing_address;
+        $telephone = $shop->phone ?: $bill->phone;
+        $grandTotal = round($order->grand_total, 2);
+        foreach ($order->items as $item) {
+            $products[] = [
+                'name' => (string)$item->name,
+                'quantity' => $item->qty_ordered,
+                'sku' => $item->sku,
+                'price' => [
+                    'amount' => $this->formatCurrencyValue((float) $item->price),
+                    'currency' => $order->order_currency_code
+                ],
+            ];
+        }
+        $data = [
+            'amount' => [
+                'amount' => $grandTotal,
+                'currency' => $order->order_currency_code
+            ],
+            'consumer' => [
+                'email' => $order->customer_email,
+                'givenNames' => $order->customer_first_name,
+                'surname' => $order->customer_last_name,
+                'phoneNumber' => $telephone
+            ],
+            'merchantReference' => $override['merchantOrderId'],
+            'billing' => [
+                'name' => $bill->first_name . ' ' .$bill->last_name,
+                'line1' => $bill->address,
+                'area1' => $bill->state,
+                'area2' => $bill->city,
+                'region' => $bill->state,
+                'postcode' => $bill->postcode,
+                'phoneNumber' => $bill->phone,
+                'countryCode' => $bill->country,
+            ],
+            'shipping' => [
+                'name' => $shop->first_name . ' ' .$shop->last_name,
+                'line1' => $shop->address,
+                'area1' => $shop->state,
+                'area2' => $shop->city,
+                'region' => $shop->state,
+                'postcode' => $shop->postcode,
+                'phoneNumber' => $shop->phone,
+                'countryCode' => $shop->country,
+            ],
+            'merchant' => [
+                'redirectConfirmUrl' => $this->getBaseUlr() . '/afterpay/webhook/hook?order_id=' . $override['merchantOrderId'],
+                'redirectCancelUrl' => $this->getBaseUlr() . '/afterpay/webhook/hook?order_id=' . $override['merchantOrderId']
+            ],
+            'items' => $products
+        ];
+        $client = new Client();
+        $response = $client->request('POST', $this->createPaymentUlr, [
+            'headers' => [
+                'Accept' => 'application/json',
+                'Content-Type' => 'application/json',
+                'Authorization' =>  'Bearer '.base64_encode("{$this->clientId}:{$this->apikey}")
+            ],
+            'json' => $data,
+            'timeout' => 30,
+            'verify' => false
+        ]);
+        $resultObject = json_decode($response->getBody()->getContents());
+        if (empty($resultObject->token)) {
+            throw new \Exception($resultObject->message);
+        } else {
+            return $resultObject->token;
+        }
+    }
+
+    public function capture($token)
+    {
+        $client = new Client();
+        $response = $client->request('POST', $this->capturePaymentUlr, [
+            'headers' => [
+                'Accept' => 'application/json',
+                'Content-Type' => 'application/json',
+                'Authorization' =>  'Bearer '.base64_encode("{$this->clientId}:{$this->apikey}")
+            ],
+            'json' => ['token' => $token],
+            'timeout' => 30,
+            'verify' => false
+        ]);
+        $resultObject = json_decode($response->getBody()->getContents());
+        if ($resultObject->token == 'APPROVED') {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public function paymentsSuccess($orderId, $transactionId)
+    {
+        $order = app(OrderRepository::class)->find($orderId);
+        if (!$order->id) {
+            return new \Exception('order is empty');
+        }
+        if ($order->status != Order::STATUS_PENDING) {
+            return new \Exception('order status is error');
+        }
+        $additional = $order->payment->additional;
+        $additionalObg = json_decode($additional);
+        $token = $additionalObg->gateway_order_id;
+        if ($transactionId != $token) {
+            return new \Exception('order token is error');
+        }
+        if (!$this->capture($token)) {
+            return new \Exception('order capture fail');
+        }
+        $order->status = Order::STATUS_PROCESSING;
+        $order->save();
+        $additional['transaction_id'] = $transactionId;
+        if ($order->payment) {
+            $order->payment->additional = $additional;
+            $order->payment->save();
+        }
+        return true;
+    }
+
+    public function getBaseUlr()
+    {
+        return  config('app.url');
+    }
+
+
+    public function checkSignature($data, $exp)
+    {
+        if (empty($data)) {
+            return false;
+        }
+        if (hash_hmac('sha256', $data['timestamp'].$data['content'], $this->$exp) != $data['signature']) {
+            return false;
+        }
+        return true;
+    }
+
+    public function getImage()
+    {
+        $url = $this->getConfigData('image');
+
+        return $url ? Storage::url($url) : bagisto_asset('images/cash-on-delivery.png', 'shop');
+    }
+
+    public function isAvailable()
+    {
+        if (! parent::isAvailable()) {
+            return false;
+        }
+        $cart = Cart::getCart();
+        $billingCountry = $cart->billing_address->country;
+        $allowedCountries = ['AU', 'CA', 'NZ', 'GB', 'US'];
+        return in_array($billingCountry, $allowedCountries);
+    }
+
+    public function formatCurrencyValue($number): float
+    {
+        return round((float) $number, 2);
+    }
+}

+ 30 - 0
packages/Longyi/Pay/Afterpay/src/Providers/AfterpayServiceProvider.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace Longyi\Pay\Afterpay\Providers;
+
+use Illuminate\Support\ServiceProvider;
+
+class AfterpayServiceProvider extends ServiceProvider
+{
+    public function register(): void
+    {
+        $this->registerConfig();
+    }
+
+    public function boot(): void
+    {
+        $this->loadRoutesFrom(__DIR__.'/../Http/routes.php');
+        $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'Afterpay');
+    }
+
+    protected function registerConfig()
+    {
+        $this->mergeConfigFrom(
+            dirname(__DIR__) . '/Config/payment-methods.php', 'payment_methods'
+        );
+
+        $this->mergeConfigFrom(
+            dirname(__DIR__) . '/Config/system.php', 'core'
+        );
+    }
+}