diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3edb07c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7422ab2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# Path-based git attributes +# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html + +# Ignore all test and documentation with "export-ignore". +/.gitattributes export-ignore +/.gitignore export-ignore +/pint.json export-ignore +/.editorconfig export-ignore +/.github export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b1c263 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/vendor +/.idea +/.vscode +/.fleet diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c5f0f9e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Lịch sử thay đổi + +Tất cả thay đổi của `fob-vietnam-bank-qr` sẽ được mô tả trong file này + +## 1.0.0 - 2024-03-08 + +- Bản phát hành đầu tiên +- Chúc mừng ngày Quốc Tế Phụ Nữ 8/3 🥳 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2d7c45b --- /dev/null +++ b/LICENSE @@ -0,0 +1,41 @@ +MIT License + +Copyright (c) Friends Of Botble + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +Bản quyền (c) Friends Of Botble + +Giấy phép này được cấp miễn phí cho bất kỳ ai nhận được bản sao của tài liệu này +và các tệp liên quan ("Phần mềm") nhận được để sử dụng, sao chép, sửa đổi, +hợp nhất, xuất bản, phân phối, cấp phép, và/hoặc bán sao chép của Phần mềm, +và cho phép người nhận của Phần mềm thực hiện điều này, dưới điều kiện sau: + +Thông báo bản quyền trên và thông cáo này phải được bao gồm trong tất cả +các bản sao hoặc phần quan trọng của Phần mềm. + +PHẦN MỀM ĐƯỢC CUNG CẤP "NHƯ VẬY", KHÔNG CÓ BẤT KỲ LOẠI BẢO ĐẢM NÀO, CHỈ RÕ RÀNG +HAY ẨN Ý, BAO GỒM NHƯNG KHÔNG GIỚI HẠN, CÁC BẢO ĐẢM VỀ CHẤT LƯỢNG KINH DOANH, +PHÙ HỢP CHO MỘT MỤC ĐÍCH NHẤT ĐỊNH, VÀ VI PHẠM QUYỀN SỞ HỮU HOẶC SỰ PHẠM TỘI. +TRONG KHÔNG CÓ TRƯỜNG HỢP NÀO TÁC GIẢ HOẶC CHỦ SỞ HỮU BẢN QUYỀN CHỊU TRÁCH +NHIỆM ĐỐI VỚI BẤT KỲ YÊU CẦU, THIỆT HẠI HOẶC PHÁT VÀO, BẤT KỲ TRÁCH NHIỆM PHÁP LÝ, +ĐẶC BIỆT HOẶC TRÁCH NHIỆM NÀO KHÁC, XUẤT PHÁT TỪ HOẶC TRONG CỐT, +HOẶC LIÊN QUAN ĐẾN PHẦN MỀM HOẶC VIỆC SỬ DỤNG HOẶC CÁC GIAO DIỆN VỚI PHẦN MỀM. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0c8d53b --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# Mã QR Chuyển Tiền Ngân Hàng Việt Nam + +Plugin này cho phép bạn hiển thị mã QR code chuyển tiền qua các ứng dụng +ngân hàng ở Việt Nam theo tiêu chuẩn của VietQR khi khách hàng chọn hình +thức thanh toán theo dạng chuyển khoản. + +Bạn cần cấu hình thông tin tài khoản ngân hàng Việt Nam trong cổng +thanh toán khi sử dụng tính năng này. + +![](./screenshot-demo.png) + +## Yêu cầu tối thiểu + +- Botble core 7.2.3 hoặc cao hơn. + +## Cài đặt + +### Cài đặt thông qua bảng quản trị + +Vào **Bảng quản trị (Admin)** và chọn **Plugins**. Bấm vào nút "Thêm mới (Add new)", tìm kiếm plugin **Mã QR Chuyển Tiền Ngân Hàng Việt Nam** và sau đó bấm vào "Cài đặt (Install)". + +### Cài đặt thủ công + +1. Bạn có thể tải về các bản phát hình tại đây hoặc trên [Botble Marketplace](https://marketplace.botble.com/products/friendsofbotble/fob-vietnam-bank-qr). +2. Giải nén file nén vào thư mục `platform/plugins`. +3. Vào **Bảng quản trị (Admin)** và chọn **Plugins** và bấm vào nút **Kích hoạt (Activate)**. + +## Lịch sử thay đổi + +Vui lòng xem [LỊCH SỬ THAY ĐỔI](CHANGELOG.md) để xem chi tiết. + +## Bảo mật + +Nếu bạn phát hiện bất kỳ vấn đề liên quan đến bảo mật nào, vui lòng gửi email tới friendsofbotble@gmail.com thay vì sử dụng issues. + +## Credits + +- [Friends Of Botble](https://github.com/FriendsOfBotble) +- [All Contributors](../../contributors) + +## Giấy phép + +MIT License (MIT). Vui lòng đọc trong phần [thông tin giấy phép](LICENSE). diff --git a/plugin.json b/plugin.json new file mode 100644 index 0000000..5d5e2f1 --- /dev/null +++ b/plugin.json @@ -0,0 +1,11 @@ +{ + "id": "friendsofbotble/fob-vietnam-bank-qr", + "name": "Mã QR Chuyển Tiền Ngân Hàng Việt Nam", + "namespace": "FriendsOfBotble\\VietnamBankQr\\", + "provider": "FriendsOfBotble\\VietnamBankQr\\Providers\\VietnamBankQrServiceProvider", + "author": "Friends Of Botble", + "url": "https://github.com/FriendsOfBotble", + "version": "1.0.0", + "description": "Plugin này dùng để hiển thị mã QR chuyển tiền hay dùng phương thức chuyển khoản ngân hàng Việt Nam.", + "minimum_core_version": "7.2.3" +} diff --git a/resources/views/bank-info.blade.php b/resources/views/bank-info.blade.php new file mode 100644 index 0000000..16f0acc --- /dev/null +++ b/resources/views/bank-info.blade.php @@ -0,0 +1,138 @@ + + + +
+

Quét mã QR để thanh toán

+
+
+ QR Code +
Sử dụng Ứng dụng ngân hàng để quét mã.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tên Ngân Hàng + {{ $bank['short_name'] }} - {{ $bank['name'] }} +
Chủ Tài Khoản + {{ $bank['account_name'] }} +
Số Tài Khoản + {{ $bankAccount = $bank['account_number'] }} + + + + +
Nội Dung Chuyển Khoản + {{ $bankTransferDescription }} + + + + +
Số Tiền Giao Dịch + {{ $formattedOrderAmount = number_format($orderAmount, 0, ',', '.') . ' ₫' }} + + + + +
+ +
+

Vui lòng giữ nguyên nội dung chuyển khoản {{ $bankTransferDescription }} và nhập đúng số tiền {{ $formattedOrderAmount }} để được xác nhận thanh toán trực tuyến.

+
+
+
+ + diff --git a/screenshot-demo.png b/screenshot-demo.png new file mode 100644 index 0000000..ab733ce Binary files /dev/null and b/screenshot-demo.png differ diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..fcefdf7 Binary files /dev/null and b/screenshot.png differ diff --git a/src/Plugin.php b/src/Plugin.php new file mode 100644 index 0000000..502214b --- /dev/null +++ b/src/Plugin.php @@ -0,0 +1,9 @@ +setNamespace('plugins/fob-vietnam-bank-qr') + ->loadAndPublishViews(); + + BankTransferPaymentMethodForm::extend(function (BankTransferPaymentMethodForm $form) { + $paymentMethod = PaymentMethodEnum::BANK_TRANSFER; + + return $form + ->addAfter( + sprintf('payment_%s_description', $paymentMethod), + sprintf('payment_%s_vietnam_bank_bin', $paymentMethod), + SelectField::class, + SelectFieldOption::make() + ->label('Ngân hàng') + ->choices( + collect(VietQR::getBanksList()) + ->mapWithKeys(fn ($bank) => [$bank['bin'] => "{$bank['short_name']} - {$bank['name']}"]) + ->toArray() + ) + ->selected(get_payment_setting('vietnam_bank_bin', $paymentMethod)) + ->toArray() + ) + ->addAfter( + sprintf('payment_%s_vietnam_bank_bin', $paymentMethod), + sprintf('payment_%s_vietnam_bank_account_name', $paymentMethod), + TextField::class, + TextFieldOption::make() + ->label('Chủ tài khoản') + ->value(get_payment_setting('vietnam_bank_account_name', $paymentMethod)) + ->toArray() + ) + ->addAfter( + sprintf('payment_%s_vietnam_bank_account_name', $paymentMethod), + sprintf('payment_%s_vietnam_bank_account_number', $paymentMethod), + TextField::class, + TextFieldOption::make() + ->label('Số tài khoản') + ->value(get_payment_setting('vietnam_bank_account_number', $paymentMethod)) + ->toArray() + ) + ->addAfter( + sprintf('payment_%s_vietnam_bank_account_number', $paymentMethod), + sprintf('payment_%s_vietnam_bank_description_template', $paymentMethod), + TextField::class, + TextFieldOption::make() + ->label('Nội dung chuyển khoản') + ->value(get_payment_setting('vietnam_bank_description_template', $paymentMethod, VietQR::getDefaultTransferDescription())) + ->helperText('Bạn có thể dùng [ma_don_hang] để hiển thị mã đơn trong nội dung chuyển khoản, vui lòng dùng Tiếng Việt không dấu và không chứa ký tự đặc biệt.') + ->toArray() + ); + }); + + add_filter('ecommerce_thank_you_customer_info', function (string|null $html, Collection|Order $orders) { + if (! VietQR::isEnabled()) { + return $html; + } + + if (! $orders instanceof Collection) { + $collection = new Collection(); + $collection->add($orders); + $orders = $collection; + } + + $currentCurrency = $supportedCurrency = get_application_currency(); + $unsupportedCurrency = false; + + if (strtoupper($currentCurrency->title) !== 'VND') { + $supportedCurrency = Currency::query()->where('title', 'VND')->first(); + + if (! $supportedCurrency) { + $unsupportedCurrency = true; + } + } + + if ($unsupportedCurrency) { + return $html; + } + + $orderAmount = 0; + $orderCode = ''; + + foreach ($orders as $item) { + $orderAmount += $item->amount; + $orderCode .= $item->code . ', '; + } + + $orderCode = rtrim(trim($orderCode), ','); + + if ($supportedCurrency->isNot($currentCurrency)) { + $paymentData['currency'] = strtoupper($item->payment->currency); + + if ($currentCurrency->is_default) { + $orderAmount = $orderAmount * $supportedCurrency->exchange_rate; + } else { + $orderAmount = $orderAmount / $currentCurrency->exchange_rate; + } + } else { + $orderAmount = format_price($orderAmount, withoutCurrency: true); + } + + $html .= view( + 'plugins/fob-vietnam-bank-qr::bank-info', + [ + 'orderAmount' => $orderAmount, + 'imageUrl' => VietQR::getImageUrl($orderAmount, $orderCode), + 'bank' => VietQR::getBankInfo(), + 'bankTransferDescription' => VietQR::getTransferDescription($orderCode), + 'currentCurrency' => $supportedCurrency, + ] + )->render(); + + return $html; + }, 9999, 2); + } +} diff --git a/src/VietQR.php b/src/VietQR.php new file mode 100644 index 0000000..89129df --- /dev/null +++ b/src/VietQR.php @@ -0,0 +1,330 @@ + $amount, + 'addInfo' => static::getTransferDescription($orderCode), + 'accountName' => get_payment_setting('vietnam_bank_account_name', $paymentMethod), + ]); + + return sprintf( + 'https://img.vietqr.io/image/%s-%s-qr_only.png?%s', + get_payment_setting('vietnam_bank_bin', $paymentMethod), + get_payment_setting('vietnam_bank_account_number', $paymentMethod), + $query + ); + } + + public static function getBankInfo(): array|null + { + if (! static::isEnabled()) { + return null; + } + + $bank = static::getBankByBin( + get_payment_setting('vietnam_bank_bin', PaymentMethodEnum::BANK_TRANSFER) + ); + + $paymentMethod = PaymentMethodEnum::BANK_TRANSFER; + + return $bank + ? [ + ...$bank, + 'account_name' => get_payment_setting('vietnam_bank_account_name', $paymentMethod), + 'account_number' => get_payment_setting('vietnam_bank_account_number', $paymentMethod), + ] + : null; + } + + public static function getBankByBin(string $bin): array|null + { + $banks = static::getBanksList(); + + return collect($banks)->first(fn ($bank) => $bank['bin'] === $bin); + } + + public static function getBanksList(): array + { + return [ + [ + 'name' => 'Ngân hàng TMCP An Bình', + 'code' => 'ABB', + 'bin' => '970425', + 'short_name' => 'ABBANK', + ], + [ + 'name' => 'Ngân hàng TMCP Á Châu', + 'code' => 'ACB', + 'bin' => '970416', + 'short_name' => 'ACB', + ], + [ + 'name' => 'Ngân hàng TMCP Bắc Á', + 'code' => 'BAB', + 'bin' => '970409', + 'short_name' => 'BacABank', + ], + [ + 'name' => 'Ngân hàng TMCP Đầu tư và Phát triển Việt Nam', + 'code' => 'BIDV', + 'bin' => '970418', + 'short_name' => 'BIDV', + ], + [ + 'name' => 'Ngân hàng TMCP Bảo Việt', + 'code' => 'BVB', + 'bin' => '970438', + 'short_name' => 'BaoVietBank', + ], + [ + 'name' => 'TMCP Việt Nam Thịnh Vượng - Ngân hàng số CAKE by VPBank', + 'code' => 'CAKE', + 'bin' => '546034', + 'short_name' => 'CAKE', + ], + [ + 'name' => 'Ngân hàng TNHH MTV CIMB Việt Nam', + 'code' => 'CIMB', + 'bin' => '422589', + 'short_name' => 'CIMB', + ], + [ + 'name' => 'Ngân hàng Hợp tác xã Việt Nam', + 'code' => 'COOPBANK', + 'bin' => '970446', + 'short_name' => 'COOPBANK', + ], + [ + 'name' => 'Ngân hàng TMCP Xuất Nhập khẩu Việt Nam', + 'code' => 'EIB', + 'bin' => '970431', + 'short_name' => 'Eximbank', + ], + [ + 'name' => 'Ngân hàng TMCP Phát triển Thành phố Hồ Chí Minh', + 'code' => 'HDB', + 'bin' => '970437', + 'short_name' => 'HDBank', + ], + [ + 'name' => 'Ngân hàng TMCP Công thương Việt Nam', + 'code' => 'ICB', + 'bin' => '970415', + 'short_name' => 'VietinBank', + ], + [ + 'name' => 'Ngân hàng Đại chúng TNHH Kasikornbank', + 'code' => 'KBank', + 'bin' => '668888', + 'short_name' => 'KBank', + ], + [ + 'name' => 'Ngân hàng TMCP Kiên Long', + 'code' => 'KLB', + 'bin' => '970452', + 'short_name' => 'KienLongBank', + ], + [ + 'name' => 'Ngân hàng TMCP Bưu Điện Liên Việt', + 'code' => 'LPB', + 'bin' => '970449', + 'short_name' => 'LienVietPostBank', + ], + [ + 'name' => 'Ngân hàng TMCP Quân đội', + 'code' => 'MB', + 'bin' => '970422', + 'short_name' => 'MBBank', + ], + [ + 'name' => 'Ngân hàng TMCP Hàng Hải', + 'code' => 'MSB', + 'bin' => '970426', + 'short_name' => 'MSB', + ], + [ + 'name' => 'Ngân hàng TMCP Nam Á', + 'code' => 'NAB', + 'bin' => '970428', + 'short_name' => 'NamABank', + ], + [ + 'name' => 'Ngân hàng TMCP Quốc Dân', + 'code' => 'NCB', + 'bin' => '970419', + 'short_name' => 'NCB', + ], + [ + 'name' => 'Ngân hàng TMCP Phương Đông', + 'code' => 'OCB', + 'bin' => '970448', + 'short_name' => 'OCB', + ], + [ + 'name' => 'Ngân hàng Thương mại TNHH MTV Đại Dương', + 'code' => 'Oceanbank', + 'bin' => '970414', + 'short_name' => 'Oceanbank', + ], + [ + 'name' => 'Ngân hàng TMCP Xăng dầu Petrolimex', + 'code' => 'PGB', + 'bin' => '970430', + 'short_name' => 'PGBank', + ], + [ + 'name' => 'Ngân hàng TMCP Đại Chúng Việt Nam', + 'code' => 'PVCB', + 'bin' => '970412', + 'short_name' => 'PVcomBank', + ], + [ + 'name' => 'Ngân hàng TMCP Sài Gòn', + 'code' => 'SCB', + 'bin' => '970429', + 'short_name' => 'SCB', + ], + [ + 'name' => 'Ngân hàng TMCP Đông Nam Á', + 'code' => 'SEAB', + 'bin' => '970440', + 'short_name' => 'SeABank', + ], + [ + 'name' => 'Ngân hàng TMCP Sài Gòn Công Thương', + 'code' => 'SGICB', + 'bin' => '970400', + 'short_name' => 'SaigonBank', + ], + [ + 'name' => 'Ngân hàng TMCP Sài Gòn - Hà Nội', + 'code' => 'SHB', + 'bin' => '970443', + 'short_name' => 'SHB', + ], + [ + 'name' => 'Ngân hàng TNHH MTV Shinhan Việt Nam', + 'code' => 'SHBVN', + 'bin' => '970424', + 'short_name' => 'ShinhanBank', + ], + [ + 'name' => 'Ngân hàng TMCP Sài Gòn Thương Tín', + 'code' => 'STB', + 'bin' => '970403', + 'short_name' => 'Sacombank', + ], + [ + 'name' => 'Ngân hàng TMCP Kỹ thương Việt Nam', + 'code' => 'TCB', + 'bin' => '970407', + 'short_name' => 'Techcombank', + ], + [ + 'name' => 'Ngân hàng số Timo by Ban Viet Bank (Timo by Ban Viet Bank)', + 'code' => 'TIMO', + 'bin' => '963388', + 'short_name' => 'Timo', + ], + [ + 'name' => 'Ngân hàng TMCP Tiên Phong', + 'code' => 'TPB', + 'bin' => '970423', + 'short_name' => 'TPBank', + ], + [ + 'name' => 'TMCP Việt Nam Thịnh Vượng - Ngân hàng số Ubank by VPBank', + 'code' => 'Ubank', + 'bin' => '546035', + 'short_name' => 'Ubank', + ], + [ + 'name' => 'Ngân hàng TMCP Việt Á', + 'code' => 'VAB', + 'bin' => '970427', + 'short_name' => 'VietABank', + ], + [ + 'name' => 'Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam', + 'code' => 'VBA', + 'bin' => '970405', + 'short_name' => 'Agribank', + ], + [ + 'name' => 'Ngân hàng TMCP Ngoại Thương Việt Nam', + 'code' => 'VCB', + 'bin' => '970436', + 'short_name' => 'Vietcombank', + ], + [ + 'name' => 'Ngân hàng TMCP Bản Việt', + 'code' => 'VCCB', + 'bin' => '970454', + 'short_name' => 'VietCapitalBank', + ], + [ + 'name' => 'Ngân hàng TMCP Quốc tế Việt Nam', + 'code' => 'VIB', + 'bin' => '970441', + 'short_name' => 'VIB', + ], + [ + 'name' => 'Ngân hàng TMCP Việt Nam Thương Tín', + 'code' => 'VIETBANK', + 'bin' => '970433', + 'short_name' => 'VietBank', + ], + [ + 'name' => 'Ngân hàng TMCP Việt Nam Thịnh Vượng', + 'code' => 'VPB', + 'bin' => '970432', + 'short_name' => 'VPBank', + ], + [ + 'name' => 'Ngân hàng TNHH MTV Woori Việt Nam', + 'code' => 'WVN', + 'bin' => '970457', + 'short_name' => 'Woori', + ], + ]; + } +}