# payOS > payOS Documentation ## docs Tài liệu hướng dẫn tích hợp payOS - [Bắt đầu](/index.md): Tài liệu hướng dẫn tích hợp payOS ### api payOS API - [payOS API (latest)](/api.md): payOS API ### demo payOS Demo Page - [Trang demo payOS](/demo.md): payOS Demo Page ### sample Sample code and demo - [Mã nguồn mẫu và Demo](/sample.md): Sample code and demo ### search - [Tìm kiếm](/search.md) ### cau-hoi-thuong-gap Các câu hỏi thường gặp khi tích hợp payOS - [Các câu hỏi thường gặp](/cau-hoi-thuong-gap.md): Các câu hỏi thường gặp khi tích hợp payOS ### checkout Tổng quan về trang thanh toán payOS - [Tổng quan](/checkout.md): Tổng quan về trang thanh toán payOS - [Cách hoạt động payOS Checkout](/checkout/how-checkout-works.md): Tìm hiểu cách hoạt động Checkout để thu các khoản thanh toán trên trang web của bạn - [payOS Embedded Form](/checkout/quick-start-payos-embedded-form.md): Nhúng giao diện thanh toán payOS vào ứng dụng - [payOS Embedded Form - Complete Guide](/checkout/quick-start-payos-embedded-form-static.md): Nhúng giao diện thanh toán vào website hoặc ứng dụng của bạn - [payOS-Hosted Page](/checkout/quick-start-payos-hosted-page.md): Chuyển hướng đến trang thanh toán của payOS - [payOS-Hosted Page - Complete Guide](/checkout/quick-start-payos-hosted-page-static.md): Chuyển hướng đến trang thanh toán của payOS ### developer-program Thông tin về việc tích hợp Partner Code trong Chương trình Đối tác tích hợp - [Chương Trình Đối Tác Tích Hợp payOS](/developer-program.md): Thông tin về việc tích hợp Partner Code trong Chương trình Đối tác tích hợp ### downloads Downloads - [Downloads](/downloads.md): Downloads ### du-lieu-tra-ve - [Return URL](/du-lieu-tra-ve/return-url.md): Sau khi thực hiện thanh toán trình duyệt sẽ điều hướng về trang mà người dùng đã khai báo ở returnUrl đã được khai báo trong API tạo link thanh toán. Ngược lại, nếu người dùng hủy thanh toán, trình duyệt sẽ điều hướng về cancelUrl. - [Webhook thông tin thanh toán](/du-lieu-tra-ve/webhook.md) ### huong-dan-su-dung - [Kết nối tài khoản ví điện tử Bảo kim](/huong-dan-su-dung/kenh-chi/ket-noi-tai-khoan/vi-baokim.md): Hướng dẫn kết nối Ví điện tử Bảo kim vào payOS. - [Nạp số dư ví Bảo Kim](/huong-dan-su-dung/kenh-chi/nap-so-du-vi.md): Trước khi bắt đầu - [Tạo kênh chuyển tiền](/huong-dan-su-dung/kenh-chi/tao-kenh-chuyen-tien.md): Trước khi bắt đầu - [Thanh toán gói dịch vụ chi payOS](/huong-dan-su-dung/kenh-chi/thanh-toan-goi-dich-vu.md): Trước khi bắt đầu - [Kết nối tài khoản ngân hàng ACB](/huong-dan-su-dung/kenh-thu/ket-noi-tai-khoan/ngan-hang-acb.md): Hướng dẫn kết nối tài khoản ngân hàng ACB vào payOS. - [Kết nối tài khoản ngân hàng BIDV](/huong-dan-su-dung/kenh-thu/ket-noi-tai-khoan/ngan-hang-bidv.md): Hướng dẫn kết nối tài khoản ngân hàng BIDV vào payOS. - [Kết nối tài khoản ngân hàng KienlongBank](/huong-dan-su-dung/kenh-thu/ket-noi-tai-khoan/ngan-hang-klb.md): Hướng dẫn kết nối tài khoản ngân hàng KienlongBank vào payOS. - [Kết nối tài khoản ngân hàng MB](/huong-dan-su-dung/kenh-thu/ket-noi-tai-khoan/ngan-hang-mb.md): Hướng dẫn kết nối tài khoản ngân hàng MB vào payOS. - [Kết nối tài khoản ngân hàng MSB](/huong-dan-su-dung/kenh-thu/ket-noi-tai-khoan/ngan-hang-msb.md): Hướng dẫn kết nối tài khoản ngân hàng MSB vào payOS. - [Kết nối tài khoản ngân hàng OCB](/huong-dan-su-dung/kenh-thu/ket-noi-tai-khoan/ngan-hang-ocb.md): Hướng dẫn kết nối tài khoản ngân hàng OCB vào payOS. - [Kết nối tài khoản ngân hàng VPBank](/huong-dan-su-dung/kenh-thu/ket-noi-tai-khoan/ngan-hang-vpbank.md): Hướng dẫn kết nối tài khoản ngân hàng VPBank NEOBiz vào payOS. - [Ngân hàng dự phòng](/huong-dan-su-dung/kenh-thu/ngan-hang-du-phong.md): Tại sao cần thiết lập ngân hàng dự phòng cho kênh thanh toán? - [Tạo kênh thanh toán](/huong-dan-su-dung/kenh-thu/tao-kenh-thanh-toan.md): Trước khi bắt đầu - [Kết nối tài khoản ngân hàng thông qua Cas](/huong-dan-su-dung/ket-noi-tai-khoan-ngan-hang.md): Cas là gì? - [Tạo tài khoản payOS](/huong-dan-su-dung/tao-tai-khoan-payos.md): Bước 1//my.payos.vn/login để đăng nhập. - [Thêm thành viên](/huong-dan-su-dung/them-thanh-vien.md): Bước 1 - [Thêm tổ chức mới](/huong-dan-su-dung/them-to-chuc-moi.md): Một tài khoản Email có thể tạo nhiều tổ chức. - [Xác thực tổ chức](/huong-dan-su-dung/xac-thuc-to-chuc.md): Đối tượng sử dụng của payOS là bất kì mô hình kinh doanh nào ### moi-truong-test Hướng dẫn trải nghiệm và kiểm thử tích hợp payOS trên môi trường thực tế - [Môi trường test payOS](/moi-truong-test.md): Hướng dẫn trải nghiệm và kiểm thử tích hợp payOS trên môi trường thực tế ### sdks - [Golang SDK](/sdks/back-end/golang.md): The payOS library provides convenient access to the payOS API from applications written in Golang. - [Java SDK](/sdks/back-end/java.md): The payOS library provides convenient access to the payOS API from applications written in Java. - [.NET Core SDK](/sdks/back-end/net.md): The payOS library provides convenient access to the payOS API from applications written in .Net Core. - [NodeJS SDK](/sdks/back-end/node.md): The payOS Node library provides convenient access to the payOS API from applications written in server-side JavaScript. - [PHP SDK](/sdks/back-end/php.md): The payOS library provides convenient access to the payOS API from applications written in PHP. - [Python SDK](/sdks/back-end/python.md): The payOS library provides convenient access to the payOS API from applications written in python. - [payOS Checkout Script JS](/sdks/front-end/script-js.md): Script xử lý kết quả thanh toán ở giao diện - [SDKs](/sdks/intro.md): Danh sách SDK của payOS ### tich-hop-webhook - [Kiểm tra dữ liệu với signature](/tich-hop-webhook/kiem-tra-du-lieu-voi-signature.md): Kiểm tra thông tin bằng chữ ký (payment-requests) - [Tích hợp Sapo](/tich-hop-webhook/sapo.md): Mỗi khi phát sinh một giao dịch mới, dựa trên mã đơn hàng và số tiền người dùng đã chuyển, payOS sẽ tự động xác nhận thanh toán và chuyển trạng thái đơn hàng trực tiếp trên website Sapo. - [Tích hợp WooCommerce với payOS](/tich-hop-webhook/woocommerce.md): Tải plugin payOS và thiết lập theo hướng dẫn. --- # Full Documentation Content [Chuyển tới nội dung chính](#__docusaurus_skipToContent_fallback) 🎉️ **payOS ra mắt tính năng [Chi hộ](https://payos.vn/ra-mat-kenh-chi-tren-payos-giai-phap-chi-tu-dong-qua-api/)! Trải nghiệm ngay!** 🥳️ [![payOS Logo](/docs/img/logo.svg)![payOS Logo](/docs/img/logo-dark.svg)](/docs/.md) [API](/docs/api/.md)[Sample & Demo](/docs/sample.md) Tìm kiếm [](https://t.me/+rIPftr5wgHY3ODQ9)[Đăng nhập](https://my.payos.vn) [![payOS Logo](https://payos.vn/wp-content/uploads/2025/06/Casso-payOSLogo-1.svg)](https://payos.vn) * Thu * Link thanh toán * postTạo link thanh toán * getLấy thông tin link thanh toán * postHuỷ link thanh toán * getLấy thông tin hóa đơn * getTải hóa đơn * Webhook thanh toán * EventWebhook nhận thông tin thanh toán * postKiểm tra và thêm hoặc cập nhật Webhook url * Chi * Lệnh chi * postTạo lệnh chi đơn * getLấy danh sách lệnh chi * postTạo lệnh chi hàng loạt * getLấy thông tin lệnh chi * postƯớc tính chi phí * Tài khoản chi * getLấy thông tin số dư tài khoản chi [API docs by Redocly](https://redocly.com/redoc/) # payOS API (latest) payOS support : URL: [Terms of Service](https://payos.vn/thoa-thuan-su-dung/) Danh sách các API payOS hỗ trợ. ### Trước khi bắt đầu * Bạn đã tạo một tài khoản . * Bạn đã xác thực một doanh nghiệp hoặc cá nhân trên , [xem hướng dẫn](https://payos.vn/docs/huong-dan-su-dung/xac-thuc-to-chuc/) * Bạn đã tạo một kênh thanh toán, [xem hướng dẫn](https://payos.vn/docs/huong-dan-su-dung/tao-kenh-thanh-toan/). ### Môi trường * Production: [![Run In Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/29524979-a48b6c56-6af4-4078-b816-60289d9b325a?action=collection%2Ffork\&source=rip_markdown\&collection-url=entityId%3D29524979-a48b6c56-6af4-4078-b816-60289d9b325a%26entityType%3Dcollection%26workspaceId%3D2a03af40-267c-41b5-8a8f-1986ca23dd22) Đăng ký chương trình đối tác tích hợp payOS [Tại đây](https://payos.vn/chuong-trinh-doi-tac-tich-hop/) ## [](#tag/payment-request)Link thanh toán Link thanh toán ## [](#tag/payment-request/operation/payment-request)Tạo link thanh toán API dùng để tạo link thanh toán đơn hàng ##### Authorizations: (*x-client-id**x-api-key*) ##### header Parameters | | | | -------------- | -------------------------------------------------------------------------------------------------------------------------- | | x-partner-code | stringPartner Code tham gia chương trình tích hợp đối tác payOS [Tại đây](https://payos.vn/chuong-trinh-doi-tac-tich-hop/) | ##### Request Body schema: application/json | | | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | orderCoderequired | integerMã đơn hàng | | amountrequired | integerSố tiền thanh toán | | descriptionrequired | stringMô tả thanh toán, với tài khoản ngân hàng không phải liên kết qua payOS thì giới hạn ký tự là 9 | | buyerName | stringTên của người mua hàng. Thông tin dùng trong trường hợp tích hợp tạo hoá đơn điện tử. | | buyerCompanyName | stringTên đơn vị mua hàng. Thông tin dùng trong trường hợp tích hợp tạo hoá đơn điện tử. | | buyerTaxCode | stringMã số thuế của đơn vị mua hàng. Thông tin dùng trong trường hợp tích hợp tạo hoá đơn điện tử. | | buyerAddress | stringĐịa chỉ của đơn vị mua hàng. Thông tin dùng trong trường hợp tích hợp tạo hoá đơn điện tử. | | buyerEmail | string<email>Email của người mua hàng. Thông tin dùng trong trường hợp tích hợp tạo hoá đơn điện tử. | | buyerPhone | stringSố điện thoại người mua hàng. Thông tin dùng trong trường hợp tích hợp tạo hoá đơn điện tử. | | items | Array of objectsDanh sách các sản phẩm thanh toán | | cancelUrlrequired | string<uri>URL nhận dữ liệu khi người dùng chọn Huỷ đơn hàng. | | returnUrlrequired | string<uri>URL nhận dữ liệu khi đơn hàng thanh toán thành công | | invoice | objectThông tin hóa đơn | | expiredAt | number<timestamp>Thời gian hết hạn của link thanh toán, là Unix Timestamp và kiểu Int32 | | signaturerequired | stringChữ ký kiểm tra thông tin không bị thay đổi trong qua trình chuyển dữ liệu từ hệ thống của bạn sang payOS. Bạn cần dùng checksum key từ Kênh thanh toán và HMAC\_SHA256 để tạo signature và data theo định dạng được sort theo alphabet: `amount=$amount&cancelUrl=$cancelUrl&description=$description&orderCode=$orderCode&returnUrl=$returnUrl`. | ### Responses **200** Thành công **401** Unauthorized **429** Too Many Request - Gọi API quá nhiều post/v2/payment-requests https\://api-merchant.payos.vn/v2/payment-requests ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "orderCode": 0, "amount": 0, "description": "string", "buyerName": "string", "buyerCompanyName": "string", "buyerTaxCode": "string", "buyerAddress": "string", "buyerEmail": "user@example.com", "buyerPhone": "string", "items": [ { "name": "string", "quantity": 0, "price": 0, "unit": "string", "taxPercentage": -2 } ], "cancelUrl": "http://example.com", "returnUrl": "http://example.com", "invoice": { "buyerNotGetInvoice": true, "taxPercentage": -2 }, "expiredAt": 0, "signature": "string" }` ### Response samples * 200 * 401 Content type application/json Example Tạo link thanh toán thành côngTạo link thanh toán thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "bin": "970422", "accountNumber": "113366668888", "accountName": "QUY VAC XIN PHONG CHONG COVID", "amount": 10000, "description": "THANH TOAN DON HANG 123", "orderCode": 123, "currency": "VND", "paymentLinkId": "124c33293c934a85be5b7f8761a27a07", "status": "PENDING", "checkoutUrl": "https://pay.payos.vn/web/124c33293c934a85be5b7f8761a27a07", "qrCode": "00020101021238570010A000000727012700069704220113113366668888020899998888530370454061000005802VN62230819THANH TOAN DON HANG6304BE36" }, "signature": "aec38349957f1a6c22ded683d06477ac5dfe047cf5f23c70dc8e048759ef1234" }` ## [](#tag/payment-request/operation/get-payment-link-info)Lấy thông tin link thanh toán API dùng để lấy thông tin của link thanh toán **Lưu ý:** Hiện tại thông tin tài khoản đối ứng trong các trường **counterAccount** chỉ được hỗ trợ bởi các ngân hàng sau: * MB Bank * ACB * KienlongBank ##### Authorizations: (*x-client-id**x-api-key*) ##### path Parameters | | | | ---------- | ------------------------------------------------------------------------------------------------------ | | idrequired | number or stringExample:3019Mã đơn hàng của cửa hàng hoặc mã link thanh toán của payOS | ### Responses **200** Thành công **401** Unauthorized **429** Too Many Request - Gọi API quá nhiều get/v2/payment-requests/{id} https\://api-merchant.payos.vn/v2/payment-requests/{id} ### Response samples * 200 * 401 Content type application/json Example Lấy thông tin link thanh toán thành côngLấy thông tin link thanh toán thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "id": "124c33293c934a85be5b7f8761a27a07", "orderCode": 123, "amount": 10000, "amountPaid": 0, "amountRemaining": 10000, "status": "PENDING", "createdAt": "2024-01-15T10:30:00.000Z", "transactions": { } }, "signature": "bec38349957f1a6c22ded683d06477ac5dfe047cf5f23c70dc8e048759ef5678" }` ## [](#tag/payment-request/operation/cancel-payment-request)Huỷ link thanh toán API dùng để hủy link thanh toán ##### Authorizations: (*x-client-id**x-api-key*) ##### path Parameters | | | | ---------- | ------------------------------------------------------------------------------------------------------ | | idrequired | number or stringExample:3019Mã đơn hàng của cửa hàng hoặc mã link thanh toán của payOS | ##### Request Body schema: application/json | | | | ------------------ | ------ | | cancellationReason | string | ### Responses **200** Thành công **401** Unauthorized **429** Too Many Request - Gọi API quá nhiều post/v2/payment-requests/{id}/cancel https\://api-merchant.payos.vn/v2/payment-requests/{id}/cancel ### Request samples * Payload Content type application/json Copy `{ "cancellationReason": "Changed my mind" }` ### Response samples * 200 * 401 Content type application/json Example Hủy link thanh toán thành côngHủy link thanh toán thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "id": "124c33293c934a85be5b7f8761a27a07", "orderCode": 123, "amount": 10000, "amountPaid": 0, "amountRemaining": 10000, "status": "CANCELLED", "createdAt": "2024-01-15T10:30:00.000Z", "canceledAt": "2024-01-15T11:00:00.000Z", "cancellationReason": "User requested cancellation", "transactions": { } }, "signature": "cec38349957f1a6c22ded683d06477ac5dfe047cf5f23c70dc8e048759ef9012" }` ## [](#tag/payment-request/operation/get-payment-link-invoices)Lấy thông tin hóa đơn API dùng để lấy thông tin hóa đơn của link thanh toán ##### Authorizations: (*x-client-id**x-api-key*) ##### path Parameters | | | | ---------- | ------------------------------------------------------------------------------------------------------ | | idrequired | number or stringExample:3019Mã đơn hàng của cửa hàng hoặc mã link thanh toán của payOS | ### Responses **200** Thành công **401** Unauthorized **429** Too Many Request - Gọi API quá nhiều get/v2/payment-requests/{id}/invoices https\://api-merchant.payos.vn/v2/payment-requests/{id}/invoices ### Response samples * 200 * 401 Content type application/json Example Lấy danh sách hóa đơn thành côngLấy danh sách hóa đơn thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "invoices": { "0": { "invoiceId": "INV123456", "invoiceNumber": "0000001", "issuedTimestamp": 1705312200000, "issuedDatetime": "2024-01-15T10:30:00.000Z", "transactionId": "TXN123", "reservationCode": "ABC123", "codeOfTax": "TAX001" } } }, "signature": "dec38349957f1a6c22ded683d06477ac5dfe047cf5f23c70dc8e048759ef3456" }` ## [](#tag/payment-request/operation/download-payment-link-invoices)Tải hóa đơn API dùng để lấy tải hóa đơn của link thanh toán ##### Authorizations: (*x-client-id**x-api-key*) ##### path Parameters | | | | ------------------ | ------------------------------------------------------------------------------------------------------ | | idrequired | number or stringExample:3019Mã đơn hàng của cửa hàng hoặc mã link thanh toán của payOS | | invoice-idrequired | stringExample:3733ea88-5131-429c-8863-6ee986133fa8Mã hóa đơn của link thanh toán | ### Responses **200** Thành công **401** Unauthorized **429** Too Many Request - Gọi API quá nhiều get/v2/payment-requests/{id}/invoices/{invoice-id}/download https\://api-merchant.payos.vn/v2/payment-requests/{id}/invoices/{invoice-id}/download ### Response samples * 200 * 401 Content type application/pdfapplication/pdf Copy ``` PDF file content ``` ## [](#tag/payment-webhook)Webhook thanh toán Webhook thanh toán ## [](#tag/payment-webhook/operation/payment-webhook)Webhook nhận thông tin thanh toán Webhook Webhook của cửa hàng dùng để nhận dữ liệu thanh toán từ payOS, [Dữ liệu mẫu](https://payos.vn/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature/) ##### Request Body schema: application/json | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | coderequired | stringMã lỗi | | descrequired | stringThông tin lỗi | | successrequired | boolean | | datarequired | object | | signaturerequired | stringChữ kí để kiểm tra thông tin, [chi tiết dữ liệu mẫu](https://payos.vn/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature/) | ### Responses **200** Phản hồi trạng thái mã 2XX để xác nhận webhook gửi thành công ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "code": "00", "desc": "success", "success": true, "data": { "orderCode": 123, "amount": 3000, "description": "VQRIO123", "accountNumber": "12345678", "reference": "TF230204212323", "transactionDateTime": "2023-02-04 18:25:00", "currency": "VND", "paymentLinkId": "124c33293c43417ab7879e14c8d9eb18", "code": "00", "desc": "Thành công", "counterAccountBankId": "", "counterAccountBankName": "", "counterAccountName": "", "counterAccountNumber": "", "virtualAccountName": "", "virtualAccountNumber": "" }, "signature": "8d8640d802576397a1ce45ebda7f835055768ac7ad2e0bfb77f9b8f12cca4c7f" }` ## [](#tag/payment-webhook/operation/confirm-webhook)Kiểm tra và thêm hoặc cập nhật Webhook url API dùng để xác thực webhook url của một kênh thanh toán đồng thời thêm hoặc cập nhật webhook url cho Kênh thanh toán đó nếu thành công. ##### Authorizations: (*x-client-id**x-api-key*) ##### Request Body schema: application/json | | | | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | webhookUrlrequired | stringĐường dẫn webhook nhận dữ liệu ngân hàng từ payOS của bạn, lưu ý: payOS.vn sẽ gửi một [dữ liệu mẫu kèm thông tin giao dịch ngân hàng mẫu](https://payos.vn/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature/) để kiểm tra xem webhook có hoạt động hay không, dùng "signature" được mã hóa bằng HMAC\_SHA256 để check xem cách tạo [tại đây](/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature.md) | ### Responses **200** Thành công **400** Webhook url invalid **401** Missing API Key & Client Key **5XX** Lỗi từ hệ thống của bạn post/confirm-webhook https\://api-merchant.payos.vn/confirm-webhook ### Request samples * Payload Content type application/json Copy `{ "webhookUrl": "https://your-server.com/webhook-url" }` ### Response samples * 200 * 400 * 401 * 5XX Content type application/json Example Xác nhận webhook thành côngXác nhận webhook thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "webhookUrl": "https://example.com/webhook", "accountNumber": "113366668888", "accountName": "QUY VAC XIN PHONG CHONG COVID", "name": "My Payment Channel", "shortName": "MPC" } }` ## [](#tag/payout)Lệnh chi Lệnh chi ## [](#tag/payout/operation/create-single-payout)Tạo lệnh chi đơn API dùng để tạo lệnh chi đơn ##### Authorizations: (*x-client-id**x-api-key*) ##### header Parameters | | | | ------------------------- | ----------------------------------------------- | | x-idempotency-keyrequired | stringKhóa để đảm bảo tính duy nhất của request | | x-signaturerequired | stringChữ ký xác thực request | ##### Request Body schema: application/jsonrequired | | | | ----------------------- | ----------------------------------- | | referenceIdrequired | stringMã tham chiếu của lệnh chi | | amountrequired | integerSố tiền thanh toán | | descriptionrequired | stringMô tả thanh toán | | toBinrequired | stringMã ngân hàng đích | | toAccountNumberrequired | stringSố tài khoản đích | | category | Array of stringsDanh mục thanh toán | ### Responses **200** Thành công **401** Unauthorized **403** Forbidden **429** Too Many Request - Gọi API quá nhiều **500** Internal server error post/v1/payouts https\://api-merchant.payos.vn/v1/payouts ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "referenceId": "payout_123", "amount": 100000, "description": "Thanh toán lương", "toBin": "970415", "toAccountNumber": "123456789", "category": { "0": "salary" } }` ### Response samples * 200 * 401 * 403 * 500 Content type application/json Example Tạo lệnh chi thành côngTạo lệnh chi thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "id": "payout_123456789", "referenceId": "ref_123456789", "transactions": { "0": { "id": "txn_123456789", "referenceId": "ref_123456789", "amount": 100000, "description": "Thanh toan", "toBin": "970422", "toAccountNumber": "123456789", "toAccountName": "NGUYEN VAN A", "state": "PROCESSING" } }, "category": { "0": "salary" }, "approvalState": "PROCESSING", "createdAt": "2024-01-15T10:30:00.000Z" } }` ## [](#tag/payout/operation/get-payouts)Lấy danh sách lệnh chi API dùng để lấy danh sách các lệnh chi ##### Authorizations: (*x-client-id**x-api-key*) ##### query Parameters | | | | ------------- | ------------------------------------------------------------------------------------------------ | | limit | integerDefault:10Example:limit=10Số lượng kết quả trên mỗi trang | | offset | integerDefault:0Vị trí bắt đầu | | referenceId | stringExample:referenceId=payout\_1752139775150Mã tham chiếu để lọc | | approvalState | stringExample:approvalState=SUCCEEDEDTrạng thái phê duyệt để lọc | | category | stringExample:category=salary,bonusDanh mục để lọc (phân cách bằng dấu phẩy) | | fromDate | stringExample:fromDate=2025-06-12T11:24:55ZLọc từ ngày (ISO 8601 format) | | toDate | stringExample:toDate=2025-08-12T11:24:55ZLọc đến ngày (ISO 8601 format) | ### Responses **200** Thành công **403** Forbidden **429** Too Many Request - Gọi API quá nhiều get/v1/payouts https\://api-merchant.payos.vn/v1/payouts ### Response samples * 200 * 403 Content type application/json Example Lấy danh sách lệnh chi thành côngLấy danh sách lệnh chi thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "payouts": { "0": { "id": "payout_123456789", "referenceId": "ref_123456789", "transactions": { "0": { "id": "txn_123456789", "referenceId": "ref_123456789", "amount": 100000, "description": "Thanh toan", "toBin": "970422", "toAccountNumber": "123456789", "toAccountName": "NGUYEN VAN A", "state": "SUCCEEDED" } }, "category": { "0": "salary" }, "approvalState": "SUCCEEDED", "createdAt": "2024-01-15T10:30:00.000Z" } }, "pagination": { "total": 1, "limit": 10, "offset": 0, "count": 1, "hasMore": false } } }` ## [](#tag/payout/operation/create-batch-payout)Tạo lệnh chi hàng loạt API dùng để tạo lô lệnh chi hàng loạt ##### Authorizations: (*x-client-id**x-api-key*) ##### header Parameters | | | | ------------------------- | ----------------------------------------------- | | x-idempotency-keyrequired | stringKhóa để đảm bảo tính duy nhất của request | | x-signaturerequired | stringChữ ký xác thực request | ##### Request Body schema: application/jsonrequired | | | | ------------------- | --------------------------------------------- | | referenceIdrequired | stringMã tham chiếu của lệnh chi | | category | Array of stringsDanh mục thanh toán | | validateDestination | booleanXác thực tài khoản đích | | payoutsrequired | Array of objects (PayoutItem) | ### Responses **200** Thành công **401** Unauthorized **403** Forbidden **429** Too Many Request - Gọi API quá nhiều **500** Internal server error post/v1/payouts/batch https\://api-merchant.payos.vn/v1/payouts/batch ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "referenceId": "batch_payout_123", "category": { "0": "salary", "1": "bonus" }, "validateDestination": true, "payouts": [ { "referenceId": "payout_123", "amount": 100000, "description": "Thanh toán lương tháng 1", "toBin": "970415", "toAccountNumber": "123456789" } ] }` ### Response samples * 200 * 401 * 403 * 500 Content type application/json Example Tạo lệnh chi thành côngTạo lệnh chi thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "id": "payout_123456789", "referenceId": "ref_123456789", "transactions": { "0": { "id": "txn_123456789", "referenceId": "ref_123456789", "amount": 100000, "description": "Thanh toan", "toBin": "970422", "toAccountNumber": "123456789", "toAccountName": "NGUYEN VAN A", "state": "PROCESSING" } }, "category": { "0": "salary" }, "approvalState": "PROCESSING", "createdAt": "2024-01-15T10:30:00.000Z" } }` ## [](#tag/payout/operation/get-payout-info)Lấy thông tin lệnh chi API dùng để lấy thông tin chi tiết của một lệnh chi ##### Authorizations: (*x-client-id**x-api-key*) ##### path Parameters | | | | ---------------- | -------------------------------------------------------- | | payoutIdrequired | stringExample:payout\_123ID của lệnh chi | ### Responses **200** Thành công **401** Unauthorized **403** Forbidden **429** Too Many Request - Gọi API quá nhiều get/v1/payouts/{payoutId} https\://api-merchant.payos.vn/v1/payouts/{payoutId} ### Response samples * 200 * 401 * 403 Content type application/json Example Tạo lệnh chi thành côngTạo lệnh chi thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "id": "payout_123456789", "referenceId": "ref_123456789", "transactions": { "0": { "id": "txn_123456789", "referenceId": "ref_123456789", "amount": 100000, "description": "Thanh toan", "toBin": "970422", "toAccountNumber": "123456789", "toAccountName": "NGUYEN VAN A", "state": "PROCESSING" } }, "category": { "0": "salary" }, "approvalState": "PROCESSING", "createdAt": "2024-01-15T10:30:00.000Z" } }` ## [](#tag/payout/operation/estimate-credit)Ước tính chi phí API dùng để ước tính phí cho lệnh chi ##### Authorizations: (*x-client-id**x-api-key*) ##### header Parameters | | | | ------------------- | ----------------------------- | | x-signaturerequired | stringChữ ký xác thực request | ##### Request Body schema: application/jsonrequired | | | | ------------------- | --------------------------------------------- | | referenceIdrequired | stringMã tham chiếu của lệnh chi | | category | Array of stringsDanh mục thanh toán | | validateDestination | booleanXác thực tài khoản đích | | payoutsrequired | Array of objects (PayoutItem) | ### Responses **200** Thành công **401** Unauthorized **403** Forbidden **429** Too Many Request - Gọi API quá nhiều post/v1/payouts/estimate-credit https\://api-merchant.payos.vn/v1/payouts/estimate-credit ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "referenceId": "batch_payout_123", "category": { "0": "salary", "1": "bonus" }, "validateDestination": true, "payouts": [ { "referenceId": "payout_123", "amount": 100000, "description": "Thanh toán lương tháng 1", "toBin": "970415", "toAccountNumber": "123456789" } ] }` ### Response samples * 200 * 401 * 403 Content type application/json Example Ước tính phí thành côngƯớc tính phí thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "estimateCredit": 5000 } }` ## [](#tag/payout-account)Tài khoản chi Tài khoản chi ## [](#tag/payout-account/operation/get-account-balance)Lấy thông tin số dư tài khoản chi API dùng để lấy thông tin số dư tài khoản chi ##### Authorizations: (*x-client-id**x-api-key*) ### Responses **200** Thành công **401** Unauthorized **403** Forbidden **429** Too Many Request - Gọi API quá nhiều get/v1/payouts-account/balance https\://api-merchant.payos.vn/v1/payouts-account/balance ### Response samples * 200 * 401 * 403 Content type application/json Example Lấy số dư thành côngLấy số dư thành công Copy Expand all Collapse all `{ "code": "00", "desc": "success", "data": { "accountNumber": "123456789", "accountName": "CONG TY ABC", "currency": "VND", "balance": "1000000" } }` --- [Chuyển tới nội dung chính](#__docusaurus_skipToContent_fallback) 🎉️ **payOS ra mắt tính năng [Chi hộ](https://payos.vn/ra-mat-kenh-chi-tren-payos-giai-phap-chi-tu-dong-qua-api/)! Trải nghiệm ngay!** 🥳️ [![payOS Logo](/docs/img/logo.svg)![payOS Logo](/docs/img/logo-dark.svg)](/docs/.md) [API](/docs/api/.md)[Sample & Demo](/docs/sample.md) Tìm kiếm [](https://t.me/+rIPftr5wgHY3ODQ9)[Đăng nhập](https://my.payos.vn) --- # Mã nguồn mẫu và Demo payOS cung cấp mã nguồn mẫu và trang demo cho một số nền tảng, ngôn ngữ lập trình phổ biến hỗ trợ lập trình viên hiện thực tích hợp payOS vào cửa hàng. Trong trường hợp cần tìm hiểu thêm Quý khách vui lòng liên hệ theo địa chỉ email: để được hỗ trợ. ## Front-end[​](#front-end "Đường dẫn trực tiếp đến Front-end") Có thể tích hợp payOS vào front-end theo 4 cách: Redirect tới trang thanh toán payOS, Bật Popup thanh toán payOS, Tùy chỉnh UI hoặc dùng thư viện UI chúng tôi đã xây dựng sẵn. Mỗi doanh nghiệp, loại hình kinh doanh sẽ phù hợp với một cách khác nhau. Dùng Redirect mang tới sự ổn định và thời gian tích hợp nhanh nhất. Trong khi dùng Tùy chỉnh UI hoặc dùng Thư viện UI mang tới sự linh hoạt cao nhất. | Nền tảng | Redirect | Popup | Tùy chỉnh UI | Thư viện UI | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | | ***Web*** | | | | | | - React | [Trang demo](https://payos.vn/docs/sample/react/) | [Trang demo](https://payos.vn/docs/sample/react/) | Đang phát triển | Đang phát triển | | ***Mobile*** | | | | | | - React Native | [Tải APK](https://drive.google.com/file/d/1liJnzPJDnL4lbt8LM9TNVQkDP4tYmPyM/view?usp=sharing)[Github](https://github.com/payOSHQ/payos-demo-react-native) | Đang phát triển | [Tải APK](https://drive.google.com/file/d/1liJnzPJDnL4lbt8LM9TNVQkDP4tYmPyM/view?usp=sharing)[Github](https://github.com/payOSHQ/payos-demo-react-native) | Đang phát triển | | - Flutter | [Tải APK](https://drive.google.com/file/d/1GJR-py4hFmLmeWiCr9k4cgzXdWTTU3ss/view?usp=sharing)[Github](https://github.com/payOSHQ/payos-flutter-demo) | Đang phát triển | [Tải APK](https://drive.google.com/file/d/1GJR-py4hFmLmeWiCr9k4cgzXdWTTU3ss/view?usp=sharing)[Github](https://github.com/payOSHQ/payos-flutter-demo) | Đang phát triển | | **POS và E-Commerce** | | | | | | - Odoo POS | Đang phát triển | Đang phát triển | Đang phát triển | Đang phát triển | | - Woocommerce | [Trang demo](https://mitom.devgioi.com/) | Đang phát triển | Đang phát triển | Đang phát triển | ## Back-end[​](#back-end "Đường dẫn trực tiếp đến Back-end") | Ngôn ngữ | Link thư viện | Github Repository | | ---------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- | | JavaScript | [NPM](https://www.npmjs.com/package/@payos/node) | [NodeJS/ExpessJS](https://github.com/payOSHQ/payos-demo-nodejs) | | Java | [Maven](https://central.sonatype.com/artifact/vn.payos/payos-java) | [Spring Boost](https://github.com/payOSHQ/payos-demo-java-spring) | | C# | [Nuget](https://www.nuget.org/packages/payOS) | [.Net Core](https://github.com/payOSHQ/payos-demo-dotnet-core) | | Python | [PyPi](https://pypi.org/project/payos/) | [Django](https://github.com/payOSHQ/payos-demo-python-django) | | PHP | [Packagist](https://packagist.org/packages/payos/payos) | [Laravel](https://github.com/payOSHQ/payos-demo-php-laravel) | | Golang | [pkg.go.dev](https://pkg.go.dev/github.com/payOSHQ/payos-lib-golang) | [Golang](https://github.com/payOSHQ/payos-demo-golang) | --- [Chuyển tới nội dung chính](#__docusaurus_skipToContent_fallback) 🎉️ **payOS ra mắt tính năng [Chi hộ](https://payos.vn/ra-mat-kenh-chi-tren-payos-giai-phap-chi-tu-dong-qua-api/)! Trải nghiệm ngay!** 🥳️ [![payOS Logo](/docs/img/logo.svg)![payOS Logo](/docs/img/logo-dark.svg)](/docs/.md) [API](/docs/api/.md)[Sample & Demo](/docs/sample.md) Tìm kiếm [](https://t.me/+rIPftr5wgHY3ODQ9)[Đăng nhập](https://my.payos.vn) # Tìm kiếm Nhập tìm kiếm của bạn ở đây Được cung cấp bởi Algolia[](https://www.algolia.com/) --- # Các câu hỏi thường gặp Các câu hỏi thường gặp khi tích hợp payOS ## 1. `signature` là gì và khi nào dùng đến?[​](#1-signature-là-gì-và-khi-nào-dùng-đến "Đường dẫn trực tiếp đến 1-signature-là-gì-và-khi-nào-dùng-đến") * `signature` là một chuỗi ký tự dùng để kiểm tra tính toàn vẹn dữ liệu trong việc truyền dữ liệu giữa hệ thống của bạn và payOS. Được tạo ra khi kết hợp `checksum_key` và các trường data tương ứng với mỗi API. * Mỗi khi bạn nhận được dữ liệu từ payOS bạn nên kiểm tra `signature` để chắc chắn dữ liệu bạn nhận được đúng với thông tin mà hệ thống payOS trả về, [chi tiết](/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature.md#c%C3%A1ch-t%E1%BA%A1o-signature) * Các trường hợp dùng đến: * [Tạo link thanh toán](/docs/api/.md#tag/payment-request/operation/payment-request) * [Nhận thông tin thanh toán](/docs/du-lieu-tra-ve/webhook.md) ## 2. Tại sao tôi bị lỗi `Mã kiểm tra(signature) không hợp lệ`?[​](#2-tại-sao-tôi-bị-lỗi-mã-kiểm-trasignature-không-hợp-lệ "Đường dẫn trực tiếp đến 2-tại-sao-tôi-bị-lỗi-mã-kiểm-trasignature-không-hợp-lệ") * Kiểm tra các trường tạo `signature` đã đúng chưa, với API [tạo link thanh toán](/docs/api/.md#tag/payment-request/operation/payment-request) sẽ được tạo bằng 5 trường sau đây (amount, orderCode, description, returnUrl, cancelUrl). * Kiểm tra lại dữ liệu của bạn có đang truyền ở `body` và dạng JSON. ## 3. Tại sao tôi nhập không đúng thông tin CCCD/CMND/MST?[​](#3-tại-sao-tôi-nhập-không-đúng-thông-tin-cccdcmndmst "Đường dẫn trực tiếp đến 3. Tại sao tôi nhập không đúng thông tin CCCD/CMND/MST?") * Bạn truy cập trang để kiểm tra thông tin CCCD, CMND và MST đã có chưa. * Nếu có kết quả thì bạn quay lại payOS và dùng thông tin này để tiếp tục các bước [Xác thực doanh nghiệp](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md) ## 4. Tại sao tôi chuyển khoản rồi nhưng không xác thực được?[​](#4-tại-sao-tôi-chuyển-khoản-rồi-nhưng-không-xác-thực-được "Đường dẫn trực tiếp đến 4. Tại sao tôi chuyển khoản rồi nhưng không xác thực được?") * Nếu bạn chuyển khoản trong khung giờ từ 22h - 5h thì bạn vui lòng quay lại Xác thực vào sáng hôm sau(do từ hệ thống ngân hàng giao dịch chuyển trong khung giờ này được ghi nhận vào ngày hôm sau). * Tên chủ tài khoản chuyển khoản phải trùng với tên mà bạn xác thực trước đó. [chi tiết](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md#x%C3%A1c-th%E1%BB%B1c-t%E1%BB%95-ch%E1%BB%A9c-c%C3%A1-nh%C3%A2nh%E1%BB%99-kinh-doanh) * Với tài khoản ngân hàng loại Doanh nghiệp có thể do tên doanh nghiệp trên hệ thống ngân hàng khác với tên trên Chi cục Thuế, với trường hợp này vui lòng liên hệ với để được hỗ trợ. ## 5. Tại sao tôi không tạo được tài khoản trên payOS?[​](#5-tại-sao-tôi-không-tạo-được-tài-khoản-trên-payos "Đường dẫn trực tiếp đến 5. Tại sao tôi không tạo được tài khoản trên payOS?") Bạn cần dùng tài khoản ngân hàng có tên tài khoản trùng với tên doanh nghiệp hoặc tên cá nhân/hộ kinh doanh đã xác thực Doanh nghiệp trước đó để thêm tài khoản. ## 6. Tại sao số tài khoản trên `link thanh toán` lại không giống với số tài khoản của tôi?[​](#6-tại-sao-số-tài-khoản-trên-link-thanh-toán-lại-không-giống-với-số-tài-khoản-của-tôi "Đường dẫn trực tiếp đến 6-tại-sao-số-tài-khoản-trên-link-thanh-toán-lại-không-giống-với-số-tài-khoản-của-tôi") Nếu bạn tạo `link thanh toán` với tài khoản ngân hàng liên kết bằng [VietQR Pro](https://payos.vn/vietqr-pro/) thì số tài khoản hiển thị sẽ là Số tài khoản ảo, [xem thông tin về tài khoản ảo](https://payos.vn/tai-khoan-ao/). Một Tài khoản ảo sẽ tương ứng với một đơn hàng và số tiền, chuyển sai Số tài khoản ảo thì đơn hàng đó sẽ không được xác nhận. ## 7. Khách hàng của bạn chuyển sai số tiền?[​](#7-khách-hàng-của-bạn-chuyển-sai-số-tiền "Đường dẫn trực tiếp đến 7. Khách hàng của bạn chuyển sai số tiền?") Với liên kết ngân hàng bằng [VietQR Pro](https://payos.vn/vietqr-pro/) * Chuyển khoản sẽ bị từ chối ở màn hình chuyển khoản của ngân hàng. * Khách hàng của bạn chuyển thành công thì sau đó hệ thống ngân hàng sẽ hoàn tiền lại vào tài khoản của khách hàng của bạn và đồng thời đơn hàng sẽ không được xác nhận. --- # Tổng quan Xây dựng một tích hợp thanh toán low-code vào website của bạn. Bạn có thể nhúng Trang thanh toán trực tiếp vào website hoặc chuyển hướng khách hàng đến trang thanh toán của payOS. payOS hỗ trợ hầu hết ngôn ngữ phổ biến hiện nay như NodeJS, PHP, Java, ... giúp tích hợp dễ dàng và nhanh chóng vào website hoặc ứng dụng. ## Bắt đầu[​](#bắt-đầu "Đường dẫn trực tiếp đến Bắt đầu") ## [📄️ Cách hoạt động payOS Checkout](/docs/checkout/how-checkout-works.md) [Tìm hiểu cách hoạt động Checkout để thu các khoản thanh toán trên trang web của bạn](/docs/checkout/how-checkout-works.md) ## [📄️ payOS-Hosted Page](/docs/checkout/quick-start-payos-hosted-page.md) [Chuyển hướng đến trang thanh toán của payOS](/docs/checkout/quick-start-payos-hosted-page.md) ## Code mẫu[​](#code-mẫu "Đường dẫn trực tiếp đến Code mẫu") Bạn có thể tham khảo một số dự án mã nguồn mở của payOS tại [GitHub payOSHQ](https://github.com/payoshq). [payOS ReactJS example](https://github.com/payOSHQ/payos-demo-reactJS "https://github.com/payOSHQ/payos-demo-reactJS") [![Github banner](data:image/png;base64,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)](https://github.com/payOSHQ/payos-demo-reactJS "https://github.com/payOSHQ/payos-demo-reactJS") [Web](https://github.com/payOSHQ/payos-demo-reactJS "https://github.com/payOSHQ/payos-demo-reactJS") [payOS Java spring example](https://github.com/payOSHQ/payos-demo-java-spring "https://github.com/payOSHQ/payos-demo-java-spring") [![Github banner](data:image/png;base64,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)](https://github.com/payOSHQ/payos-demo-java-spring "https://github.com/payOSHQ/payos-demo-java-spring") [Backend](https://github.com/payOSHQ/payos-demo-java-spring "https://github.com/payOSHQ/payos-demo-java-spring") --- # Cách hoạt động payOS Checkout payOS Checkout là một giao diện dựng sẵn, giúp giảm thời gian phát triển. ## Luồng hoạt động[​](#luồng-hoạt-động "Đường dẫn trực tiếp đến Luồng hoạt động") * Bước 1: Khách hàng thực hiện mua hàng trên Website hoặc ứng dụng của merchant và lựa chọn thanh toán trực tuyến Napas 247 cho đơn hàng. * Bước 2: Website hoặc ứng dụng của merchant tiến hành gọi [tạo link thanh toán](/docs/api/.md#tag/payment-request/operation/payment-request), payOS sẽ kiểm tra dữ liệu và trả về kết quả chứa link thanh toán. Khi hệ thống của merchant nhận kết quả link thanh toán cần chuyển hướng khách hàng của bạn đến trang checkout của payOS bằng cách mở link thanh toán từ kết quả. * Bước 3: Khách hàng sử dụng ứng dụng ngân hàng để quét mã VietQR từ link thanh toán. * Bước 4: Giao dịch ghi nhận thành công tại ngân hàng, payOS sẽ trả kết quả thành công về `returnUrl` gồm: trạng thái, mã đơn hàng, mã link thanh toán, ... Từ kết quả nhận được trên `returnUrl` Website hoặc ứng dụng của merchant hiển thị giao diện thành công. * Bước 5: Sau khi có kết quả ở giao diện, đồng thời payOS sẽ gửi một [kết quả](/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature.md) với đầy đủ thông tin thanh toán tới Webhook của cửa hàng được thiết lập trên , sau đó merchant cập nhật trạng thái đơn hàng phù hợp. ## Cách tích hợp payOS với hệ thống của Merchant[​](#cách-tích-hợp-payos-với-hệ-thống-của-merchant "Đường dẫn trực tiếp đến Cách tích hợp payOS với hệ thống của Merchant") * Code để [tạo link thanh toán](/docs/api/.md#tag/payment-request/operation/payment-request) * Code xử lý `returnUrl` và `cancelUrl` để nhận thông báo kết quả Thanh toán và Huỷ đơn hàng trên giao diện. * Code [webhook](https://www.redhat.com/en/topics/automation/what-is-a-webhook) để nhận kết quả thanh toán của một đơn hàng. ## Low-code[​](#low-code "Đường dẫn trực tiếp đến Low-code") payOS Checkout với yêu cầu ít code và lựa chọn tốt nhất để tích hợp thanh toán bởi những tính năng có sẵn. Lựa chọn hiển thị giao diện Checkout: * [Chuyển hướng đến trang payOS Checkout](/docs/checkout/quick-start-payos-hosted-page.md) * [Mở dialog giao diện thanh toán](/docs/sample/react) * [Nhúng giao diện thanh toán](/docs/checkout/quick-start-payos-embedded-form.md) vào website hoặc ứng dụng của bạn. --- # payOS Embedded Form Đang tải ... --- # payOS Embedded Form - Complete Guide This page contains all possible combinations of frontend and backend implementations for the payOS Embedded Form integration. ## HTML + Node.js[​](#html--nodejs "Đường dẫn trực tiếp đến HTML + Node.js") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho NodeJS[​](#cài-đặt-thư-viện-payos-cho-nodejs "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho NodeJS") ``` npm install @payos/node # hoặc yarn add @payos/node ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout bằng link cdn[​](#cài-đặt-thư-viện-payos-checkout-bằng-link-cdn "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout bằng link cdn") ``` ``` ### Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán[​](#thêm-nút-tạo-link-thanh-toán-và-thêm-div-nhúng-giao-diện-thanh-toán "Đường dẫn trực tiếp đến Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán") Thêm 1 nút bấm tạo link thanh toán trên trang xem thông tin đơn hàng để gọi API tạo link thanh toán và 1 div có trường id riêng biệt được sử dụng để nhúng giao diện thanh toán trên trang web ### Khởi tạo config cho hook usePayOS[​](#khởi-tạo-config-cho-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó[​](#thực-hiện-gọi-hook-usepayos-với-config-đã-khởi-tạo-trước-đó "Đường dẫn trực tiếp đến Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó") usePayOS hook trả về 2 hàm **open()** và **exit()**. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` npm start ``` ### Mã nguồn[​](#mã-nguồn "Đường dẫn trực tiếp đến Mã nguồn") * server.js * index.html * index.js /server.js ``` const express = require('express'); const dotenv = require('dotenv'); const cors = require('cors'); const { PayOS } = require('@payos/node'); const app = express(); dotenv.config(); const payOS = new PayOS({ clientId: process.env.PAYOS_CLIENT_ID, apiKey: process.env.PAYOS_API_KEY, checksumKey: process.env.PAYOS_CHECKSUM_KEY, }); app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.post('/create-embedded-payment-link', async (req, res) => { const YOUR_DOMAIN = `http://localhost:3000/`; const body = { orderCode: Number(String(Date.now()).slice(-6)), amount: 10000, description: 'Thanh toan don hang', returnUrl: `${YOUR_DOMAIN}`, cancelUrl: `${YOUR_DOMAIN}`, }; try { const paymentLinkResponse = await payOS.paymentRequests.create(body); res.send(paymentLinkResponse); } catch (error) { console.error(error); res.send('Something went error'); } }); app.listen(3030, function () { console.log(`Server is listening on port 3030`); }); ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/index.js ``` /* eslint-disable no-undef */ const buttonContainer = document.getElementById("button-container"); const contentContainer = document.getElementById("content-container"); let isOpen = false; let config = { RETURN_URL: window.location.href, ELEMENT_ID: "embeded-payment-container", CHECKOUT_URL: "", embedded: true, onSuccess: (event) => { contentContainer.innerHTML = `
Thanh toan thanh cong
`; buttonContainer.innerHTML = ` `; }, }; buttonContainer.addEventListener("click", async (event) => { if (isOpen) { const { exit } = PayOSCheckout.usePayOS(config); exit(); contentContainer.innerHTML = `

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

`; } else { const checkoutUrl = await getPaymentLink(); config = { ...config, CHECKOUT_URL: checkoutUrl, }; const { open } = PayOSCheckout.usePayOS(config); open(); } isOpen = !isOpen; changeButton(); }); const getPaymentLink = async () => { const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("server doesn't response!"); } const result = await response.json(); return result.checkoutUrl; }; const changeButton = () => { if (isOpen) { buttonContainer.innerHTML = ` `; } else { buttonContainer.innerHTML = ` `; } }; ``` ## HTML + PHP[​](#html--php "Đường dẫn trực tiếp đến HTML + PHP") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho PHP[​](#cài-đặt-thư-viện-payos-cho-php "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho PHP") ``` composer require payos/payos ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout bằng link cdn[​](#cài-đặt-thư-viện-payos-checkout-bằng-link-cdn "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout bằng link cdn") ``` ``` ### Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán[​](#thêm-nút-tạo-link-thanh-toán-và-thêm-div-nhúng-giao-diện-thanh-toán "Đường dẫn trực tiếp đến Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán") Thêm 1 nút bấm tạo link thanh toán trên trang xem thông tin đơn hàng để gọi API tạo link thanh toán và 1 div có trường id riêng biệt được sử dụng để nhúng giao diện thanh toán trên trang web ### Khởi tạo config cho hook usePayOS[​](#khởi-tạo-config-cho-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó[​](#thực-hiện-gọi-hook-usepayos-với-config-đã-khởi-tạo-trước-đó "Đường dẫn trực tiếp đến Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó") usePayOS hook trả về 2 hàm **open()** và **exit()**. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` php -S localhost:3030 --docroot=public ``` ### Mã nguồn[​](#mã-nguồn-1 "Đường dẫn trực tiếp đến Mã nguồn") * checkout.php * index.html * index.js /checkout.php ``` intval(substr(strval(microtime(true) * 10000), -6)), "amount" => 2000, "description" => "Thanh toán đơn hàng", "returnUrl" => $YOUR_DOMAIN, "cancelUrl" => $YOUR_DOMAIN ]; $response = $payOS->paymentRequests->create($data); $checkoutUrl = $response['checkoutUrl']; ?> PayOS Checkout

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/index.js ``` /* eslint-disable no-undef */ const buttonContainer = document.getElementById("button-container"); const contentContainer = document.getElementById("content-container"); let isOpen = false; let config = { RETURN_URL: window.location.href, ELEMENT_ID: "embeded-payment-container", CHECKOUT_URL: "", embedded: true, onSuccess: (event) => { contentContainer.innerHTML = `
Thanh toan thanh cong
`; buttonContainer.innerHTML = ` `; }, }; buttonContainer.addEventListener("click", async (event) => { if (isOpen) { const { exit } = PayOSCheckout.usePayOS(config); exit(); contentContainer.innerHTML = `

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

`; } else { const checkoutUrl = await getPaymentLink(); config = { ...config, CHECKOUT_URL: checkoutUrl, }; const { open } = PayOSCheckout.usePayOS(config); open(); } isOpen = !isOpen; changeButton(); }); const getPaymentLink = async () => { const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("server doesn't response!"); } const result = await response.json(); return result.checkoutUrl; }; const changeButton = () => { if (isOpen) { buttonContainer.innerHTML = ` `; } else { buttonContainer.innerHTML = ` `; } }; ``` ## HTML + Python[​](#html--python "Đường dẫn trực tiếp đến HTML + Python") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Python[​](#cài-đặt-thư-viện-payos-cho-python "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Python") ``` pip install payos ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout bằng link cdn[​](#cài-đặt-thư-viện-payos-checkout-bằng-link-cdn "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout bằng link cdn") ``` ``` ### Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán[​](#thêm-nút-tạo-link-thanh-toán-và-thêm-div-nhúng-giao-diện-thanh-toán "Đường dẫn trực tiếp đến Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán") Thêm 1 nút bấm tạo link thanh toán trên trang xem thông tin đơn hàng để gọi API tạo link thanh toán và 1 div có trường id riêng biệt được sử dụng để nhúng giao diện thanh toán trên trang web ### Khởi tạo config cho hook usePayOS[​](#khởi-tạo-config-cho-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó[​](#thực-hiện-gọi-hook-usepayos-với-config-đã-khởi-tạo-trước-đó "Đường dẫn trực tiếp đến Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó") usePayOS hook trả về 2 hàm **open()** và **exit()**. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` flask run --port=3030 ``` ### Mã nguồn[​](#mã-nguồn-2 "Đường dẫn trực tiếp đến Mã nguồn") * server.py * index.html * index.js /server.py ``` """ server.py PayOS Sample. Python 3.6 or newer required. """ import time from flask import Flask, send_from_directory from payos import CreatePaymentLinkRequest, PayOS # Keep your PayOS key protected by including it by an environment variable client_id = "YOUR_CLIENT_ID" api_key = "YOUR_API_KEY" checksum_key = "YOUR_CHECKSUM_KEY" payos = PayOS(client_id, api_key, checksum_key) app = Flask(__name__, static_url_path="", static_folder="public") YOUR_DOMAIN = "http://localhost:3030/" @app.route("/") def index(): return send_from_directory("public", "index.html") @app.route("/create-embedded-payment-link", methods=["POST"]) def create_payment_link(): try: payment_data = CreatePaymentLinkRequest( orderCode=int(time.time()), amount=2000, description="Thanh toan don hang", cancelUrl=YOUR_DOMAIN, returnUrl=YOUR_DOMAIN, ) payment_link_response = payos.payment_requests.create(payment_data) except Exception as e: return str(e) return payment_link_response.to_json() if __name__ == "__main__": app.run(port=3030) ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/index.js ``` /* eslint-disable no-undef */ const buttonContainer = document.getElementById("button-container"); const contentContainer = document.getElementById("content-container"); let isOpen = false; let config = { RETURN_URL: window.location.href, ELEMENT_ID: "embeded-payment-container", CHECKOUT_URL: "", embedded: true, onSuccess: (event) => { contentContainer.innerHTML = `
Thanh toan thanh cong
`; buttonContainer.innerHTML = ` `; }, }; buttonContainer.addEventListener("click", async (event) => { if (isOpen) { const { exit } = PayOSCheckout.usePayOS(config); exit(); contentContainer.innerHTML = `

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

`; } else { const checkoutUrl = await getPaymentLink(); config = { ...config, CHECKOUT_URL: checkoutUrl, }; const { open } = PayOSCheckout.usePayOS(config); open(); } isOpen = !isOpen; changeButton(); }); const getPaymentLink = async () => { const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("server doesn't response!"); } const result = await response.json(); return result.checkoutUrl; }; const changeButton = () => { if (isOpen) { buttonContainer.innerHTML = ` `; } else { buttonContainer.innerHTML = ` `; } }; ``` ## HTML + Go[​](#html--go "Đường dẫn trực tiếp đến HTML + Go") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Go[​](#cài-đặt-thư-viện-payos-cho-go "Đường dẫn trực ti��ếp đến Cài đặt thư viện payOS cho Go") ``` go get github.com/payOSHQ/payos-lib-golang/v2 ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout bằng link cdn[​](#cài-đặt-thư-viện-payos-checkout-bằng-link-cdn "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout bằng link cdn") ``` ``` ### Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán[​](#thêm-nút-tạo-link-thanh-toán-và-thêm-div-nhúng-giao-diện-thanh-toán "Đường dẫn trực tiếp đến Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán") Thêm 1 nút bấm tạo link thanh toán trên trang xem thông tin đơn hàng để gọi API tạo link thanh toán và 1 div có trường id riêng biệt được sử dụng để nhúng giao diện thanh toán trên trang web ### Khởi tạo config cho hook usePayOS[​](#khởi-tạo-config-cho-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó[​](#thực-hiện-gọi-hook-usepayos-với-config-đã-khởi-tạo-trước-đó "Đường dẫn trực tiếp đến Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó") usePayOS hook trả về 2 hàm **open()** và **exit()**. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` go run server.go ``` ### Mã nguồn[​](#mã-nguồn-3 "Đường dẫn trực tiếp đến Mã nguồn") * server.go * index.html * index.js /server.go ``` package main import ( "encoding/json" "log" "net/http" "time" "github.com/payOSHQ/payos-lib-golang/v2" ) var payOSClient *payos.PayOS func main() { // Keep your PayOS key protected by including it by an env variable const clientId = "YOUR_CLIENT_ID" const apiKey = "YOUR_API_KEY" const checksumKey = "YOUR_CHECKSUM_KEY" var err error payOSClient, err = payos.NewPayOS(&payos.PayOSOptions{ ClientID: clientId, APIKey: apiKey, ChecksumKey: checksumKey, }) if err != nil { log.Fatalf("Failed to create PayOS client: %v", err) } http.Handle("/", http.FileServer(http.Dir("public"))) http.HandleFunc("/create-embedded-payment-link", createPaymentLink) addr := "localhost:3030" log.Printf("Listening on %s", addr) log.Fatal(http.ListenAndServe(addr, nil)) } func createPaymentLink(w http.ResponseWriter, r *http.Request) { domain := "http://localhost:3030/" paymentLinkRequest := payos.CreatePaymentLinkRequest{ OrderCode: time.Now().UnixNano() / int64(time.Millisecond), Amount: 2000, Description: "Thanh toan don hang", CancelUrl: domain, ReturnUrl: domain, } paymentLinkResponse, err := payOSClient.PaymentRequests.Create(r.Context(), &paymentLinkRequest) if err != nil { log.Printf("Create payment link failed: %v", err) } // Return paymentLinkResponse as JSON instead of redirect w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(paymentLinkResponse); err != nil { log.Printf("Failed to encode response: %v", err) } } ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/index.js ``` /* eslint-disable no-undef */ const buttonContainer = document.getElementById("button-container"); const contentContainer = document.getElementById("content-container"); let isOpen = false; let config = { RETURN_URL: window.location.href, ELEMENT_ID: "embeded-payment-container", CHECKOUT_URL: "", embedded: true, onSuccess: (event) => { contentContainer.innerHTML = `
Thanh toan thanh cong
`; buttonContainer.innerHTML = ` `; }, }; buttonContainer.addEventListener("click", async (event) => { if (isOpen) { const { exit } = PayOSCheckout.usePayOS(config); exit(); contentContainer.innerHTML = `

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

`; } else { const checkoutUrl = await getPaymentLink(); config = { ...config, CHECKOUT_URL: checkoutUrl, }; const { open } = PayOSCheckout.usePayOS(config); open(); } isOpen = !isOpen; changeButton(); }); const getPaymentLink = async () => { const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("server doesn't response!"); } const result = await response.json(); return result.checkoutUrl; }; const changeButton = () => { if (isOpen) { buttonContainer.innerHTML = ` `; } else { buttonContainer.innerHTML = ` `; } }; ``` ## HTML + .NET[​](#html--net "Đường dẫn trực tiếp đến HTML + .NET") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho .NET[​](#cài-đặt-thư-viện-payos-cho-net "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho .NET") * dotnet * NuGet ``` dotnet add package payOS ``` ``` Install-Package payOS ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout bằng link cdn[​](#cài-đặt-thư-viện-payos-checkout-bằng-link-cdn "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout bằng link cdn") ``` ``` ### Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán[​](#thêm-nút-tạo-link-thanh-toán-và-thêm-div-nhúng-giao-diện-thanh-toán "Đường dẫn trực tiếp đến Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán") Thêm 1 nút bấm tạo link thanh toán trên trang xem thông tin đơn hàng để gọi API tạo link thanh toán và 1 div có trường id riêng biệt được sử dụng để nhúng giao diện thanh toán trên trang web ### Khởi tạo config cho hook usePayOS[​](#khởi-tạo-config-cho-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó[​](#thực-hiện-gọi-hook-usepayos-với-config-đã-khởi-tạo-trước-đó "Đường dẫn trực tiếp đến Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó") usePayOS hook trả về 2 hàm **open()** và **exit()**. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` dotnet run ``` ### Mã nguồn[​](#mã-nguồn-4 "Đường dẫn trực tiếp đến Mã nguồn") * Server.cs * index.html * index.js /Server.cs ``` using Microsoft.AspNetCore; using Microsoft.AspNetCore.Mvc; using PayOS; using PayOS.Models; namespace server.Controllers { public class Program { public static void Main(string[] args) { WebHost.CreateDefaultBuilder(args) .UseUrls("http://localhost:3030/") .UseWebRoot("public") .UseStartup() .Build() .Run(); } } public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseStaticFiles(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapGet("/", context => { context.Response.Redirect("/index.html"); return Task.CompletedTask; }); }); } } [Route("create-embedded-payment-link")] [ApiController] public class CheckoutApiController : Controller { [HttpPost] public async Task Create() { // Keep your PayOS key protected by including it by an env variable var clientId = "YOUR_CLIENT_ID"; var apiKey = "YOUR_API_KEY"; var checksumKey = "YOUR_CHECKSUM_KEY"; var payOS = new PayOSClient(clientId, apiKey, checksumKey); var domain = "http://localhost:3030"; var paymentLinkRequest = new CreatePaymentLinkRequest { OrderCode = int.Parse(DateTimeOffset.Now.ToString("ffffff")), Amount = 2000, Description = "Thanh toan don hang", ReturnUrl = domain, CancelUrl = domain }; var response = await payOS.PaymentRequests.CreateAsync(paymentLinkRequest); return json(response); } } } ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/index.js ``` /* eslint-disable no-undef */ const buttonContainer = document.getElementById("button-container"); const contentContainer = document.getElementById("content-container"); let isOpen = false; let config = { RETURN_URL: window.location.href, ELEMENT_ID: "embeded-payment-container", CHECKOUT_URL: "", embedded: true, onSuccess: (event) => { contentContainer.innerHTML = `
Thanh toan thanh cong
`; buttonContainer.innerHTML = ` `; }, }; buttonContainer.addEventListener("click", async (event) => { if (isOpen) { const { exit } = PayOSCheckout.usePayOS(config); exit(); contentContainer.innerHTML = `

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

`; } else { const checkoutUrl = await getPaymentLink(); config = { ...config, CHECKOUT_URL: checkoutUrl, }; const { open } = PayOSCheckout.usePayOS(config); open(); } isOpen = !isOpen; changeButton(); }); const getPaymentLink = async () => { const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("server doesn't response!"); } const result = await response.json(); return result.checkoutUrl; }; const changeButton = () => { if (isOpen) { buttonContainer.innerHTML = ` `; } else { buttonContainer.innerHTML = ` `; } }; ``` ## HTML + Java[​](#html--java "Đường dẫn trực tiếp đến HTML + Java") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Java[​](#cài-đặt-thư-viện-payos-cho-java "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Java") * Maven * Gradle Thêm đoạn code sau vào POM và thay VERSION bằng phiên bản bạn muốn sử dụng. ``` vn.payos payos-java {VERSION} ``` Thêm đoạn code sau vào build.gradle và thay VERSION bằng phiên bản bạn muốn sử dụng. ``` implementation 'vn.payos:payos-java:{VERSION}' ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout bằng link cdn[​](#cài-đặt-thư-viện-payos-checkout-bằng-link-cdn "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout bằng link cdn") ``` ``` ### Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán[​](#thêm-nút-tạo-link-thanh-toán-và-thêm-div-nhúng-giao-diện-thanh-toán "Đường dẫn trực tiếp đến Thêm nút tạo link thanh toán và thêm div nhúng giao diện thanh toán") Thêm 1 nút bấm tạo link thanh toán trên trang xem thông tin đơn hàng để gọi API tạo link thanh toán và 1 div có trường id riêng biệt được sử dụng để nhúng giao diện thanh toán trên trang web ### Khởi tạo config cho hook usePayOS[​](#khởi-tạo-config-cho-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó[​](#thực-hiện-gọi-hook-usepayos-với-config-đã-khởi-tạo-trước-đó "Đường dẫn trực tiếp đến Thực hiện gọi hook usePayOS với config đã khởi tạo trước đó") usePayOS hook trả về 2 hàm **open()** và **exit()**. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` java -cp .\target\payos-payment-1.0-SNAPSHOT-jar-with-dependencies.jar vn.payos.sample.Server ``` ### Mã nguồn[​](#mã-nguồn-5 "Đường dẫn trực tiếp đến Mã nguồn") * Server.java * pom.xml * index.html * index.js /Server.java ``` package vn.payos.sample; import static spark.Spark.port; import static spark.Spark.post; import static spark.Spark.staticFiles; import java.nio.file.Paths; import vn.payos.PayOS; import vn.payos.model.v2.paymentRequests.CreatePaymentLinkRequest; import vn.payos.model.v2.paymentRequests.CreatePaymentLinkResponse; public class Server { public static void main(String[] args) { port(3000); String clientId = "YOUR_CLIENT_ID"; String apiKey = "YOUR_API_KEY"; String checksumKey = "YOUR_CHECKSUM_KEY"; final PayOS payOS = new PayOS(clientId, apiKey, checksumKey); staticFiles.externalLocation(Paths.get("public").toAbsolutePath().toString()); post( "/create-embedded-payment-link", (request, response) -> { String domain = "http://localhost:3000/"; Long orderCode = System.currentTimeMillis() / 1000; CreatePaymentLinkRequest paymentData = CreatePaymentLinkRequest.builder() .orderCode(orderCode) .amount(2000) .description("Thanh toán đơn hàng") .returnUrl(domain) .cancelUrl(domain) .build(); CreatePaymentLinkResponse result = payOS.paymentRequests().create(paymentData); response.type("application/json"); return new com.google.gson.Gson().toJson(result); }); } } ``` /pom.xml ``` 4.0.0 vn.payos.sample payos-payment 1.0-SNAPSHOT sample http://www.example.com UTF-8 1.8 1.8 com.sparkjava spark-core 2.9.4 vn.payos payos-java 1.0.1 maven-clean-plugin 3.1.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.8.0 maven-surefire-plugin 2.22.1 maven-jar-plugin 3.0.2 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 maven-site-plugin 3.7.1 maven-project-info-reports-plugin 3.0.0 maven-assembly-plugin package single jar-with-dependencies vn.payos.sample.Server ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/index.js ``` /* eslint-disable no-undef */ const buttonContainer = document.getElementById("button-container"); const contentContainer = document.getElementById("content-container"); let isOpen = false; let config = { RETURN_URL: window.location.href, ELEMENT_ID: "embeded-payment-container", CHECKOUT_URL: "", embedded: true, onSuccess: (event) => { contentContainer.innerHTML = `
Thanh toan thanh cong
`; buttonContainer.innerHTML = ` `; }, }; buttonContainer.addEventListener("click", async (event) => { if (isOpen) { const { exit } = PayOSCheckout.usePayOS(config); exit(); contentContainer.innerHTML = `

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

`; } else { const checkoutUrl = await getPaymentLink(); config = { ...config, CHECKOUT_URL: checkoutUrl, }; const { open } = PayOSCheckout.usePayOS(config); open(); } isOpen = !isOpen; changeButton(); }); const getPaymentLink = async () => { const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("server doesn't response!"); } const result = await response.json(); return result.checkoutUrl; }; const changeButton = () => { if (isOpen) { buttonContainer.innerHTML = ` `; } else { buttonContainer.innerHTML = ` `; } }; ``` ## React + Node.js[​](#react--nodejs "Đường dẫn trực tiếp đến React + Node.js") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho NodeJS[​](#cài-đặt-thư-viện-payos-cho-nodejs "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho NodeJS") ``` npm install @payos/node # hoặc yarn add @payos/node ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout và import usePayOS[​](#cài-đặt-thư-viện-payos-checkout-và-import-usepayos "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout và import usePayOS") ``` npm install @payos/payos-checkout # hoặc yarn add @payos/payos-checkout ``` ### Khởi tạo config cho việc gọi hook usePayOS[​](#khởi-tạo-config-cho-việc-gọi-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho việc gọi hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán[​](#sử-dụng-thư-viện-payos-checkout-để-thực-hiện-việc-nhúng-link-thanh-toán "Đường dẫn trực tiếp đến Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán") Gọi hook usePayOS trong thư viện PayOSCheckout để sử dụng 2 phương thức open() và exit() để lần lượt nhúng và gỡ bỏ giao diện thanh toán trên trang web. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm những trường sau vào file `package.json`: ``` "proxy": "http://localhost:3030", "scripts": { # another scripts "start-client": "react-scripts start", "start-server": "nodemon server.js", "start": "concurrently \"npm run start-client\" \"npm run start-server\"" }, ``` Chạy server và client của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` npm run start ``` ### Mã nguồn[​](#mã-nguồn-6 "Đường dẫn trực tiếp đến Mã nguồn") * server.js * App.js /server.js ``` const express = require('express'); const dotenv = require('dotenv'); const cors = require('cors'); const { PayOS } = require('@payos/node'); const app = express(); dotenv.config(); const payOS = new PayOS({ clientId: process.env.PAYOS_CLIENT_ID, apiKey: process.env.PAYOS_API_KEY, checksumKey: process.env.PAYOS_CHECKSUM_KEY, }); app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.post('/create-embedded-payment-link', async (req, res) => { const YOUR_DOMAIN = `http://localhost:3000/`; const body = { orderCode: Number(String(Date.now()).slice(-6)), amount: 10000, description: 'Thanh toan don hang', returnUrl: `${YOUR_DOMAIN}`, cancelUrl: `${YOUR_DOMAIN}`, }; try { const paymentLinkResponse = await payOS.paymentRequests.create(body); res.send(paymentLinkResponse); } catch (error) { console.error(error); res.send('Something went error'); } }); app.listen(3030, function () { console.log(`Server is listening on port 3030`); }); ``` /client/src/App.js ``` import React, { useState, useEffect } from "react"; import { usePayOS } from "@payos/payos-checkout"; import "./App.css"; const ProductDisplay = () => { const [isOpen, setIsOpen] = useState(false); const [message, setMessage] = useState(""); const [isCreatingLink, setIsCreatingLink] = useState(false); const [payOSConfig, setPayOSConfig] = useState({ RETURN_URL: window.location.href, // required ELEMENT_ID: "embedded-payment-container", // required CHECKOUT_URL: null, // required embedded: true, // Nếu dùng giao diện nhúng onSuccess: (event) => { //TODO: Hành động sau khi người dùng thanh toán đơn hàng thành công setIsOpen(false); setMessage("Thanh toan thanh cong"); }, }); const { open, exit } = usePayOS(payOSConfig); const handleGetPaymentLink = async () => { setIsCreatingLink(true); exit(); const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("Server doesn't response"); } const result = await response.json(); setPayOSConfig((oldConfig) => ({ ...oldConfig, CHECKOUT_URL: result.checkoutUrl, })); setIsOpen(true); setIsCreatingLink(false); }; useEffect(() => { if (payOSConfig.CHECKOUT_URL != null) { open(); } }, [payOSConfig]); return message ? ( ) : (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

{!isOpen ? (
{isCreatingLink ? (
Creating Link...
) : ( )}
) : ( )}
{isOpen && (
Sau khi thực hiện thanh toán thành công, vui lòng đợi từ 5 - 10s để hệ thống tự động cập nhật.
)}
); }; const Message = ({ message }) => (

{message}

); export default function App() { return ; } ``` ## React + PHP[​](#react--php "Đường dẫn trực tiếp đến React + PHP") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho PHP[​](#cài-đặt-thư-viện-payos-cho-php "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho PHP") ``` composer require payos/payos ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout và import usePayOS[​](#cài-đặt-thư-viện-payos-checkout-và-import-usepayos "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout và import usePayOS") ``` npm install @payos/payos-checkout # hoặc yarn add @payos/payos-checkout ``` ### Khởi tạo config cho việc gọi hook usePayOS[​](#khởi-tạo-config-cho-việc-gọi-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho việc gọi hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán[​](#sử-dụng-thư-viện-payos-checkout-để-thực-hiện-việc-nhúng-link-thanh-toán "Đường dẫn trực tiếp đến Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán") Gọi hook usePayOS trong thư viện PayOSCheckout để sử dụng 2 phương thức open() và exit() để lần lượt nhúng và gỡ bỏ giao diện thanh toán trên trang web. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đ��ến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side php -S localhost:3030 --docroot=public # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-7 "Đường dẫn trực ti�ếp đến Mã nguồn") * checkout.php * App.js /checkout.php ``` intval(substr(strval(microtime(true) * 10000), -6)), "amount" => 2000, "description" => "Thanh toán đơn hàng", "returnUrl" => $YOUR_DOMAIN, "cancelUrl" => $YOUR_DOMAIN ]; $response = $payOS->paymentRequests->create($data); $checkoutUrl = $response['checkoutUrl']; ?> PayOS Checkout

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /client/src/App.js ``` import React, { useState, useEffect } from "react"; import { usePayOS } from "@payos/payos-checkout"; import "./App.css"; const ProductDisplay = () => { const [isOpen, setIsOpen] = useState(false); const [message, setMessage] = useState(""); const [isCreatingLink, setIsCreatingLink] = useState(false); const [payOSConfig, setPayOSConfig] = useState({ RETURN_URL: window.location.href, // required ELEMENT_ID: "embedded-payment-container", // required CHECKOUT_URL: null, // required embedded: true, // Nếu dùng giao diện nhúng onSuccess: (event) => { //TODO: Hành động sau khi người dùng thanh toán đơn hàng thành công setIsOpen(false); setMessage("Thanh toan thanh cong"); }, }); const { open, exit } = usePayOS(payOSConfig); const handleGetPaymentLink = async () => { setIsCreatingLink(true); exit(); const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("Server doesn't response"); } const result = await response.json(); setPayOSConfig((oldConfig) => ({ ...oldConfig, CHECKOUT_URL: result.checkoutUrl, })); setIsOpen(true); setIsCreatingLink(false); }; useEffect(() => { if (payOSConfig.CHECKOUT_URL != null) { open(); } }, [payOSConfig]); return message ? ( ) : (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

{!isOpen ? (
{isCreatingLink ? (
Creating Link...
) : ( )}
) : ( )}
{isOpen && (
Sau khi thực hiện thanh toán thành công, vui lòng đợi từ 5 - 10s để hệ thống tự động cập nhật.
)}
); }; const Message = ({ message }) => (

{message}

); export default function App() { return ; } ``` ## React + Python[​](#react--python "Đường dẫn trực tiếp đến React + Python") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Python[​](#cài-đặt-thư-viện-payos-cho-python "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Python") ``` pip install payos ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout và import usePayOS[​](#cài-đặt-thư-viện-payos-checkout-và-import-usepayos "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout và import usePayOS") ``` npm install @payos/payos-checkout # hoặc yarn add @payos/payos-checkout ``` ### Khởi tạo config cho việc gọi hook usePayOS[​](#khởi-tạo-config-cho-việc-gọi-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho việc gọi hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán[​](#sử-dụng-thư-viện-payos-checkout-để-thực-hiện-việc-nhúng-link-thanh-toán "Đường dẫn trực tiếp đến Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán") Gọi hook usePayOS trong thư viện PayOSCheckout để sử dụng 2 phương thức open() và exit() để lần lượt nhúng và gỡ bỏ giao diện thanh toán trên trang web. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side flask run --port=3030 # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-8 "Đường dẫn trực tiếp đến Mã nguồn") * server.py * App.js /server.py ``` """ server.py PayOS Sample. Python 3.6 or newer required. """ import time from flask import Flask, send_from_directory from payos import CreatePaymentLinkRequest, PayOS # Keep your PayOS key protected by including it by an environment variable client_id = "YOUR_CLIENT_ID" api_key = "YOUR_API_KEY" checksum_key = "YOUR_CHECKSUM_KEY" payos = PayOS(client_id, api_key, checksum_key) app = Flask(__name__, static_url_path="", static_folder="public") YOUR_DOMAIN = "http://localhost:3030/" @app.route("/") def index(): return send_from_directory("public", "index.html") @app.route("/create-embedded-payment-link", methods=["POST"]) def create_payment_link(): try: payment_data = CreatePaymentLinkRequest( orderCode=int(time.time()), amount=2000, description="Thanh toan don hang", cancelUrl=YOUR_DOMAIN, returnUrl=YOUR_DOMAIN, ) payment_link_response = payos.payment_requests.create(payment_data) except Exception as e: return str(e) return payment_link_response.to_json() if __name__ == "__main__": app.run(port=3030) ``` /client/src/App.js ``` import React, { useState, useEffect } from "react"; import { usePayOS } from "@payos/payos-checkout"; import "./App.css"; const ProductDisplay = () => { const [isOpen, setIsOpen] = useState(false); const [message, setMessage] = useState(""); const [isCreatingLink, setIsCreatingLink] = useState(false); const [payOSConfig, setPayOSConfig] = useState({ RETURN_URL: window.location.href, // required ELEMENT_ID: "embedded-payment-container", // required CHECKOUT_URL: null, // required embedded: true, // Nếu dùng giao diện nhúng onSuccess: (event) => { //TODO: Hành động sau khi người dùng thanh toán đơn hàng thành công setIsOpen(false); setMessage("Thanh toan thanh cong"); }, }); const { open, exit } = usePayOS(payOSConfig); const handleGetPaymentLink = async () => { setIsCreatingLink(true); exit(); const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("Server doesn't response"); } const result = await response.json(); setPayOSConfig((oldConfig) => ({ ...oldConfig, CHECKOUT_URL: result.checkoutUrl, })); setIsOpen(true); setIsCreatingLink(false); }; useEffect(() => { if (payOSConfig.CHECKOUT_URL != null) { open(); } }, [payOSConfig]); return message ? ( ) : (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

{!isOpen ? (
{isCreatingLink ? (
Creating Link...
) : ( )}
) : ( )}
{isOpen && (
Sau khi thực hiện thanh toán thành công, vui lòng đợi từ 5 - 10s để hệ thống tự động cập nhật.
)}
); }; const Message = ({ message }) => (

{message}

); export default function App() { return ; } ``` ## React + Go[​](#react--go "Đường dẫn trực tiếp đến React + Go") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Go[​](#cài-đặt-thư-viện-payos-cho-go "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Go") ``` go get github.com/payOSHQ/payos-lib-golang/v2 ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout và import usePayOS[​](#cài-đặt-thư-viện-payos-checkout-và-import-usepayos "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout và import usePayOS") ``` npm install @payos/payos-checkout # hoặc yarn add @payos/payos-checkout ``` ### Khởi tạo config cho việc gọi hook usePayOS[​](#khởi-tạo-config-cho-việc-gọi-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho việc gọi hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán[​](#sử-dụng-thư-viện-payos-checkout-để-thực-hiện-việc-nhúng-link-thanh-toán "Đường dẫn trực tiếp đến Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán") Gọi hook usePayOS trong thư viện PayOSCheckout để sử dụng 2 phương thức open() và exit() để lần lượt nhúng và gỡ bỏ giao diện thanh toán trên trang web. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side go run server.go # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-9 "Đường dẫn trực tiếp đến Mã nguồn") * server.go * App.js /server.go ``` package main import ( "encoding/json" "log" "net/http" "time" "github.com/payOSHQ/payos-lib-golang/v2" ) var payOSClient *payos.PayOS func main() { // Keep your PayOS key protected by including it by an env variable const clientId = "YOUR_CLIENT_ID" const apiKey = "YOUR_API_KEY" const checksumKey = "YOUR_CHECKSUM_KEY" var err error payOSClient, err = payos.NewPayOS(&payos.PayOSOptions{ ClientID: clientId, APIKey: apiKey, ChecksumKey: checksumKey, }) if err != nil { log.Fatalf("Failed to create PayOS client: %v", err) } http.Handle("/", http.FileServer(http.Dir("public"))) http.HandleFunc("/create-embedded-payment-link", createPaymentLink) addr := "localhost:3030" log.Printf("Listening on %s", addr) log.Fatal(http.ListenAndServe(addr, nil)) } func createPaymentLink(w http.ResponseWriter, r *http.Request) { domain := "http://localhost:3030/" paymentLinkRequest := payos.CreatePaymentLinkRequest{ OrderCode: time.Now().UnixNano() / int64(time.Millisecond), Amount: 2000, Description: "Thanh toan don hang", CancelUrl: domain, ReturnUrl: domain, } paymentLinkResponse, err := payOSClient.PaymentRequests.Create(r.Context(), &paymentLinkRequest) if err != nil { log.Printf("Create payment link failed: %v", err) } // Return paymentLinkResponse as JSON instead of redirect w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(paymentLinkResponse); err != nil { log.Printf("Failed to encode response: %v", err) } } ``` /client/src/App.js ``` import React, { useState, useEffect } from "react"; import { usePayOS } from "@payos/payos-checkout"; import "./App.css"; const ProductDisplay = () => { const [isOpen, setIsOpen] = useState(false); const [message, setMessage] = useState(""); const [isCreatingLink, setIsCreatingLink] = useState(false); const [payOSConfig, setPayOSConfig] = useState({ RETURN_URL: window.location.href, // required ELEMENT_ID: "embedded-payment-container", // required CHECKOUT_URL: null, // required embedded: true, // Nếu dùng giao diện nhúng onSuccess: (event) => { //TODO: Hành động sau khi người dùng thanh toán đơn hàng thành công setIsOpen(false); setMessage("Thanh toan thanh cong"); }, }); const { open, exit } = usePayOS(payOSConfig); const handleGetPaymentLink = async () => { setIsCreatingLink(true); exit(); const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("Server doesn't response"); } const result = await response.json(); setPayOSConfig((oldConfig) => ({ ...oldConfig, CHECKOUT_URL: result.checkoutUrl, })); setIsOpen(true); setIsCreatingLink(false); }; useEffect(() => { if (payOSConfig.CHECKOUT_URL != null) { open(); } }, [payOSConfig]); return message ? ( ) : (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

{!isOpen ? (
{isCreatingLink ? (
Creating Link...
) : ( )}
) : ( )}
{isOpen && (
Sau khi thực hiện thanh toán thành công, vui lòng đợi từ 5 - 10s để hệ thống tự động cập nhật.
)}
); }; const Message = ({ message }) => (

{message}

); export default function App() { return ; } ``` ## React + .NET[​](#react--net "Đường dẫn trực tiếp đến React + .NET") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho .NET[​](#cài-đặt-thư-viện-payos-cho-net "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho .NET") * dotnet * NuGet ``` dotnet add package payOS ``` ``` Install-Package payOS ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout và import usePayOS[​](#cài-đặt-thư-viện-payos-checkout-và-import-usepayos "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout và import usePayOS") ``` npm install @payos/payos-checkout # hoặc yarn add @payos/payos-checkout ``` ### Khởi tạo config cho việc gọi hook usePayOS[​](#khởi-tạo-config-cho-việc-gọi-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho việc gọi hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán[​](#sử-dụng-thư-viện-payos-checkout-để-thực-hiện-việc-nhúng-link-thanh-toán "Đường dẫn trực tiếp đến Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán") Gọi hook usePayOS trong thư viện PayOSCheckout để sử dụng 2 phương thức open() và exit() để lần lượt nhúng và gỡ bỏ giao diện thanh toán trên trang web. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side dotnet run # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-10 "Đường dẫn trực tiếp đến Mã nguồn") * Server.cs * App.js /Server.cs ``` using Microsoft.AspNetCore; using Microsoft.AspNetCore.Mvc; using PayOS; using PayOS.Models; namespace server.Controllers { public class Program { public static void Main(string[] args) { WebHost.CreateDefaultBuilder(args) .UseUrls("http://localhost:3030/") .UseWebRoot("public") .UseStartup() .Build() .Run(); } } public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseStaticFiles(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapGet("/", context => { context.Response.Redirect("/index.html"); return Task.CompletedTask; }); }); } } [Route("create-embedded-payment-link")] [ApiController] public class CheckoutApiController : Controller { [HttpPost] public async Task Create() { // Keep your PayOS key protected by including it by an env variable var clientId = "YOUR_CLIENT_ID"; var apiKey = "YOUR_API_KEY"; var checksumKey = "YOUR_CHECKSUM_KEY"; var payOS = new PayOSClient(clientId, apiKey, checksumKey); var domain = "http://localhost:3030"; var paymentLinkRequest = new CreatePaymentLinkRequest { OrderCode = int.Parse(DateTimeOffset.Now.ToString("ffffff")), Amount = 2000, Description = "Thanh toan don hang", ReturnUrl = domain, CancelUrl = domain }; var response = await payOS.PaymentRequests.CreateAsync(paymentLinkRequest); return json(response); } } } ``` /client/src/App.js ``` import React, { useState, useEffect } from "react"; import { usePayOS } from "@payos/payos-checkout"; import "./App.css"; const ProductDisplay = () => { const [isOpen, setIsOpen] = useState(false); const [message, setMessage] = useState(""); const [isCreatingLink, setIsCreatingLink] = useState(false); const [payOSConfig, setPayOSConfig] = useState({ RETURN_URL: window.location.href, // required ELEMENT_ID: "embedded-payment-container", // required CHECKOUT_URL: null, // required embedded: true, // Nếu dùng giao diện nhúng onSuccess: (event) => { //TODO: Hành động sau khi người dùng thanh toán đơn hàng thành công setIsOpen(false); setMessage("Thanh toan thanh cong"); }, }); const { open, exit } = usePayOS(payOSConfig); const handleGetPaymentLink = async () => { setIsCreatingLink(true); exit(); const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("Server doesn't response"); } const result = await response.json(); setPayOSConfig((oldConfig) => ({ ...oldConfig, CHECKOUT_URL: result.checkoutUrl, })); setIsOpen(true); setIsCreatingLink(false); }; useEffect(() => { if (payOSConfig.CHECKOUT_URL != null) { open(); } }, [payOSConfig]); return message ? ( ) : (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

{!isOpen ? (
{isCreatingLink ? (
Creating Link...
) : ( )}
) : ( )}
{isOpen && (
Sau khi thực hiện thanh toán thành công, vui lòng đợi từ 5 - 10s để hệ thống tự động cập nhật.
)}
); }; const Message = ({ message }) => (

{message}

); export default function App() { return ; } ``` ## React + Java[​](#react--java "Đường dẫn trực tiếp đến React + Java") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Java[​](#cài-đặt-thư-viện-payos-cho-java "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Java") * Maven * Gradle Thêm đoạn code sau vào POM và thay VERSION bằng phiên bản bạn muốn sử dụng. ``` vn.payos payos-java {VERSION} ``` Thêm đoạn code sau vào build.gradle và thay VERSION bằng phiên bản bạn muốn sử dụng. ``` implementation 'vn.payos:payos-java:{VERSION}' ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Cài đặt thư viện payos-checkout và import usePayOS[​](#cài-đặt-thư-viện-payos-checkout-và-import-usepayos "Đường dẫn trực tiếp đến Cài đặt thư viện payos-checkout và import usePayOS") ``` npm install @payos/payos-checkout # hoặc yarn add @payos/payos-checkout ``` ### Khởi tạo config cho việc gọi hook usePayOS[​](#khởi-tạo-config-cho-việc-gọi-hook-usepayos "Đường dẫn trực tiếp đến Khởi tạo config cho việc gọi hook usePayOS") Có 3 trường bắt buộc phải khởi tạo: * **RETURN\_URL**: url dẫn đến trang web khi thanh toán thành công. * **ELEMENT\_ID**: id của 1 component mà bạn muốn nhúng giao diện thanh toán của payOS vào * **CHECKOUT\_URL**: đường link dẫn đến giao diện thanh toán sẽ được nhúng vào trang web của bạn Vì thực hiện giao diện thanh toán nhúng nên ta sẽ sử dụng thêm các property như sau: * `embedded: true` để sử dụng giao diện nhúng * **onSuccess(event)**: gọi hàm bạn truyền vào nếu như người dùng thực hiện thanh toán thành công Thông tin chi tiết hơn tại: [payos-checkout](https://payos.vn/docs/sdks/front-end/script-js/) ### Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán[​](#sử-dụng-thư-viện-payos-checkout-để-thực-hiện-việc-nhúng-link-thanh-toán "Đường dẫn trực tiếp đến Sử dụng thư viện payos-checkout để thực hiện việc nhúng link thanh toán") Gọi hook usePayOS trong thư viện PayOSCheckout để sử dụng 2 phương thức open() và exit() để lần lượt nhúng và gỡ bỏ giao diện thanh toán trên trang web. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side java -cp .\target\payos-payment-1.0-SNAPSHOT-jar-with-dependencies.jar vn.payos.sample.Server # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-11 "Đường dẫn trực tiếp đến Mã nguồn") * Server.java * pom.xml * App.js /Server.java ``` package vn.payos.sample; import static spark.Spark.port; import static spark.Spark.post; import static spark.Spark.staticFiles; import java.nio.file.Paths; import vn.payos.PayOS; import vn.payos.model.v2.paymentRequests.CreatePaymentLinkRequest; import vn.payos.model.v2.paymentRequests.CreatePaymentLinkResponse; public class Server { public static void main(String[] args) { port(3000); String clientId = "YOUR_CLIENT_ID"; String apiKey = "YOUR_API_KEY"; String checksumKey = "YOUR_CHECKSUM_KEY"; final PayOS payOS = new PayOS(clientId, apiKey, checksumKey); staticFiles.externalLocation(Paths.get("public").toAbsolutePath().toString()); post( "/create-embedded-payment-link", (request, response) -> { String domain = "http://localhost:3000/"; Long orderCode = System.currentTimeMillis() / 1000; CreatePaymentLinkRequest paymentData = CreatePaymentLinkRequest.builder() .orderCode(orderCode) .amount(2000) .description("Thanh toán đơn hàng") .returnUrl(domain) .cancelUrl(domain) .build(); CreatePaymentLinkResponse result = payOS.paymentRequests().create(paymentData); response.type("application/json"); return new com.google.gson.Gson().toJson(result); }); } } ``` /pom.xml ``` 4.0.0 vn.payos.sample payos-payment 1.0-SNAPSHOT sample http://www.example.com UTF-8 1.8 1.8 com.sparkjava spark-core 2.9.4 vn.payos payos-java 1.0.1 maven-clean-plugin 3.1.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.8.0 maven-surefire-plugin 2.22.1 maven-jar-plugin 3.0.2 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 maven-site-plugin 3.7.1 maven-project-info-reports-plugin 3.0.0 maven-assembly-plugin package single jar-with-dependencies vn.payos.sample.Server ``` /client/src/App.js ``` import React, { useState, useEffect } from "react"; import { usePayOS } from "@payos/payos-checkout"; import "./App.css"; const ProductDisplay = () => { const [isOpen, setIsOpen] = useState(false); const [message, setMessage] = useState(""); const [isCreatingLink, setIsCreatingLink] = useState(false); const [payOSConfig, setPayOSConfig] = useState({ RETURN_URL: window.location.href, // required ELEMENT_ID: "embedded-payment-container", // required CHECKOUT_URL: null, // required embedded: true, // Nếu dùng giao diện nhúng onSuccess: (event) => { //TODO: Hành động sau khi người dùng thanh toán đơn hàng thành công setIsOpen(false); setMessage("Thanh toan thanh cong"); }, }); const { open, exit } = usePayOS(payOSConfig); const handleGetPaymentLink = async () => { setIsCreatingLink(true); exit(); const response = await fetch( "http://localhost:3030/create-embedded-payment-link", { method: "POST", } ); if (!response.ok) { console.log("Server doesn't response"); } const result = await response.json(); setPayOSConfig((oldConfig) => ({ ...oldConfig, CHECKOUT_URL: result.checkoutUrl, })); setIsOpen(true); setIsCreatingLink(false); }; useEffect(() => { if (payOSConfig.CHECKOUT_URL != null) { open(); } }, [payOSConfig]); return message ? ( ) : (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

{!isOpen ? (
{isCreatingLink ? (
Creating Link...
) : ( )}
) : ( )}
{isOpen && (
Sau khi thực hiện thanh toán thành công, vui lòng đợi từ 5 - 10s để hệ thống tự động cập nhật.
)}
); }; const Message = ({ message }) => (

{message}

); export default function App() { return ; } ``` --- # payOS-Hosted Page Đang tải ... --- # payOS-Hosted Page - Complete Guide This page contains all possible combinations of frontend and backend implementations for the payOS-Hosted Page integration. ## HTML + Node.js[​](#html--nodejs "Đường dẫn trực tiếp đến HTML + Node.js") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho NodeJS[​](#cài-đặt-thư-viện-payos-cho-nodejs "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho NodeJS") ``` npm install @payos/node # hoặc yarn add @payos/node ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thanh toán thành công[​](#thêm-trang-thanh-toán-thành-công "Đường dẫn trực tiếp đến Thêm trang thanh toán thành công") Tạo một trang thanh toán đơn hàng thành công cho đường dẫn bạn cung cấp trong `returnUrl` để hiển thị thông báo thanh toán thành công hoặc thông tin đơn hàng cho khách hàng sau khi thanh toán đơn hàng thành công. ### Thêm trang hủy thanh toán[​](#thêm-trang-hủy-thanh-toán "Đường dẫn trực tiếp đến Thêm trang hủy thanh toán") Tạo trang hủy thanh toán cho đường dẫn bạn cung cấp trong `cancelUrl`. payOS sẽ chuyển hướng khách hàng đến trang này khi khách hàng nhấn hủy thanh toán. ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` npm start ``` ### Mã nguồn[​](#mã-nguồn "Đường dẫn trực tiếp đến Mã nguồn") * server.js * index.html * success.html * cancel.html /server.js ``` const express = require('express'); const dotenv = require('dotenv'); const cors = require('cors'); const { PayOS } = require('@payos/node'); const app = express(); dotenv.config(); const payOS = new PayOS({ clientId: process.env.PAYOS_CLIENT_ID, apiKey: process.env.PAYOS_API_KEY, checksumKey: process.env.PAYOS_CHECKSUM_KEY, }); app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use('/', express.static('public')); app.post('/create-payment-link', async (req, res) => { const YOUR_DOMAIN = `http://localhost:3030`; const body = { orderCode: Number(String(Date.now()).slice(-6)), amount: 2000, description: 'Thanh toan don hang', items: [ { name: 'Mì tôm Hảo Hảo ly', quantity: 1, price: 2000, }, ], returnUrl: `${YOUR_DOMAIN}/success.html`, cancelUrl: `${YOUR_DOMAIN}/cancel.html`, }; try { const paymentLinkResponse = await payOS.paymentRequests.create(body); res.redirect(paymentLinkResponse.checkoutUrl); } catch (error) { console.error(error); res.send('Something went error'); } }); app.listen(3030, function () { console.log(`Server is listening on port 3030`); }); ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/success.html ``` Thanh toán thành công

Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` /public/cancel.html ``` Thanh toán thất bại

Thanh toán thất bại

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` ## HTML + PHP[​](#html--php "Đường dẫn trực tiếp đến HTML + PHP") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho PHP[​](#cài-đặt-thư-viện-payos-cho-php "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho PHP") ``` composer require payos/payos ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thanh toán thành công[​](#thêm-trang-thanh-toán-thành-công "Đường dẫn trực tiếp đến Thêm trang thanh toán thành công") Tạo một trang thanh toán đơn hàng thành công cho đường dẫn bạn cung cấp trong `returnUrl` để hiển thị thông báo thanh toán thành công hoặc thông tin đơn hàng cho khách hàng sau khi thanh toán đơn hàng thành công. ### Thêm trang hủy thanh toán[​](#thêm-trang-hủy-thanh-toán "Đường dẫn trực tiếp đến Thêm trang hủy thanh toán") Tạo trang hủy thanh toán cho đường dẫn bạn cung cấp trong `cancelUrl`. payOS sẽ chuyển hướng khách hàng đến trang này khi khách hàng nhấn hủy thanh toán. ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` php -S localhost:3030 --docroot=public ``` ### Mã nguồn[​](#mã-nguồn-1 "Đường dẫn trực tiếp đến Mã nguồn") * checkout.php * index.html * success.html * cancel.html /public/checkout.php ``` intval(substr(strval(microtime(true) * 10000), -6)), "amount" => 2000, "description" => "Thanh toán đơn hàng", "returnUrl" => $YOUR_DOMAIN . "/success.html", "cancelUrl" => $YOUR_DOMAIN . "/cancel.html" ]; $response = $payOS->paymentRequests->create($data); header("HTTP/1.1 303 See Other"); header("Location: " . $response['checkoutUrl']); ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/success.html ``` Thanh toán thành công

Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` /public/cancel.html ``` Thanh toán thất bại

Thanh toán thất bại

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` ## HTML + Python[​](#html--python "Đường dẫn trực tiếp đến HTML + Python") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Python[​](#cài-đặt-thư-viện-payos-cho-python "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Python") ``` pip install payos ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thanh toán thành công[​](#thêm-trang-thanh-toán-thành-công "Đường dẫn trực tiếp đến Thêm trang thanh toán thành công") Tạo một trang thanh toán đơn hàng thành công cho đường dẫn bạn cung cấp trong `returnUrl` để hiển thị thông báo thanh toán thành công hoặc thông tin đơn hàng cho khách hàng sau khi thanh toán đơn hàng thành công. ### Thêm trang hủy thanh toán[​](#thêm-trang-hủy-thanh-toán "Đường dẫn trực tiếp đến Thêm trang hủy thanh toán") Tạo trang hủy thanh toán cho đường dẫn bạn cung cấp trong `cancelUrl`. payOS sẽ chuyển hướng khách hàng đến trang này khi khách hàng nhấn hủy thanh toán. ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` flask run --port=3030 ``` ### Mã nguồn[​](#mã-nguồn-2 "Đường dẫn trực tiếp đến Mã nguồn") * server.py * index.html * success.html * cancel.html /server.py ``` """ server.py PayOS Sample. Python 3.6 or newer required. """ import time from flask import Flask, redirect from payos import PayOS from payos.types import CreatePaymentLinkRequest # Keep your PayOS key protected by including it by an environment variable client_id = "YOUR_CLIENT_ID" api_key = "YOUR_API_KEY" checksum_key = "YOUR_CHECKSUM_KEY" payos = PayOS(client_id, api_key, checksum_key) app = Flask(__name__, static_url_path="", static_folder="public") YOUR_DOMAIN = "http://localhost:3030" @app.route("/create-payment-link", methods=["POST"]) def create_payment_link(): try: payment_data = CreatePaymentLinkRequest( orderCode=int(time.time()), amount=2000, description="Thanh toan don hang", cancelUrl=YOUR_DOMAIN + "/cancel.html", returnUrl=YOUR_DOMAIN + "/success.html", ) payment_link_response = payos.payment_requests.create(payment_data) except Exception as e: return str(e) return redirect(payment_link_response.checkoutUrl) if __name__ == "__main__": app.run(port=3030) ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/success.html ``` Thanh toán thành công

Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` /public/cancel.html ``` Thanh toán thất bại

Thanh toán thất bại

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` ## HTML + Go[​](#html--go "Đường dẫn trực tiếp đến HTML + Go") ## Thiết lập Server[​](#thi�ết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Go[​](#cài-đặt-thư-viện-payos-cho-go "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Go") ``` go get github.com/payOSHQ/payos-lib-golang/v2 ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thanh toán thành công[​](#thêm-trang-thanh-toán-thành-công "Đường dẫn tr��ực tiếp đến Thêm trang thanh toán thành công") Tạo một trang thanh toán đơn hàng thành công cho đường dẫn bạn cung cấp trong `returnUrl` để hiển thị thông báo thanh toán thành công hoặc thông tin đơn hàng cho khách hàng sau khi thanh toán đơn hàng thành công. ### Thêm trang hủy thanh toán[​](#thêm-trang-hủy-thanh-toán "Đường dẫn trực tiếp đến Thêm trang hủy thanh toán") Tạo trang hủy thanh toán cho đường dẫn bạn cung cấp trong `cancelUrl`. payOS sẽ chuyển hướng khách hàng đến trang này khi khách hàng nhấn hủy thanh toán. ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` go run server.go ``` ### Mã nguồn[​](#mã-nguồn-3 "Đường dẫn trực tiếp đến Mã nguồn") * server.go * index.html * success.html * cancel.html /server.go ``` package main import ( "log" "net/http" "time" "github.com/payOSHQ/payos-lib-golang/v2" ) var payOSClient *payos.PayOS func main() { // Keep your PayOS key protected by including it by an env variable const clientId = "YOUR_CLIENT_ID" const apiKey = "YOUR_API_KEY" const checksumKey = "YOUR_CHECKSUM_KEY" var err error payOSClient, err = payos.NewPayOS(&payos.PayOSOptions{ ClientID: clientId, APIKey: apiKey, ChecksumKey: checksumKey, }) if err != nil { log.Fatalf("Failed to create PayOS client: %v", err) } http.Handle("/", http.FileServer(http.Dir("public"))) http.HandleFunc("/create-payment-link", createPaymentLink) addr := "localhost:3030" log.Printf("Listening on %s", addr) log.Fatal(http.ListenAndServe(addr, nil)) } func createPaymentLink(w http.ResponseWriter, r *http.Request) { domain := "http://localhost:3030" paymentLinkRequest := payos.CreatePaymentLinkRequest{ OrderCode: time.Now().UnixNano() / int64(time.Millisecond), Amount: 2000, Description: "Thanh toan don hang", CancelUrl: domain + "/cancel.html", ReturnUrl: domain + "/success.html", } paymentLinkResponse, err := payOSClient.PaymentRequests.Create(r.Context(), &paymentLinkRequest) if err != nil { log.Printf("Create payment link failed: %v", err) } http.Redirect(w, r, paymentLinkResponse.CheckoutUrl, http.StatusSeeOther) } ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/success.html ``` Thanh toán thành công

Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` /public/cancel.html ``` Thanh toán thất bại

Thanh toán thất bại

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` ## HTML + .NET[​](#html--net "Đường dẫn trực tiếp đến HTML + .NET") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho .NET[​](#cài-đặt-thư-viện-payos-cho-net "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho .NET") * dotnet * NuGet ``` dotnet add package payOS ``` ``` Install-Package payOS ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thanh toán thành công[​](#thêm-trang-thanh-toán-thành-công "Đường dẫn trực tiếp đến Thêm trang thanh toán thành công") Tạo một trang thanh toán đơn hàng thành công cho đường dẫn bạn cung cấp trong `returnUrl` để hiển thị thông báo thanh toán thành công hoặc thông tin đơn hàng cho khách hàng sau khi thanh toán đơn hàng thành công. ### Thêm trang hủy thanh toán[​](#thêm-trang-hủy-thanh-toán "Đường dẫn trực tiếp đến Thêm trang hủy thanh toán") Tạo trang hủy thanh toán cho đường dẫn bạn cung cấp trong `cancelUrl`. payOS sẽ chuyển hướng khách hàng đến trang này khi khách hàng nhấn hủy thanh toán. ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` dotnet run ``` ### Mã nguồn[​](#mã-nguồn-4 "Đường dẫn trực tiếp đến Mã nguồn") * Server.cs * index.html * success.html * cancel.html /Server.cs ``` using Microsoft.AspNetCore; using Microsoft.AspNetCore.Mvc; using PayOS; using PayOS.Models; namespace server.Controllers { public class Program { public static void Main(string[] args) { WebHost.CreateDefaultBuilder(args) .UseUrls("http://localhost:3030") .UseWebRoot("public") .UseStartup() .Build() .Run(); } } public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseStaticFiles(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapGet("/", context => { context.Response.Redirect("/index.html"); return Task.CompletedTask; }); }); } } [Route("create-payment-link")] [ApiController] public class CheckoutApiController : Controller { [HttpPost] public async Task Create() { // Keep your PayOS key protected by including it by an env variable var clientId = "YOUR_CLIENT_ID"; var apiKey = "YOUR_API_KEY"; var checksumKey = "YOUR_CHECKSUM_KEY"; var payOS = new PayOSClient(clientId, apiKey, checksumKey); var domain = "http://localhost:3030"; var paymentLinkRequest = new CreatePaymentLinkRequest { OrderCode = int.Parse(DateTimeOffset.Now.ToString("ffffff")), Amount = 2000, Description = "Thanh toan don hang", ReturnUrl = domain, CancelUrl = domain }; var response = await payOS.PaymentRequests.CreateAsync(paymentLinkRequest); Response.Headers.Append("Location", response.CheckoutUrl); return new StatusCodeResult(303); } } } ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/success.html ``` Thanh toán thành công

Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` /public/cancel.html ``` Thanh toán thất bại

Thanh toán thất bại

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` ## HTML + Java[​](#html--java "Đường dẫn trực tiếp đến HTML + Java") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Java[​](#cài-đặt-thư-viện-payos-cho-java "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Java") * Maven * Gradle Thêm đoạn code sau vào POM và thay VERSION bằng phiên bản bạn muốn sử dụng. ``` vn.payos payos-java {VERSION} ``` Thêm đoạn code sau vào build.gradle và thay VERSION bằng phiên bản bạn muốn sử dụng. ``` implementation 'vn.payos:payos-java:{VERSION}' ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thanh toán thành công[​](#thêm-trang-thanh-toán-thành-công "Đường dẫn trực tiếp đến Thêm trang thanh toán thành công") Tạo một trang thanh toán đơn hàng thành công cho đường dẫn bạn cung cấp trong `returnUrl` để hiển thị thông báo thanh toán thành công hoặc thông tin đơn hàng cho khách hàng sau khi thanh toán đơn hàng thành công. ### Thêm trang hủy thanh toán[​](#thêm-trang-hủy-thanh-toán "Đường dẫn trực tiếp đến Thêm trang hủy thanh toán") Tạo trang hủy thanh toán cho đường dẫn bạn cung cấp trong `cancelUrl`. payOS sẽ chuyển hướng khách hàng đến trang này khi khách hàng nhấn hủy thanh toán. ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Chạy server của bạn và truy cập vào [`http://localhost:3030`](http://localhost:3030) để bắt đầu tạo link thanh toán. ``` java -cp .\target\payos-payment-1.0-SNAPSHOT-jar-with-dependencies.jar vn.payos.sample.Server ``` ### Mã nguồn[​](#mã-nguồn-5 "Đường dẫn trực tiếp đến Mã nguồn") * Server.java * pom.xml * index.html * success.html * cancel.html /Server.java ``` package vn.payos.sample; import static spark.Spark.port; import static spark.Spark.post; import static spark.Spark.staticFiles; import java.nio.file.Paths; import vn.payos.PayOS; import vn.payos.model.v2.paymentRequests.CreatePaymentLinkRequest; import vn.payos.model.v2.paymentRequests.CreatePaymentLinkResponse; public class Server { public static void main(String[] args) { port(3000); String clientId = "YOUR_CLIENT_ID"; String apiKey = "YOUR_API_KEY"; String checksumKey = "YOUR_CHECKSUM_KEY"; final PayOS payOS = new PayOS(clientId, apiKey, checksumKey); staticFiles.externalLocation(Paths.get("public").toAbsolutePath().toString()); post( "/create-payment-link", (request, response) -> { String domain = "http://localhost:3000"; Long orderCode = System.currentTimeMillis() / 1000; CreatePaymentLinkRequest paymentData = CreatePaymentLinkRequest.builder() .orderCode(orderCode) .amount(2000) .description("Thanh toán đơn hàng") .returnUrl(domain + "/success.html") .cancelUrl(domain + "/cancel.html") .build(); CreatePaymentLinkResponse result = payOS.paymentRequests().create(paymentData); response.redirect(result.getCheckoutUrl(), 303); return ""; }); } } ``` /pom.xml ``` 4.0.0 vn.payos.sample payos-payment 1.0-SNAPSHOT sample http://www.example.com UTF-8 1.8 1.8 com.sparkjava spark-core 2.9.4 vn.payos payos-java 1.0.1 maven-clean-plugin 3.1.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.8.0 maven-surefire-plugin 2.22.1 maven-jar-plugin 3.0.2 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 maven-site-plugin 3.7.1 maven-project-info-reports-plugin 3.0.0 maven-assembly-plugin package single jar-with-dependencies vn.payos.sample.Server ``` /public/index.html ``` Tạo Link thanh toán

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

``` /public/success.html ``` Thanh toán thành công

Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` /public/cancel.html ``` Thanh toán thất bại

Thanh toán thất bại

Nếu có bất kỳ câu hỏi nào, hãy gửi email tới support@payos.vn

Trở về trang Tạo Link thanh toán
``` ## React + Node.js[​](#react--nodejs "Đường dẫn trực tiếp đến React + Node.js") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho NodeJS[​](#cài-đặt-thư-viện-payos-cho-nodejs "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho NodeJS") ``` npm install @payos/node # hoặc yarn add @payos/node ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn tr�ực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` npm start ``` ### Mã nguồn[​](#mã-nguồn-6 "Đường dẫn trực tiếp đến Mã nguồn") * server.js * App.js /server.js ``` const express = require('express'); const cors = require('cors'); const PayOS = require('@payos/node'); const app = express(); // Keep your PayOS key protected by including it by an env variable const express = require('express'); const dotenv = require('dotenv'); const cors = require('cors'); const { PayOS } = require('@payos/node'); const app = express(); dotenv.config(); const payOS = new PayOS({ clientId: process.env.PAYOS_CLIENT_ID, apiKey: process.env.PAYOS_API_KEY, checksumKey: process.env.PAYOS_CHECKSUM_KEY, }); app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.post('/create-payment-link', async (req, res) => { const YOUR_DOMAIN = `http://localhost:3000`; const body = { orderCode: Number(String(Date.now()).slice(-6)), amount: 2000, description: 'Thanh toan don hang', items: [ { name: 'Mì tôm Hảo Hảo ly', quantity: 1, price: 2000, }, ], returnUrl: `${YOUR_DOMAIN}?success=true`, cancelUrl: `${YOUR_DOMAIN}?canceled=true`, }; try { const paymentLinkResponse = await payOS.paymentRequests.create(body); res.redirect(paymentLinkResponse.checkoutUrl); } catch (error) { console.error(error); res.send('Something went error'); } }); app.listen(3030, function () { console.log(`Server is listening on port 3030`); }); ``` /src/App.js ``` import React, { useState, useEffect } from "react"; import "./App.css"; const OrderInformation = () => (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

); const CheckoutMessage = ({ message }) => (

{message}

); export default function App() { const [message, setMessage] = useState(""); useEffect(() => { // Kiểm tra trạng thái đơn hàng const query = new URLSearchParams(window.location.search); if (query.get("success")) { setMessage("Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!"); } if (query.get("canceled")) { setMessage( "Thanh toán thất bại. Nếu có bất kỳ câu hỏi nào hãy gửi email tới support@payos.vn." ); } }, []); return message ? ( ) : ( ); } ``` ## React + PHP[​](#react--php "Đường dẫn trực tiếp đến React + PHP") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho PHP[​](#cài-đặt-thư-viện-payos-cho-php "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho PHP") ``` composer require payos/payos ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side php -S localhost:3030 --docroot=public # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-7 "Đường dẫn trực tiếp đến Mã nguồn") * checkout.php * App.js /public/checkout.php ``` intval(substr(strval(microtime(true) * 10000), -6)), "amount" => 2000, "description" => "Thanh toán đơn hàng", "items" => [ 0 => [ 'name' => 'Mì tôm Hảo Hảo ly', 'price' => 2000, 'quantity' => 1 ] ], "returnUrl" => $YOUR_DOMAIN . "?success=true", "cancelUrl" => $YOUR_DOMAIN . "?canceled=true" ]; $response = $payOS->paymentRequests->create($data); header("HTTP/1.1 303 See Other"); header("Location: " . $response['checkoutUrl']); ``` /src/App.js ``` import React, { useState, useEffect } from "react"; import "./App.css"; const OrderInformation = () => (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

); const CheckoutMessage = ({ message }) => (

{message}

); export default function App() { const [message, setMessage] = useState(""); useEffect(() => { // Kiểm tra trạng thái đơn hàng const query = new URLSearchParams(window.location.search); if (query.get("success")) { setMessage("Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!"); } if (query.get("canceled")) { setMessage( "Thanh toán thất bại. Nếu có bất kỳ câu hỏi nào hãy gửi email tới support@payos.vn." ); } }, []); return message ? ( ) : ( ); } ``` ## React + Python[​](#react--python "Đường dẫn trực tiếp đến React + Python") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Python[​](#cài-đặt-thư-viện-payos-cho-python "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Python") ``` pip install payos ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side flask run --port=3030 # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-8 "Đường dẫn trực tiếp đến Mã nguồn") * server.py * App.js /server.py ``` """ server.py PayOS Sample. Python 3.6 or newer required. """ import time from flask import Flask, redirect from payos import PayOS from payos.types import CreatePaymentLinkRequest # Keep your PayOS key protected by including it by an environment variable client_id = "YOUR_CLIENT_ID" api_key = "YOUR_API_KEY" checksum_key = "YOUR_CHECKSUM_KEY" payos = PayOS(client_id, api_key, checksum_key) app = Flask(__name__, static_url_path="", static_folder="public") YOUR_DOMAIN = "http://localhost:3030" @app.route("/create-payment-link", methods=["POST"]) def create_payment_link(): try: payment_data = CreatePaymentLinkRequest( orderCode=int(time.time()), amount=2000, description="Thanh toan don hang", cancelUrl=YOUR_DOMAIN + "?canceled=true", returnUrl=YOUR_DOMAIN + "?success=true", ) payment_link_response = payos.payment_requests.create(payment_data) except Exception as e: return str(e) return redirect(payment_link_response.checkoutUrl) if __name__ == "__main__": app.run(port=3030) ``` /src/App.js ``` import React, { useState, useEffect } from "react"; import "./App.css"; const OrderInformation = () => (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

); const CheckoutMessage = ({ message }) => (

{message}

); export default function App() { const [message, setMessage] = useState(""); useEffect(() => { // Kiểm tra trạng thái đơn hàng const query = new URLSearchParams(window.location.search); if (query.get("success")) { setMessage("Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!"); } if (query.get("canceled")) { setMessage( "Thanh toán thất bại. Nếu có bất kỳ câu hỏi nào hãy gửi email tới support@payos.vn." ); } }, []); return message ? ( ) : ( ); } ``` ## React + Go[​](#react--go "Đường dẫn trực tiếp đến React + Go") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Go[​](#cài-đặt-thư-viện-payos-cho-go "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Go") ``` go get github.com/payOSHQ/payos-lib-golang/v2 ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side go run server.go # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-9 "Đường dẫn trực tiếp đến Mã nguồn") * server.go * App.js /server.go ``` package main import ( "log" "net/http" "time" "github.com/payOSHQ/payos-lib-golang/v2" ) var payOSClient *payos.PayOS func main() { // Keep your PayOS key protected by including it by an env variable const clientId = "YOUR_CLIENT_ID" const apiKey = "YOUR_API_KEY" const checksumKey = "YOUR_CHECKSUM_KEY" var err error payOSClient, err = payos.NewPayOS(&payos.PayOSOptions{ ClientID: clientId, APIKey: apiKey, ChecksumKey: checksumKey, }) if err != nil { log.Fatalf("Failed to create PayOS client: %v", err) } http.Handle("/", http.FileServer(http.Dir("public"))) http.HandleFunc("/create-payment-link", createPaymentLink) addr := "localhost:3030" log.Printf("Listening on %s", addr) log.Fatal(http.ListenAndServe(addr, nil)) } func createPaymentLink(w http.ResponseWriter, r *http.Request) { domain := "http://localhost:3030" paymentLinkRequest := payos.CreatePaymentLinkRequest{ OrderCode: time.Now().UnixNano() / int64(time.Millisecond), Amount: 2000, Description: "Thanh toan don hang", CancelUrl: domain, ReturnUrl: domain, } paymentLinkResponse, err := payOSClient.PaymentRequests.Create(r.Context(), &paymentLinkRequest) ``` /src/App.js ``` import React, { useState, useEffect } from "react"; import "./App.css"; const OrderInformation = () => (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

); const CheckoutMessage = ({ message }) => (

{message}

); export default function App() { const [message, setMessage] = useState(""); useEffect(() => { // Kiểm tra trạng thái đơn hàng const query = new URLSearchParams(window.location.search); if (query.get("success")) { setMessage("Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!"); } if (query.get("canceled")) { setMessage( "Thanh toán thất bại. Nếu có bất kỳ câu hỏi nào hãy gửi email tới support@payos.vn." ); } }, []); return message ? ( ) : ( ); } ``` ## React + .NET[​](#react--net "Đường dẫn trực tiếp đến React + .NET") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho .NET[​](#cài-đặt-thư-viện-payos-cho-net "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho .NET") * dotnet * NuGet ``` dotnet add package payOS ``` ``` Install-Package payOS ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side dotnet run # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-10 "Đường dẫn trực tiếp đến Mã nguồn") * Server.cs * App.js /Server.cs ``` using Microsoft.AspNetCore; using Microsoft.AspNetCore.Mvc; using PayOS; using PayOS.Models; namespace server.Controllers { public class Program { public static void Main(string[] args) { WebHost.CreateDefaultBuilder(args) .UseUrls("http://localhost:3030") .UseWebRoot("public") .UseStartup() .Build() .Run(); } } public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseStaticFiles(); app.UseEndpoints(endpoints => endpoints.MapControllers()); } } [Route("create-payment-link")] [ApiController] public class CheckoutApiController : Controller { [HttpPost] public async Task Create() { // Keep your PayOS key protected by including it by an env variable var clientId = "YOUR_CLIENT_ID"; var apiKey = "YOUR_API_KEY"; var checksumKey = "YOUR_CHECKSUM_KEY"; var payOS = new PayOSClient(clientId, apiKey, checksumKey); var domain = "http://localhost:3030"; var paymentLinkRequest = new CreatePaymentLinkRequest { OrderCode = int.Parse(DateTimeOffset.Now.ToString("ffffff")), Amount = 2000, Description = "Thanh toan don hang", ReturnUrl = domain, CancelUrl = domain }; var response = await payOS.PaymentRequests.CreateAsync(paymentLinkRequest); Response.Headers.Append("Location", response.CheckoutUrl); return new StatusCodeResult(303); } } } ``` /src/App.js ``` import React, { useState, useEffect } from "react"; import "./App.css"; const OrderInformation = () => (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

); const CheckoutMessage = ({ message }) => (

{message}

); export default function App() { const [message, setMessage] = useState(""); useEffect(() => { // Kiểm tra trạng thái đơn hàng const query = new URLSearchParams(window.location.search); if (query.get("success")) { setMessage("Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!"); } if (query.get("canceled")) { setMessage( "Thanh toán thất bại. Nếu có bất kỳ câu hỏi nào hãy gửi email tới support@payos.vn." ); } }, []); return message ? ( ) : ( ); } ``` ## React + Java[​](#react--java "Đường dẫn trực tiếp đến React + Java") ## Thiết lập Server[​](#thiết-lập-server "Đường dẫn trực tiếp đến Thiết lập Server") ### Cài đặt thư viện payOS cho Java[​](#cài-đặt-thư-viện-payos-cho-java "Đường dẫn trực tiếp đến Cài đặt thư viện payOS cho Java") * Maven * Gradle Thêm đoạn code sau vào POM và thay VERSION bằng phiên bản bạn muốn sử dụng. ``` vn.payos payos-java {VERSION} ``` Thêm đoạn code sau vào build.gradle và thay VERSION bằng phiên bản bạn muốn sử dụng. ``` implementation 'vn.payos:payos-java:{VERSION}' ``` ### Khởi tạo đối tượng `PayOS`[​](#khởi-tạo-đối-tượng-payos "Đường dẫn trực tiếp đến khởi-tạo-đối-tượng-payos") Bạn cần khởi tạo đối tượng `PayOS` bằng `Client ID`, `API Key` và `Checksum Key` của kênh thanh toán mà bạn đã tạo trên trang [payOS](https://my.payos.vn). ### Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Link thanh toán kiểm soát những gì khách hàng của bạn nhìn thấy trên trang thanh toán, chẳng hạn như Tên sản phẩm, số lượng đặt, số tiền cũng như số tài khoản thụ hưởng, tên ngân hàng. ### Cung cấp returnUrl và cancelUrl[​](#cung-cấp-returnurl-và-cancelurl "Đường dẫn trực tiếp đến Cung cấp returnUrl và cancelUrl") Chỉ định URL công khai cho trang thanh toán thành công và hủy thanh toán. Bạn cũng có thể xử lý cả trạng thái thành công và hủy với cùng một URL. ### Chuyển hướng tới trang thanh toán[​](#chuyển-hướng-tới-trang-thanh-toán "Đường dẫn trực tiếp đến Chuyển hướng tới trang thanh toán") Sau khi tạo link thanh toán thành công, chuyển hướng khách hàng tới trang thanh toán trả về trong phản hồi. ## Xây dựng giao diện[​](#xây-dựng-giao-diện "Đường dẫn trực tiếp đến Xây dựng giao diện") ### Thêm trang thông tin đơn hàng[​](#thêm-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm trang thông tin đơn hàng") Tạo một trang hiển thị thông tin đơn hàng, cho phép khách hàng xem và sửa thông tin đơn hàng trước khi nhấn thanh toán. Đơn hàng sẽ không thể chỉnh sửa sau khi nhấn thanh toán trừ khi tạo link thanh toán mới. ### Thêm nút bấm thanh toán cho trang thông tin đơn hàng[​](#thêm-nút-bấm-thanh-toán-cho-trang-thông-tin-đơn-hàng "Đường dẫn trực tiếp đến Thêm nút bấm thanh toán cho trang thông tin đơn hàng") Thêm một nút bấm thanh toán đơn hàng trên trang xem thông tin đơn hàng. Khi khách hàng nhấn nút này sẽ được chuyển hướng đến trang thanh toán của payOS để tiến hàng thanh toán đơn hàng. ## Chạy thử[​](#chạy-thử "Đường dẫn trực tiếp đến Chạy thử") Thêm `"proxy": "http://localhost:3030"` vào file `package.json`. Chạy server của bạn và truy cập vào [`http://localhost:3000`](http://localhost:3000) để bắt đầu tạo link thanh toán. ``` # server side java -cp .\target\payos-payment-1.0-SNAPSHOT-jar-with-dependencies.jar vn.payos.sample.Server # client side npm start ``` ### Mã nguồn[​](#mã-nguồn-11 "Đường dẫn trực tiếp đến Mã nguồn") * Server.java * pom.xml * App.js /Server.java ``` package vn.payos.sample; import static spark.Spark.port; import static spark.Spark.post; import static spark.Spark.staticFiles; import java.nio.file.Paths; import vn.payos.PayOS; import vn.payos.model.v2.paymentRequests.CreatePaymentLinkRequest; import vn.payos.model.v2.paymentRequests.CreatePaymentLinkResponse; public class Server { public static void main(String[] args) { port(3030); String clientId = "YOUR_CLIENT_ID"; String apiKey = "YOUR_API_KEY"; String checksumKey = "YOUR_CHECKSUM_KEY"; final PayOS payOS = new PayOS(clientId, apiKey, checksumKey); staticFiles.externalLocation(Paths.get("public").toAbsolutePath().toString()); post( "/create-payment-link", (request, response) -> { String domain = "http://localhost:3000"; Long orderCode = System.currentTimeMillis() / 1000; CreatePaymentLinkRequest paymentData = CreatePaymentLinkRequest.builder() .orderCode(orderCode) .amount(2000) .description("Thanh toán đơn hàng") .returnUrl(domain + "/success.html") .cancelUrl(domain + "/cancel.html") .build(); CreatePaymentLinkResponse result = payOS.paymentRequests().create(paymentData); response.redirect(result.getCheckoutUrl(), 303); return ""; }); } } ``` /pom.xml ``` 4.0.0 vn.payos.sample payos-payment 1.0-SNAPSHOT sample http://www.example.com UTF-8 1.8 1.8 com.sparkjava spark-core 2.9.4 vn.payos payos-java 1.0.1 maven-clean-plugin 3.1.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.8.0 maven-surefire-plugin 2.22.1 maven-jar-plugin 3.0.2 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 maven-site-plugin 3.7.1 maven-project-info-reports-plugin 3.0.0 maven-assembly-plugin package single jar-with-dependencies vn.payos.sample.Server ``` /src/App.js ``` import React, { useState, useEffect } from "react"; import "./App.css"; const ProductDisplay = () => (

Tên sản phẩm: Mì tôm Hảo Hảo ly

Giá tiền: 2000 VNĐ

Số lượng: 1

); const Message = ({ message }) => (

{message}

); export default function App() { const [message, setMessage] = useState(""); useEffect(() => { // Check to see if this is a redirect back from Checkout const query = new URLSearchParams(window.location.search); if (query.get("success")) { setMessage("Thanh toán thành công. Cảm ơn bạn đã sử dụng payOS!"); } if (query.get("canceled")) { setMessage( "Thanh toán thất bại. Nếu có bất kỳ câu hỏi nào hãy gửi email tới support@payos.vn." ); } }, []); return message ? ( ) : ( ); } ``` --- # Chương Trình Đối Tác Tích Hợp payOS Developer là đối tác quan trọng nhất đồng hành cùng payOS để truyền bá giải pháp cổng thanh toán! Đăng ký ngay Vào đường dẫn sau để đăng ký chương trình: ### Giới Thiệu Chương Trình[​](#giới-thiệu-chương-trình "Đường dẫn trực tiếp đến Giới Thiệu Chương Trình") Tri ân sự đồng hành dành cho các lập trình viên, nhà phát triển Web/App trong hành trình hoàn thành sứ mệnh giúp 1 triệu+ Website sở hữu cổng thanh toán của payOS. "Đối tác tích hợp" là chương trình tiếp thị liên kết (Affiliate Marketing) dành cho các lập trình viên, nhà phát triển khi tích hợp cổng thanh toán payOS vào Web/App của doanh nghiệp/khách hàng, qua đó giúp hàng triệu Website tiếp cận giải pháp cổng thanh toán không qua trung gian. ### Giải Pháp Thay Thế Cổng Thanh Toán Truyền Thống[​](#giải-pháp-thay-thế-cổng-thanh-toán-truyền-thống "Đường dẫn trực tiếp đến Giải Pháp Thay Thế Cổng Thanh Toán Truyền Thống") Sự tăng trưởng nhanh chóng của payOS hứa hẹn thay đổi cuộc chơi của các cổng thanh toán truyền thống tại Việt Nam với hàng trăm lượt đăng ký tích hợp mỗi ngày. Chúng tôi tin rằng, sự tham gia của các bạn sẽ góp phần quan trọng trong hành trình hoàn thành sứ mệnh giúp 1 triệu+ Website sở hữu cổng thanh toán và đáp ứng nhu cầu hỗ trợ tích hợp payOS ngày càng tăng cao của khách hàng. ### Chiết Khấu 100đ/Giao Dịch[​](#chiết-khấu-100đgiao-dịch "Đường dẫn trực tiếp đến Chiết Khấu 100đ/Giao Dịch") Mỗi Web/App tích hợp payOS có mã đối tác phát sinh giao dịch tính phí, nhà phát triển sẽ nhận được 100đ trên mỗi giao dịch và kéo dài trọn đời! ### Hỗ Trợ Kết Nối Khách Hàng[​](#hỗ-trợ-kết-nối-khách-hàng "Đường dẫn trực tiếp đến Hỗ Trợ Kết Nối Khách Hàng") Hàng trăm khách hàng mỗi ngày tại payOS đang chờ sự hỗ trợ tích hợp từ bạn! payOS sẽ vinh danh Top các nhà phát triển giúp bạn tiếp cận nhiều khách hàng hơn. ### Ưu Đãi Dành Cho Khách Hàng[​](#ưu-đãi-dành-cho-khách-hàng "Đường dẫn trực tiếp đến Ưu Đãi Dành Cho Khách Hàng") Tặng ngay chương trình ưu đãi cho khách hàng được giới thiệu từ Đối tác tích hợp. ## Ghi Nhận Doanh Thu Chỉ Với 1 Dòng Code[​](#ghi-nhận-doanh-thu-chỉ-với-1-dòng-code "Đường dẫn trực tiếp đến Ghi Nhận Doanh Thu Chỉ Với 1 Dòng Code") ### Sử dụng thư viện của PayOS[​](#sử-dụng-thư-viện-của-payos "Đường dẫn trực tiếp đến Sử dụng thư viện của PayOS") /lib-integrate.js ``` const PayOS = require('@payos/node'); const payos = new PayOS({ clientId: 'YOUR_PAYOS_CLIENT_ID', apiKey: 'YOUR_PAYOS_API_KEY', checksumKey: 'YOUR_PAYOS_CHECKSUM_KEY', partnerCode: 'PARTNER_CODE', }); ``` ### Thêm Header vào Request khi tạo Payment Link[​](#thêm-header-vào-request-khi-tạo-payment-link "Đường dẫn trực tiếp đến Thêm Header vào Request khi tạo Payment Link") /req-integrate.js ``` const headers = { "x-client-id": clientId, "x-api-key": apiKey, "Content-Type": "application/json", }; if (partnerCode) { headers["x-partner-code"] = partnerCode; } ``` --- # Downloads payOS cung cấp các tài liệu cần thiết để quý khách có thể có đầy đủ thông tin nhất về Hệ điều hành thanh toán payOS. Trong trường hợp cần tìm hiểu thêm Quý khách vui lòng liên hệ theo địa chỉ email: để được hỗ trợ. ## Tích hợp payOS vào các nền tảng thương mại điện tử[​](#tích-hợp-payos-vào-các-nền-tảng-thương-mại-điện-tử "Đường dẫn trực ti��ếp đến Tích hợp payOS vào các nền tảng thương mại điện tử") | STT | Nền tảng | Download | | --- | ----------- | ------------------------------------------------ | | 1 | WooCommerce | [Download](https://wordpress.org/plugins/payos/) | --- # Return URL Sau khi thực hiện thanh toán trình duyệt sẽ điều hướng về trang mà người dùng đã khai báo ở `returnUrl` đã được khai báo trong [API tạo link thanh toán](/docs/api/.md). Ngược lại, nếu người dùng hủy thanh toán, trình duyệt sẽ điều hướng về `cancelUrl`. `returnUrl` và `cancelUrl` sẽ được gắn các query params chứa thông tin thanh toán phục vụ cho việc xử lý ở phía giao diện người dùng. ### Ví dụ về Return URL:[​](#ví-dụ-về-return-url "Đường dẫn trực tiếp đến Ví dụ về Return URL:") thông tin `https://your-website.com/return-url/?code=00&id=2e4acf1083304877bf1a8c108b30cccd&cancel=true&status=CANCELLED&orderCode=803347` ### Mô tả dữ liệu trả về qua Query Params:[​](#mô-tả-dữ-liệu-trả-về-qua-query-params "Đường dẫn trực tiếp đến Mô tả dữ liệu trả về qua Query Params:") | Tên | Giá trị | Mô tả | Tập giá trị | | --------- | -------------------------------- | --------------------- | --------------------------------------------------------------------------------------------------------------- | | code | 00 | Mã lỗi | - 00 - Thành công
- 01 - Invalid Params | | id | 2e4acf1083304877bf1a8c108b30cccd | Payment Link Id | string | | cancel | true | Trạng thái hủy | - true - Đã hủy thanh toán
- false - Đã thanh toán hoặc chờ thanh toán | | status | CANCELLED | Trạng thái thanh toán | - PAID - Đã thanh toán
- PENDING - Chờ thanh toán
- PROCESSING - Đang xử lý
- CANCELLED - Đã hủy | | orderCode | 803347 | Mã đơn hàng | number | --- # Webhook thông tin thanh toán [![payOS Logo](https://payos.vn/wp-content/uploads/2025/06/Casso-payOSLogo-1.svg)](https://payos.vn) * Webhook thanh toán * EventWebhook nhận thông tin thanh toán [API docs by Redocly](https://redocly.com/redoc/) # payOS Payment Webhook API (latest) payOS support : URL: [Terms of Service](https://payos.vn/thoa-thuan-su-dung/) Webhook API cho hệ thống thanh toán payOS. ### Trước khi bắt đầu * Bạn đã tạo một tài khoản . * Bạn đã xác thực một doanh nghiệp hoặc cá nhân trên , [xem hướng dẫn](https://payos.vn/docs/huong-dan-su-dung/xac-thuc-to-chuc/) * Bạn đã tạo một kênh thanh toán, [xem hướng dẫn](https://payos.vn/docs/huong-dan-su-dung/tao-kenh-thanh-toan/). ### Môi trường * Production: Đăng ký chương trình đối tác tích hợp payOS [Tại đây](https://payos.vn/chuong-trinh-doi-tac-tich-hop/) ## [](#tag/payment-webhook)Webhook thanh toán Webhook thanh toán ## [](#tag/payment-webhook/operation/payment-webhook)Webhook nhận thông tin thanh toán Webhook Webhook của cửa hàng dùng để nhận dữ liệu thanh toán từ payOS, [Dữ liệu mẫu](https://payos.vn/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature/) ##### Request Body schema: application/json | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | coderequired | stringMã lỗi | | descrequired | stringThông tin lỗi | | successrequired | boolean | | datarequired | object | | signaturerequired | stringChữ kí để kiểm tra thông tin, [chi tiết dữ liệu mẫu](https://payos.vn/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature/) | ### Responses **200** Phản hồi trạng thái mã 2XX để xác nhận webhook gửi thành công ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "code": "00", "desc": "success", "success": true, "data": { "orderCode": 123, "amount": 3000, "description": "VQRIO123", "accountNumber": "12345678", "reference": "TF230204212323", "transactionDateTime": "2023-02-04 18:25:00", "currency": "VND", "paymentLinkId": "124c33293c43417ab7879e14c8d9eb18", "code": "00", "desc": "Thành công", "counterAccountBankId": "", "counterAccountBankName": "", "counterAccountName": "", "counterAccountNumber": "", "virtualAccountName": "", "virtualAccountNumber": "" }, "signature": "8d8640d802576397a1ce45ebda7f835055768ac7ad2e0bfb77f9b8f12cca4c7f" }` --- # Kết nối tài khoản ví điện tử Bảo kim Hướng dẫn kết nối Ví điện tử Bảo kim vào payOS. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn đã có tài khoản trên chưa? [Hướng dẫn tạo tài khoản my.payos.vn](/docs/huong-dan-su-dung/tao-tai-khoan-payos.md). * Bạn đã xác thực một tổ chức trên payOS chưa? [Hướng dẫn xác thực tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md). * Bạn đã có tài khoản Ví Bảo Kim chưa? [Hướng dẫn tạo tài khoản Ví Bảo Kim](https://payos.vn/huong-dan-tao-tai-khoan-bao-kim-bao-kim-e-wallet/). ### Kết nỗi tài khoản[​](#kết-nỗi-tài-khoản "Đường dẫn trực tiếp đến Kết nỗi tài khoản") * Đăng nhập vào tài khoản payOS, tại trang **Ngân hàng**, chọn **Thêm tài khoản** => **Tài khoản chi** và chọn thêm **Ví Bảo Kim**. ![payOS select Baokim account page](/docs/assets/images/select-link-baokim-9fbacca6e7cb7cf1438cd828d39a10fb.png) thông tin Vui lòng chọn loại tài khoản Cá nhân hoặc Doanh nghiệp tương ứng với tài khoản payOS đã xác thực. Nếu là Hộ kinh doanh, hãy chọn và liên kết tài khoản Cá nhân. Lưu ý Chỉ liên kết tài khoản Ví Bảo kim có trùng tên với tổ chức đã xác thực trên payOS * Tại giao diện liên kết ví, ấn **Tiếp tục** ![payOS select Baokim account page](/docs/assets/images/baokim-cas-intro-517fcbce0857d0cc1f8b2078c9fbbb81.png) * Thực hiện kết nối tài khoản **Ví Bảo Kim** thông qua Cas (Có thể quét mã QR trên app để thao tác hoặc bấm vào "Kết nối trước - Cas sau") thông tin Tên tài khoản là tên tài khoản **Ví Bảo Kim**, **có dấu** ![payOS select Baokim account page](/docs/assets/images/fill-info-d306c9cc2a057a640e884fd25e203c50.png) * Ấn **Liên kết**, nhập OTP được gửi về SĐT đăng ký ví * Màn hình trạng thái hiển thị liên kết thành công thông tin Đối với tài khoản **Doanh nghiệp**, sau khi liên kết thành công với payOS, vui lòng đợi **1-2 ngày** để **Ví Bảo Kim** tiến hành xác thực tài khoản. --- # Nạp số dư ví Bảo Kim ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn cần có tài khoản đăng nhập vào hệ thống payOS. * Tổ chức của bạn đã được xác thực. Nếu chưa được xác thực, vui lòng tham khảo Mục [Xác thực Tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md) * Bạn đã liên kết ít nhất một tài khoản ngân hàng vào payOS. Nếu chưa liên kết tài khoản, vui lòng tham khảo phần [Kết nối tài khoản ngân hàng](/docs/huong-dan-su-dung/ket-noi-tai-khoan-ngan-hang.md) Để thực hiện các giao dịch chi tiền qua payOS, bạn cần **nạp tiền vào tài khoản nguồn chi**. Đây là **nguồn tiền trung gian** được sử dụng khi bạn tạo lệnh chi hoặc thanh toán cho đối tác, nhân viên, hoặc khách hàng. Khi một **lệnh chi** được khởi tạo và phê duyệt, **số tiền tương ứng sẽ được trích trực tiếp từ ví này** để thực hiện giao dịch. Việc duy trì **số dư khả dụng** trong ví giúp đảm bảo mọi giao dịch được xử lý **nhanh chóng, liên tục và không bị gián đoạn**. **Bước 1:** Chọn **Ngân hàng**, tại **Tài khoản chi** chọn **Bảo Kim**. ![Example banner](/docs/assets/images/step1-a50f176397ba83993f34ef18b155465b.png) **Bước 2:** Tại giao diện chi tiết tài khoản, chọn **Nạp số dư**. ![Example banner](/docs/assets/images/step2-7d43f7527e72cd6009ca92d282301f53.png) **Bước 3:** Tại giao diện nạp tiền vào tài khoản, chọn số tiền phù hợp với nhu cầu sử dụng, nhấn **Nạp tiền**. Lúc này sẽ hiện mã QR nạp số dư vào ví. ![Example banner](/docs/assets/images/step3_1-95d4a22d72bca41fb7f0ab4d725cfcbc.png) Nạp số dư vài Ví Bảo Kim sau khi thành công cần đợi từ 2-5 phút để đối tác cộng số dư ví, Khách hàng có thể chủ động bấm đồng bộ số dư ví. ![Example banner](/docs/assets/images/step3_2-58c182f6c64dd064942f4ee8cd714b3e.png) --- # Tạo kênh chuyển tiền ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn cần có tài khoản đăng nhập vào hệ thống payOS. * Tổ chức của bạn đã được xác thực. Nếu chưa được xác thực, vui lòng tham khảo Mục [Xác thực Tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md) * Bạn đã liên kết ít nhất một tài khoản ngân hàng vào payOS. Nếu chưa liên kết tài khoản, vui lòng tham khảo phần [Kết nối tài khoản ngân hàng](/docs/huong-dan-su-dung/ket-noi-tai-khoan-ngan-hang.md) Sau khi xác thực Tổ chức thành công, bạn cần thực hiện theo các bước sau để tạo một kênh chuyển tiền mới. **Bước 1:** Tại menu **Kênh chuyển tiền**, nhấn nút **Thêm kênh chuyển tiền**. ![Example banner](/docs/assets/images/payout-api-key-empty-33fc30e632792be33f841838cead7415.png) **Bước 2:** Điền thông tin **Tên của kênh**(tùy chọn), chọn **Ví/ngân hàng tương ứng**. Sau khi đã nhập đầy đủ thông tin, nhấn nút **Tạo kênh chuyển tiền**. ![Example banner](/docs/assets/images/fill-info-bf75f3048dc5f5de77f35927867c5f2b.png) ![Example banner](/docs/assets/images/create-success-f438b9e3c0da6d680a273f1bf05a441e.png) **Bước 3:** Sau khi tạo thành công kênh chuyển tiền, ấn chọn kênh để xem các thông tin chi tiết của kênh. ![Example banner](/docs/assets/images/detail-info-21b00fb7ded13277db485bb7bdc37ccd.png) **Bước 4:** Thêm địa chỉ IP cho kênh chuyển tiền, tại mục **Quản lý IP cho kênh**, ấn **Thêm IP**, điền các thông tin như **Địa chỉ IP**, **Mô tả**(tùy chọn) sau đó ấn **Thêm IP**. thông tin Có thể thêm nhiều địa chỉ IP cùng một lúc ![Example banner](/docs/assets/images/ip-manager-2151c3c9528721e8ae70f2ecb58ad0a8.png) ![Example banner](/docs/assets/images/fill-ip-info-f3059ee94decafb45a3cff3ecbd45e73.png) --- # Thanh toán gói dịch vụ chi payOS ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn cần có tài khoản đăng nhập vào hệ thống payOS. * Tổ chức của bạn đã được xác thực. Nếu chưa được xác thực, vui lòng tham khảo Mục [Xác thực Tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md) * Bạn đã liên kết ít nhất một tài khoản ngân hàng vào payOS. Nếu chưa liên kết tài khoản, vui lòng tham khảo phần [Kết nối tài khoản ngân hàng](/docs/huong-dan-su-dung/ket-noi-tai-khoan-ngan-hang.md) Nếu đây là lần đầu bạn thanh toán qua hệ thống, đừng lo — hướng dẫn dưới đây sẽ giúp bạn nắm rõ từng bước để hoàn tất giao dịch một cách dễ dàng, an toàn và chỉ mất vài phút. Mỗi gói dịch vụ sẽ có nhiều sự lựa chọn về số lượng giao dịch, với các mức giá khác nhau dựa trên thông số này ở mỗi gói. **Bước 1:** Tại menu **Thiết lập**, chọn **Sử dụng**, chọn tab **Chi** và chọn **Nạp tiền**. ![Example banner](/docs/assets/images/step1-6468829542b7d861bfcf00fabe560049.png) **Bước 2:** Sau khi lựa chọn gói, đối với trường hợp cần hóa đơn VAT cho khoản thanh toán này thì bạn nhập các thông itn xuất hóa đơn. Bấm **Thanh toán** sẽ hiện mã QR thanh toán. thông tin Khi bắt đầu tạo tài khoản và sử dụng tính năng kênh Chi payOS, bạn sẽ có credit 100K dùng thử miễn phí Sau khi hoàn tất chuyển khoản, giao diện thông báo thanh toán thành công, hệ thống payOS sẽ tự động nâng cấp gói trong vòng vài giây và thông báo thanh toán thành công sẽ được gửi tói email. ghi chú Trong trường hợp gói dịch vụ chưa được nâng cấp sau 10 phút, hãy liên hệ với hoặc hotline 19008144 để được hỗ trợ. --- # Kết nối tài khoản ngân hàng ACB Hướng dẫn kết nối tài khoản ngân hàng ACB vào payOS. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn đã có tài khoản trên chưa? [Hướng dẫn tạo tài khoản my.payos.vn](/docs/huong-dan-su-dung/tao-tai-khoan-payos.md). * Bạn đã xác thực một tổ chức trên payOS chưa? [Hướng dẫn xác thực tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md). * Bạn đã có tài khoản ngân hàng ACB chưa? [Hướng dẫn tạo tài khoản ngân hàng ACB](https://payos.vn/huong-dan-tao-tai-khoan-acb/). ### Kết nối tài khoản định danh ACB cá nhân/hộ kinh doanh[​](#kết-nối-tài-khoản-định-danh-acb-cá-nhânhộ-kinh-doanh "Đường dẫn trực tiếp đến Kết nối tài khoản định danh ACB cá nhân/hộ kinh doanh") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng ACB ![payOS select ACB bank account page](/docs/assets/images/select-link-acb-0387ffb3d65497d02d141879f39f08f2.png) * Chọn "Tiếp tục", bạn có thể quét QR bằng app Cas ID hoặc chọn "Kết nối trước - Cas sau" để nhập thông tin kết nối ngân hàng. Nhập thông tin STK và Tên chủ tài khoản, chọn **Kiểm tra** để hệ thống kiểm tra thông tin. ghi chú Chỉ thêm được tài khoản ngân hàng trùng tên với Tổ chức đã xác thực tài khoản ![payOS fill ACB phone number](/docs/assets/images/fill-phone-number-0bebba355e43d886faba34496eb1f4a1.png) * Nhập **Số điện thoại** tương ứng và chọn "Tôi xác nhận đã đọc, hiểu rõ và đồng ý bản **Điều khoản và điều kiện** sử dụng dịch vụ." => Chọn **Liên kết** ![payOS fill ACB phone number](/docs/assets/images/done-fill-phone-number-085c9a4911e284b29a4b2809f9caafd1.png) * Sau khi chọn liên kết, ACB sẽ gửi OTP về thông qua một trong các hình thức sau: OTP qua SMS hoặc gửi OTP về ứng dụng ACB ONE. thông tin Trường hợp không nhận được SMS, vui lòng kiểm tra app ACB ONE: * Bước 1: Đăng nhập app ACB ONE * Bước 2: Vào **Hồ sơ** => chọn ACB Safekey để kích hoạt => Chọn GET OTP để lấy mã OTP ![ACB Safekey](/docs/assets/images/acb-safekey-screen-bfc58913fe01d12dbda12fe2df530a4a.png)![ACB Get OTP](/docs/assets/images/acb-get-otp-screen-7a8747e0859423453210191d403150c1.png) ### Kết nối tài khoản định danh ACB Doanh nghiệp[​](#kết-nối-tài-khoản-định-danh-acb-doanh-nghiệp "Đường dẫn trực tiếp đến Kết nối tài khoản định danh ACB Doanh nghiệp") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng ACB ![payOS select ACB business bank account page](/docs/assets/images/select-link-acb-business-feeb9e9327724e55b9dd24e47628135d.png) * Chọn "Tiếp tục", bạn có thể quét QR bằng app Cas ID hoặc chọn "Kết nối trước - Cas sau" để nhập thông tin kết nối ngân hàng. Nhập thông tin STK và Tên chủ tài khoản, chọn **Kiểm tra** để hệ thống kiểm tra thông tin. ghi chú Chỉ thêm được tài khoản ngân hàng trùng tên với Tổ chức đã xác thực tài khoản ![payOS fill ACB business phone number](/docs/assets/images/fill-phone-number-business-4ac3cdd0a6196a6ad3ce574a7af5ed30.png) * Nhập **Số điện thoại** tương ứng và chọn "Tôi xác nhận đã đọc, hiểu rõ và đồng ý bản **Điều khoản và điều kiện** sử dụng dịch vụ." => Chọn **Liên kết** ![payOS fill ACB business phone number](/docs/assets/images/done-fill-phone-number-business-e56e3846e54556f77a3bd9bafc1e4af5.png) * Sau khi chọn liên kết, ACB sẽ gửi OTP về thông qua một trong các hình thức sau: OTP qua SMS hoặc gửi OTP về ứng dụng ACB ONE BIZ. thông tin Trường hợp không nhận được SMS, vui lòng kiểm tra app ACB ONE BIZ: * Bước 1: Đăng nhập app ACB ONE BIZ * Bước 2: Vào **Hồ sơ** => chọn ACB Safekey để kích hoạt => Chọn GET OTP để lấy mã OTP ![ACB Safekey](/docs/assets/images/acb-safekey-screen-bfc58913fe01d12dbda12fe2df530a4a.png)![ACB Get OTP](/docs/assets/images/acb-get-otp-screen-7a8747e0859423453210191d403150c1.png) ghi chú Trên đây là hình ảnh minh họa lấy từ app ACB ONE, Quý khách hàng Doanh nghiệp đăng nhập vào app ACB ONE BIZ và thao tác tương tự như hình trên. ### Tích hợp kênh thanh toán vừa tạo cho tài khoản định danh ACB vào các nền tảng[​](#tích-hợp-kênh-thanh-toán-vừa-tạo-cho-tài-khoản-định-danh-acb-vào-các-nền-tảng "Đường dẫn trực tiếp đến Tích hợp kênh thanh toán vừa tạo cho tài khoản định danh ACB vào các nền tảng") * [Hướng dẫn tích hợp Sapo](/docs/tich-hop-webhook/sapo.md) * [Hướng dẫn tích hợp WooCommerce](/docs/tich-hop-webhook/woocommerce.md) * [Hướng dẫn tích hợp nhanh (low code)](/docs/checkout/quick-start-payos-hosted-page.md) --- # Kết nối tài khoản ngân hàng BIDV Hướng dẫn kết nối tài khoản ngân hàng BIDV vào payOS. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn đã có tài khoản trên chưa? [Hướng dẫn tạo tài khoản my.payos.vn](/docs/huong-dan-su-dung/tao-tai-khoan-payos.md). * Bạn đã xác thực một tổ chức trên payOS chưa? [Hướng dẫn xác thực tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md). * Bạn đã có tài khoản ngân hàng BIDV chưa? ### Kết nối tài khoản định danh BIDV Cá nhân[​](#kết-nối-tài-khoản-định-danh-bidv-cá-nhân "Đường dẫn trực tiếp đến Kết nối tài khoản định danh BIDV Cá nhân") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng BIDV/VietQR Pro ![payOS select BIDV bank account page](/docs/assets/images/select-link-bidv-8c99b1b39fc369376f4b3c5cb37c3957.png) * Thực hiện kết nối tài khoản ngân hàng thông qua Cas (Có thể quét QR tải app để thao tác hoặc bấm vào “Kết nối trước - Cas sau”) * Điền thông tin xác thực tài khoản và tick xác nhận đã đọc và đồng ý “điều khoản và điều kiện” để đăng ký tài khoản định danh BIDV ![payOS fill BIDV account number info](/docs/assets/images/fill-account-number-info-6616c652337a4d585cb5a3de0a7b810d.png) * Nhấn Liên kết để hoàn thành liên kết tài khoản ngân hàng BIDV vào payOS ### Kết nối tài khoản định danh BIDV Doanh nghiệp[​](#kết-nối-tài-khoản-định-danh-bidv-doanh-nghiệp "Đường dẫn trực tiếp đến Kết nối tài khoản định danh BIDV Doanh nghiệp") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng BIDV/VA BILLING ![payOS link BIDV account success](/docs/assets/images/select-link-bidv-business-592d293e4a0fb95cada8ad6fa0eda8c5.png) * Nếu chưa có mã VA BILLING của BIDV cần nhấn vào "Đăng kí Mã VA BILLING" để điền form đăng kí ![payOS register VA BILLING](/docs/assets/images/bidv-va-billing-form-86c92412b35b30fd7b11416191fb1f25.png) * Sau khi có mã VA BILLING, ấn "Tiếp theo" để tiến hành liên kết tài khoản ngân hàng BIDV vào payOS ![payOS register VA BILLING](/docs/assets/images/fill-account-va-billing-fc0097eaf6be34f355511bee5e29e935.png) thông tin Số điện thoại liên kết phải trùng với thông tin đăng kí đã điền trong Form Approval ### Tích hợp kênh thanh toán cho tài khoản định danh BIDV vào các nền tảng[​](#tích-hợp-kênh-thanh-toán-cho-tài-khoản-định-danh-bidv-vào-các-nền-tảng "Đường dẫn trực tiếp đến Tích hợp kênh thanh toán cho tài khoản �định danh BIDV vào các nền tảng") * [Hướng dẫn tích hợp Sapo](/docs/tich-hop-webhook/sapo.md) * [Hướng dẫn tích hợp WooCommerce](/docs/tich-hop-webhook/woocommerce.md) * [Hướng dẫn tích hợp nhanh (low code)](/docs/checkout/quick-start-payos-hosted-page.md) --- # Kết nối tài khoản ngân hàng KienlongBank Hướng dẫn kết nối tài khoản ngân hàng KienlongBank vào payOS. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn đã có tài khoản trên chưa? [Hướng dẫn tạo tài khoản my.payos.vn](/docs/huong-dan-su-dung/tao-tai-khoan-payos.md). * Bạn đã xác thực một tổ chức trên payOS chưa? [Hướng dẫn xác thực tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md). * Bạn đã có tài khoản ngân hàng KienlongBank chưa? ### Kết nối tài khoản định danh KienlongBank Cá nhân[​](#kết-nối-tài-khoản-định-danh-kienlongbank-cá-nhân "Đường dẫn trực tiếp đến Kết nối tài khoản định danh KienlongBank Cá nhân") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng KienlongBank/VietQR Pro ![payOS select KienlongBank bank account page](/docs/assets/images/select-link-klb-2edbbf21618a719072819f32cb264552.png) * Thực hiện kết nối tài khoản ngân hàng thông qua Cas (Có thể quét QR tải app để thao tác hoặc bấm vào “Kết nối trước - Cas sau”) * Điền thông tin xác thực tài khoản và tick xác nhận đã đọc và đồng ý “điều khoản và điều kiện” để đăng ký tài khoản định danh KienlongBank ![payOS fill KienlongBank account number info](/docs/assets/images/fill-account-number-info-f2ad5c9b7c4a53aa86f9a9651cea75b4.png) * Nhấn Liên kết để hoàn thành liên kết tài khoản ngân hàng KienlongBank vào payOS ### Kết nối tài khoản định danh KienlongBank Doanh nghiệp[​](#kết-nối-tài-khoản-định-danh-kienlongbank-doanh-nghiệp "Đường dẫn trực tiếp đến Kết nối tài khoản định danh KienlongBank Doanh nghiệp") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng KienlongBank/VietQR Pro ![payOS link KienlongBank account success](/docs/assets/images/select-link-business-982424dc16704f892566f4b348006748.png) * Thực hiện kết nối tài khoản ngân hàng thông qua Cas (Có thể quét QR tải app để thao tác hoặc bấm vào “Kết nối trước - Cas sau”) * Điền thông tin xác thực tài khoản và tick xác nhận đã đọc và đồng ý “điều khoản và điều kiện” để đăng ký tài khoản định danh KienlongBank ![payOS link KienlongBank via Cas](/docs/assets/images/fill-account-number-business-119d926d474e924b94d62363b61ef2f5.png) ### Tích hợp kênh thanh toán cho tài khoản định danh KienlongBank vào các nền tảng[​](#tích-hợp-kênh-thanh-toán-cho-tài-khoản-định-danh-kienlongbank-vào-các-nền-tảng "Đường dẫn trực tiếp đến Tích hợp kênh thanh toán cho tài khoản định danh KienlongBank vào các nền tảng") * [Hướng dẫn tích hợp Sapo](/docs/tich-hop-webhook/sapo.md) * [Hướng dẫn tích hợp WooCommerce](/docs/tich-hop-webhook/woocommerce.md) * [Hướng dẫn tích hợp nhanh (low code)](/docs/checkout/quick-start-payos-hosted-page.md) --- # Kết nối tài khoản ngân hàng MB Hướng dẫn kết nối tài khoản ngân hàng MB vào payOS. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn đã có tài khoản trên chưa? [Hướng dẫn tạo tài khoản my.payos.vn](/docs/huong-dan-su-dung/tao-tai-khoan-payos.md). * Bạn đã xác thực một tổ chức trên payOS chưa? [Hướng dẫn xác thực tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md). * Bạn đã có tài khoản ngân hàng MB chưa? ### Kết nối tài khoản định danh MB Cá nhân[​](#kết-nối-tài-khoản-định-danh-mb-cá-nhân "Đường dẫn trực tiếp đến Kết nối tài khoản định danh MB Cá nhân") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng MB/VietQR Pro ![payOS select MB bank account page](/docs/assets/images/select-link-mb-6c4cf794ecdf806a1d7cd1a267038adb.png) * Thực hiện kết nối tài khoản ngân hàng thông qua Cas (Có thể quét QR tải app để thao tác hoặc bấm vào “Kết nối trước - Cas sau”) * Điền thông tin xác thực tài khoản và tick xác nhận đã đọc và đồng ý “điều khoản và điều kiện” để đăng ký tài khoản định danh MB ![payOS link MB via Cas](/docs/assets/images/fill-account-number-business-e5a08dbc283fda45c0975baca138bd23.png) * Nhấn Liên kết để hoàn thành liên kết tài khoản ngân hàng MB vào payOS thông tin Khách hàng có thể liên kết tài khoản ngân hàng MB/Open API để làm tài khoản ngân hàng dự phòng, xác nhận đơn dựa vào nội dung chuyển khoản và số tiền. ### Kết nối tài khoản định danh MB Doanh nghiệp[​](#kết-nối-tài-khoản-định-danh-mb-doanh-nghiệp "Đường dẫn trực tiếp đến Kết nối tài khoản định danh MB Doanh nghiệp") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng MB/VietQR Pro ![payOS link MB account success](/docs/assets/images/select-link-business-4fc8552112f1e4aec7101763eb290612.png) * Thực hiện kết nối tài khoản ngân hàng thông qua Cas (Có thể quét QR tải app để thao tác hoặc bấm vào “Kết nối trước - Cas sau”) * Điền thông tin xác thực tài khoản và tick xác nhận đã đọc và đồng ý “điều khoản và điều kiện” để đăng ký tài khoản định danh MB ![payOS link MB via Cas](/docs/assets/images/fill-account-number-business-e5a08dbc283fda45c0975baca138bd23.png) ### Tích hợp kênh thanh toán cho tài khoản định danh MB vào các nền tảng[​](#tích-hợp-kênh-thanh-toán-cho-tài-khoản-định-danh-mb-vào-các-nền-tảng "Đường dẫn trực tiếp đến Tích hợp kênh thanh toán cho tài khoản định danh MB vào các nền tảng") * [Hướng dẫn tích hợp Sapo](/docs/tich-hop-webhook/sapo.md) * [Hướng dẫn tích hợp WooCommerce](/docs/tich-hop-webhook/woocommerce.md) * [Hướng dẫn tích hợp nhanh (low code)](/docs/checkout/quick-start-payos-hosted-page.md) --- # Kết nối tài khoản ngân hàng MSB Hướng dẫn kết nối tài khoản ngân hàng MSB vào payOS. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn đã có tài khoản trên chưa? [Hướng dẫn tạo tài khoản my.payos.vn](/docs/huong-dan-su-dung/tao-tai-khoan-payos.md). * Bạn đã xác thực một tổ chức trên payOS chưa? [Hướng dẫn xác thực tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md). * Bạn đã có tài khoản ngân hàng MSB chưa? ### Kết nối tài khoản định danh MSB Cá nhân[​](#kết-nối-tài-khoản-định-danh-msb-cá-nhân "Đường dẫn trực tiếp đến Kết nối tài khoản định danh MSB Cá nhân") * Mở tài khoản MSB mBank: Tải app **MSB mBank (Cá nhân)** trên App Store hoặc CH Play, sau đó làm theo hướng dẫn để mở tài khoản ![MSB mBank create account](/docs/assets/images/create-account-d7cda54b8adf58330113911f5dbbd818.png) thông tin Tại mục **Mã giới thiệu**, nhập mã **GQLINUE-16** để nhận ưu đãi miễn phí giao dịch tại payOS. ghi chú [Xem video hướng dẫn mở tài khoản MSB](https://www.youtube.com/watch?v=SwaE0HI-RNo) * Mở tài khoản MSB Merchant: Tải app **MSB Merchant** trên App Store hoặc CH Play, đăng ký tài khoản và liên kết với STK MSB vừa tạo. ![MSB mBank create merchant account 1](/docs/assets/images/create-merchant-account-1-d0cd90fad65e6a7efb66870cf195390c.png) ![MSB mBank create merchant account 2](/docs/assets/images/create-merchant-account-2-7227fdca8faf73649e80a47ef736f890.png) cảnh báo Tại mục **Mã giới thiệu**, nhập mã **LOAX** - bắt buộc để cấp quyền liên kết payOS. ghi chú [Xem video hướng dẫn kết nối MSB Merchant](https://www.youtube.com/watch?v=SwaE0HI-RNo\&t=128s) * Kết nối tài khoản MSB vào payOS * Đăng nhập vào tài khoản [payOS](https://my.payos.vn) và chọn thêm ngân hàng **MSB/VietQR Pro**. ![MSB mBank create merchant account 2](/docs/assets/images/payos-choose-account-type-2a375084bd777a583e21b347ccd75796.png) ![MSB mBank create merchant account 2](/docs/assets/images/payos-choose-msb-48c505c40d20f16ca0b6e408c6a26ffc.png) * Điền thông tin xác thực tài khoản (số tài khoản + tên tài khoản MSB) và nhấn **Kiểm tra**. ![MSB mBank create merchant account 2](/docs/assets/images/payos-fill-account-info-9fa8246e04824f2a822520caf1fba737.png) * Hoàn tất liên kết theo hướng dẫn trên màn hình. ### Tích hợp kênh thanh toán cho tài khoản định danh OCB vào các nền tảng[​](#tích-hợp-kênh-thanh-toán-cho-tài-khoản-định-danh-ocb-vào-các-nền-tảng "Đường dẫn trực tiếp đến Tích hợp kênh thanh toán cho tài khoản định danh OCB vào các nền tảng") * [Hướng dẫn tích hợp Sapo](/docs/tich-hop-webhook/sapo.md) * [Hướng dẫn tích hợp WooCommerce](/docs/tich-hop-webhook/woocommerce.md) * [Hướng dẫn tích hợp nhanh (low code)](/docs/checkout/quick-start-payos-hosted-page.md) --- # Kết nối tài khoản ngân hàng OCB Hướng dẫn kết nối tài khoản ngân hàng OCB vào payOS. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn đã có tài khoản trên chưa? [Hướng dẫn tạo tài khoản my.payos.vn](/docs/huong-dan-su-dung/tao-tai-khoan-payos.md). * Bạn đã xác thực một tổ chức trên payOS chưa? [Hướng dẫn xác thực tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md). * Bạn đã có tài khoản ngân hàng OCB chưa? ### Kết nối tài khoản định danh OCB Cá nhân[​](#kết-nối-tài-khoản-định-danh-ocb-cá-nhân "Đường dẫn trực tiếp đến Kết nối tài khoản định danh OCB Cá nhân") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng OCB/VietQR Pro ![payOS select OCB bank account page](/docs/assets/images/select-link-ocb-01c0504aecea58812312ac1e3cad9e8b.png) * Thực hiện kết nối tài khoản ngân hàng thông qua Cas (Có thể quét QR tải app để thao tác hoặc bấm vào “Kết nối trước - Cas sau”) * Điền thông tin xác thực tài khoản và tick xác nhận đã đọc và đồng ý “điều khoản và điều kiện” để đăng ký tài khoản định danh OCB ![payOS fill OCB phone number](/docs/assets/images/fill-phone-number-e4b657a5ea559d13a815227ea1d38c7a.png) * Nhấn Liên kết để hoàn thành liên kết tài khoản ngân hàng OCB vào payOS thông tin Sau khi ấn liên kết, OCB sẽ gửi OTP thông qua một trong các hình thức sau: SMS OTP, app OCB iOTP hoặc gửi OTP về ứng dụng OCB OMNI4.0. Với hình thức gửi OTP về ứng dụng OCB OMNI4.0: 1. Đăng nhập app OCB OMNI4.0, vào mục *Xem tất cả* 2. Ấn chọn *Cài đặt*, chọn mục *Phương thức xác thực*, sau đó chọn *Lấy OTP* ![payOS link OCB account success](/docs/assets/images/ocb-otp-1-392d7439c845505b0ab5d26edcfa3b79.png)![payOS link OCB account success](/docs/assets/images/ocb-otp-2-95700e6e0928a4cd54493d69ec42ca4e.png)![payOS link OCB account success](/docs/assets/images/ocb-otp-3-54b35c0c0041815f07752c86f84e3b12.png) ### Kết nối tài khoản định danh OCB Doanh nghiệp[​](#kết-nối-tài-khoản-định-danh-ocb-doanh-nghiệp "Đường dẫn trực tiếp đến Kết nối tài khoản định danh OCB Doanh nghiệp") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng OCB/VA BILLING ![payOS link OCB account success](/docs/assets/images/select-link-ocb-business-a396c49d15a7641225887f768014f262.png) * Nếu chưa có mã VA BILLING của OCB cần nhấn vào "Đăng kí Mã VA BILLING" để điền form đăng kí ![payOS register VA BILLING](/docs/assets/images/ocb-va-billing-form-6ef21e497b25f5ac6f7c51aae0b46c7c.png) * Sau khi có mã VA BILLING, ấn "Tiếp theo" để tiến hành liên kết tài khoản ngân hàng OCB vào payOS ![payOS register VA BILLING](/docs/assets/images/fill-account-va-billing-56e4e659145b069462472cae0f34b102.png) ### Tích hợp kênh thanh toán cho tài khoản định danh OCB vào các nền tảng[​](#tích-hợp-kênh-thanh-toán-cho-tài-khoản-định-danh-ocb-vào-các-nền-tảng "Đường dẫn trực tiếp đến Tích hợp kênh thanh toán cho tài khoản định danh OCB vào các nền tảng") * [Hướng dẫn tích hợp Sapo](/docs/tich-hop-webhook/sapo.md) * [Hướng dẫn tích hợp WooCommerce](/docs/tich-hop-webhook/woocommerce.md) * [Hướng dẫn tích hợp nhanh (low code)](/docs/checkout/quick-start-payos-hosted-page.md) --- # Kết nối tài khoản ngân hàng VPBank Hướng dẫn kết nối tài khoản ngân hàng VPBank NEOBiz vào payOS. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn đã có tài khoản trên chưa? [Hướng dẫn tạo tài khoản my.payos.vn](/docs/huong-dan-su-dung/tao-tai-khoan-payos.md). * Bạn đã xác thực một tổ chức trên payOS chưa? [Hướng dẫn xác thực tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md). * Bạn đã có tài khoản VPBank NEOBiz chưa? ### Kết nối tài khoản VPBank NEOBiz[​](#kết-nối-tài-khoản-vpbank-neobiz "Đường dẫn trực tiếp đến Kết nối tài khoản VPBank NEOBiz") * Đăng nhập vào tài khoản payOS và chọn thêm ngân hàng VPBank ![payOS link VPBank account success](/docs/assets/images/select-link-vpbank-business-77026588bb6f986c4b4cbd972e1bf342.png) * Nhập đầy đủ các trường thông tin bao gồm **Số tài khoản**, **Tên tài khoản** và **Đầu số tài khoản định danh** cần đăng ký (từ 1-5 kí tự chữ hoặc số), sau đó nhấn **Liên kết** để gửi yêu cầu phê duyệt sang **VPBank NEOBiz**. ![payOS link VPBank account success](/docs/assets/images/fill-form-vpbank-business-7baa88984de948ddffd72dc38ad880f6.png) * Sau khi hoàn tất gửi yêu cầu phê duyệt trên payOS, doanh nghiệp cần đăng nhập vào **VPBank NEOBiz** để phê duyệt dịch vụ. Tại **VPBank NEOBiz**, truy cập mục **Đăng ký sử dụng dịch vụ qua đối tác chờ duyệt**, chọn **Loại dịch vụ: Sử dụng tài khoản nhiều số hiệu (VAN)** và **Loại yêu cầu: Đăng ký chờ duyệt**, sau đó nhấn **Làm mới danh sách** để cập nhật dữ liệu. Khi danh sách hiển thị, tìm dòng yêu cầu có đối tác kết nối là **CASSO** và nhấn biểu tượng kích lúp để xem chi tiết yêu cầu kết nối. ![payOS link VPBank account success](/docs/assets/images/view-connect-request-vpbank-business-42bd0e59c68dc2feefbbbd94fa5a7055.png) * Tại màn hình chi tiết, kiểm tra lại thông tin đăng ký và nhấn **Duyệt** để tiếp tục. Hệ thống hiển thị màn hình **Đề nghị đăng ký sử dụng dịch vụ ngân hàng tích hợp**, doanh nghiệp đọc kỹ nội dung điều khoản và nhấn **Xác nhận**. Ở bước **Lựa chọn ký số và xác thực giao dịch**, chọn **Chữ ký số (CKS)** và ấn **Tiếp tục** để thực hiện ký số. ![payOS link VPBank account success](/docs/assets/images/digital-signature-vpbank-business-19d56c4841707b3e56a814e57b316728.png) * Doanh nghiệp có thể chủ động kiểm tra trạng thái đăng ký trực tiếp trên **VPBank NEOBiz** bằng cách truy cập **Quản lý kết nối qua hệ thống đối tác**, chọn **Trạng thái** là **Tất cả**, làm mới danh sách và theo dõi dòng có đối tác kết nối là **CASSO**. ![payOS link VPBank account success](/docs/assets/images/view-connection-state-04608d3c3243f72f77a065c12e5a3497.png) * Sau khi ký số thành công, vui lòng chờ tối đa trong vòng 5 phút để VPBank xử lý và kích hoạt kết nối. Tài khoản VPBank NEOBiz sẽ xuất hiện trong danh sách ngân hàng kết nối trên payOS khi xử lý thành công. ![payOS link VPBank account success](/docs/assets/images/add-vpbank-business-success-172e634413164c74b5b1b298969bd3d9.png) ### Hủy kết nối tài khoản VPBank NEOBiz[​](#hủy-kết-nối-tài-khoản-vpbank-neobiz "Đường dẫn trực tiếp đến Hủy kết nối tài khoản VPBank NEOBiz") * Truy cập trang chi tiết tài khoản ngân hàng và chọn **Xóa tài khoản** để gửi yêu cầu hủy kêt nối tài khoản lên hệ thống VPBank. thông tin Trước khi hủy liên kết tài khoản, các kênh thanh toán sử dụng tài khoản VPBank phải được xóa hoặc chuyển sang sử dụng tài khoản khác. ![payOS link VPBank account success](/docs/assets/images/delete-vpbank-business-5a1be7600b7c075a23ff29292bf931f7.png) ![payOS link VPBank account success](/docs/assets/images/send-disconnect-request-vpbank-business-da200f5d1a1d85a9afa728c123dbe6a5.png) * Sau khi gửi yêu cầu từ payOS, đăng nhập vào **VPBank NEOBiz** để thực hiện phê duyệt yêu cầu. Truy cập **Đăng ký sử dụng dịch vụ qua đối tác chờ duyệt**, chọn **Loại dịch vụ: Sử dụng tài khoản nhiều số hiệu (VAN)** và **Loại yêu cầu: Hủy đăng ký** và nhấn làm mới để cập nhật dữ liệu. Khi danh sách hiển thị, tìm dòng yêu cầu có đối tác **CASSO** và loại yêu cầu **Hủy đăng ký**, nhấn biểu tượng kính lúp để xem chi tiết. Kiểm tra lại thông tin và nhấn **Duyệt**. ![payOS link VPBank account success](/docs/assets/images/accept-disconnect-request-vpbank-business-4cb194374f631d33dd10a14faa9c6c6d.png) * Sau khi ký số thành công, vui lòng chờ trong vòng 5 phút để hệ thống cập nhật trạng thái. Hệ thống payOS sẽ cập nhật hủy liên kết tài khoản sau khi xử lý thành công. ![payOS link VPBank account success](/docs/assets/images/disconnect-success-3c5993a072771f3e738b1089e2d47a6b.png) ### Tích hợp kênh thanh toán cho tài khoản VPBank NEOBiz vào các nền tảng[​](#tích-hợp-kênh-thanh-toán-cho-tài-khoản-vpbank-neobiz-vào-các-nền-tảng "Đường dẫn trực tiếp đến Tích hợp kênh thanh toán cho tài khoản VPBank NEOBiz vào các nền tảng") * [Hướng dẫn tích hợp Sapo](/docs/tich-hop-webhook/sapo.md) * [Hướng dẫn tích hợp WooCommerce](/docs/tich-hop-webhook/woocommerce.md) * [Hướng dẫn tích hợp nhanh (low code)](/docs/checkout/quick-start-payos-hosted-page.md) --- # Ngân hàng dự phòng ### Tại sao cần thiết lập ngân hàng dự phòng cho kênh thanh toán?[​](#tại-sao-cần-thiết-lập-ngân-hàng-dự-phòng-cho-kênh-thanh-toán "Đường dẫn trực tiếp đến Tại sao cần thiết lập ngân hàng dự phòng cho kênh thanh toán?") Việc **thiết lập ngân hàng dự phòng** cho kênh thanh toán giúp **tăng độ uptime và sẵn sàng hoạt động của kênh thanh toán**, đặc biệt là trong những trường hợp có xảy ra sự cố gián đoạn của hệ thống Ngân hàng cũng như gián đoạn theo lịch bảo trì hệ thống. Thực hiện thêm ngân hàng dự phòng cho một kênh thanh toán mang lại tính linh hoạt và đảm bảo liên tục trong quá trình xử lý thanh toán. * Khi ngân hàng chính gặp sự cố không thể tạo link thanh toán cho kênh, hệ thống tự động chuyển sang ngân hàng dự phòng để tiếp tục giao dịch. * Khi ngân hàng chính ổn định trở lại, quy trình tự động chuyển về ngân hàng gốc để duy trì tính liên kết ban đầu. Lưu ý Ngân hàng dự phòng khác với ngân hàng chính về Phương thức kết nối (VietQRPro và OpenAPI) hoặc về Ngân hàng ### Hướng dẫn thiết lập ngân hàng dự phòng[​](#hướng-dẫn-thiết-lập-ngân-hàng-dự-phòng "Đường dẫn trực tiếp đến Hướng dẫn thiết lập ngân hàng dự phòng") Trước khi bắt đầu, bạn cần có Ngân hàng hàng thứ 2 khác với Ngân hàng chính hoặc khác Phương thức kết nối * **Thiết lập Ngân hàng dự phòng khi tạo kênh thanh toán:** Ở bước chọn Ngân hàng cho kênh thanh toán, sau khi chọn Ngân hàng chính thức, bạn thực hiện chọn ngân hàng dự phòng. ![Example banner](/docs/assets/images/temp-bank-when-create-channel-5bbf50da7274bab734be011eab7bb78f.png) Thông tin Sau khi chọn Ngân hành chính đã có thể tạo được kênh thanh toán, có thể cài đặt Ngân hàng dự phòng để tăng độ uptime cho kênh trong quá trình tạo kênh mới hoặc sau khi đã tạo kênh thanh toán. * **Thiết lập Ngân hàng dự phòng sau khi đã tạo kênh thanh toán:** vào Kênh thanh toán, sau đó nhấn chọn Kênh thanh toán cần thêm ngân hàng dự phòng => Ấn Thêm ngân hàng dự phòng, chọn ngân hàng => Ấn cập nhật để lưu ![Example banner](/docs/assets/images/temp-bank-when-edit-channel-d03f0e792def52b89350ca6b499ef93e.png) Sau khi đã thiết lập Ngân hàng dự phòng, bạn có thể thay đổi Ngân hàng dự phòng hoặc xóa Ngân hàng dự phòng: ![Example banner](/docs/assets/images/edit-or-delete-temp-bank-625a264c5225670d135530b65c233e5d.png) Thông tin Đối với Doanh nghiệp hoặc Cá nhân dùng MB Bank VietQRPro có thể thêm ngân hàng dự phòng là MB Bank OpenAPI. --- # Tạo kênh thanh toán ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") * Bạn cần có tài khoản đăng nhập vào hệ thống payOS. * Tổ chức của bạn đã được xác thực. Nếu chưa được xác thực, vui lòng tham khảo Mục [Xác thực Tổ chức](/docs/huong-dan-su-dung/xac-thuc-to-chuc.md) * Bạn đã liên kết ít nhất một tài khoản ngân hàng vào payOS. Nếu chưa liên kết tài khoản, vui lòng tham khảo phần [Kết nối tài khoản ngân hàng](/docs/huong-dan-su-dung/ket-noi-tai-khoan-ngan-hang.md) Sau khi xác thực Tổ chức thành công, bạn cần thực hiện theo các bước sau để tạo một kênh thanh toán mới. **Bước 1:** Tại menu **Kênh thanh toán**, nhấn nút **Tạo kênh thanh toán**. **Bước 2:** Điền thông tin Tên của kênh, tải lên Logo cho kênh thanh toán. Sau khi đã nhập đầy đủ thông tin, nhấn nút **Tiếp tục**. ![Example banner](/docs/assets/images/channel-input-731f8e68026a6a78dabaaf74b3eb2a1b.png) **Bước 3:** Chọn ngân hàng chính cho kênh, ấn chọn **Tạo kênh thanh toán và tích hợp**. ![Example banner](/docs/assets/images/create-channel-and-integration-3ce0234bc0d969667fa6cf374aba0b60.png) **Bước 4:** Giao diện Tạo kênh thanh toán thành công, tích hợp vào web/app của bạn bằng các key (Client ID, API Key, Checksum Key). Ấn **Hoàn tất** để kết thúc. ![Example banner](/docs/assets/images/integration-7826ebc91a70eb2122e92f2b29a7f89f.png) Thông tin Vào Kênh thanh toán, ấn chọn Kênh thanh toán để thêm webhookURL để nhận thông tin về các đơn hàng được thanh toán thành công. --- # Kết nối tài khoản ngân hàng thông qua Cas ### Cas là gì?[​](#cas-là-gì "Đường dẫn trực tiếp đến Cas là gì?") [Cas](https://cas.so) là sản phẩm của Casso, một hạ tầng thúc đẩy ứng dụng ngân hàng mở tại Việt Nam. Cas giúp người dùng **quản lý tập trung các tài khoản tài chính** và **phân quyền truy cập** các tài khoản này theo một tiêu chuẩn API thống nhất. ### Tại sao payOS dùng Cas để kết nối tài khoản ngân hàng?[​](#tại-sao-payos-dùng-cas-để-kết-nối-tài-khoản-ngân-hàng "Đường dẫn trực tiếp đến Tại sao payOS dùng Cas để kết nối tài khoản ngân hàng?") Cas quản lý tập trung các kết nối ngân hàng mà payOS hỗ trợ, các dịch vụ cung cấp bởi payOS và mọi vấn đề liên quan đến kết nối ngân hàng. Hiện nay, Cas đã chính thức ra mắt ứng dụng cho người dùng cuối sử dụng, vì vậy bạn có thể tải app Cas để liên kết các tài khoản ngân hàng trên payOS. Trên giao diện **Ngân hàng** của phần mềm payOS, sau khi chọn ngân hàng mà bạn muốn liên kết và chọn **"Tiếp tục"**, bạn có thể **quét QR bằng app Cas** hoặc chọn **"Kết nối trước - Cas sau"** để nhập thông tin kết nối ngân hàng. Thông tin Cas tuân theo các lớp bảo mật chuẩn từ phía Ngân hàng và chuẩn mã hoá AES, SHA-256. ![Example banner](/docs/assets/images/add-bank-qr-6f3a748d6bb49d1968483e703c843db9.png) Để liên kết ngân hàng vào payOS, bạn cần nhập các thông tin định danh như CCCD, SĐT, STK trên Cas. ![Example banner](/docs/assets/images/add-bank-manual-88603316fea2eedbc926907e48640450.png) --- # Tạo tài khoản payOS Bước 1: Vào trang để đăng nhập. ![Example banner](/docs/assets/images/login-9364db57634f3bf87e59d689d12ad0da.png) Bước 2: Nếu chưa có tài khoản đăng nhập bạn chọn **Đăng ký** và điền thông tin đầy đủ vào các trường ở trang đăng ký => Ấn **Tạo tài khoản** ![Example banner](/docs/assets/images/register-35b589f91fb0a1002f3c3d0932f3f986.png) Bước 3: payOS sẽ gửi vào địa chỉ email bạn đăng ký, ấn **Xác thực** để xác thực tài khoản. ![Example banner](/docs/assets/images/email-authentication-31e77d73b9b2fbefb21cc3aeeee00b9c.png) Bước 4: Giao diện sau khi tạo tài khoản thành công: ![Example banner](/docs/assets/images/login-success-2a8bb9de5e049b83bb70350fce2af046.png) --- # Thêm thành viên Bước 1: Chọn Mục **Thiết lập**, chọn **Thành viên** => Ấn nút **Thêm thành viên**: ![Example banner](/docs/assets/images/Step-1-3b0998d7754c771266f7bd7f7b82b8d5.png) Bước 2: Nhập mail thành viên muốn mời vào và ấn **Mời**: ![Example banner](/docs/assets/images/Step-2-d4fc3e8b5a5486b017f9ef2ddc291c7a.png) Lưu ý Thành viên được mời tham gia tổ chức đã phải có tài khoản payOS. Bước 3: Ấn **Mời thành viên**: ![Example banner](/docs/assets/images/Step-3-22856562c2ccb0a84fc6f1f5e75ad921.png) Kết quả: Thành viên được mời sẽ nhận được mail từ payOS, để tham gia vào tổ chức cần ấn vào link và chấp nhận tham gia. ![Example banner](/docs/assets/images/Step-4-10116e12e1b9ade1f6a0e27bf6539043.png) --- # Thêm tổ chức mới Một tài khoản Email có thể tạo nhiều tổ chức. **Bước 1:** Đăng nhập vào tài khoản [my.payos.vn](https://my.payos.vn/login), ấn vào Thêm tổ chức mới ![Example banner](/docs/assets/images/Step-1-4a14c759b06e6171ee4aa5cba73d0160.png) **Bước 2:** Thực hiện các bước xác thực tổ chức. Lưu ý Một tài khoản Email tạo được tối đa 5 tổ chức. --- # Xác thực tổ chức Đối tượng sử dụng của payOS là bất kì mô hình kinh doanh nào: cá nhân, hộ kinh doanh , doanh nghiệp , chỉ cần có tài khoản ngân hàng, payOS đều sẽ gọi họ là **Tổ chức**. Trong đó, gồm 2 đối tượng chính: * Đã có pháp nhân (Được cấp mã số đăng ký doanh nghiệp) * Chưa có pháp nhân (Gọi là **kinh doanh cá thể**) payOS cần xác thực chủ sở hữu của Tổ chức để đảm bảo rằng các Tổ chức đăng kí trên payOS là hợp lệ. ### Trước khi bắt đầu[​](#trước-khi-bắt-đầu "Đường dẫn trực tiếp đến Trước khi bắt đầu") Trong quá trình xác thực Tổ chức, payOS cần các thông tin sau: * Mã số thuế nếu Doanh nghiệp đã được cấp mã số thuế doanh nghiệp * Mã CCCD/CMND nếu Tổ chức là Cá nhân/Hộ kinh doanh Sau khi đăng nhập vào trang payOS, bạn cần tiếp tục thực hiện các bước sau để hoàn tất xác thực Tổ chức. Trong hệ thống của payOS, hiện có 2 loại tổ chức: Doanh nghiệp (có pháp nhân) và Tài khoản Cá nhân/Hộ kinh doanh. Để thực hiện xác thực chính xác, vui lòng chọn đúng loại tổ chức. Lưu ý Chỉ thêm được Tài khoản Ngân hàng trùng với tên Tổ chức đã xác thực. ### Xác thực Tổ chức Doanh nghiệp[​](#xác-thực-tổ-chức-doanh-nghiệp "Đường dẫn trực tiếp đến Xác thực Tổ chức Doanh nghiệp") **Bước 1:** Ấn chọn **Doanh nghiệp (có pháp nhân)** ![Example banner](/docs/assets/images/select-type-8872575b6d31b2ddc826bc11e795922c.png) **Bước 2:** Điền thông tin chi tiết MST/GPKD của doanh nghiệp, sau đó nhấn nút **Kiểm tra**. Nếu thông tin chính xác, sẽ có thông báo **Thành công** và tên doanh nghiệp sẽ được tự động điền. Ấn **Tiếp tục** để thao tác tiếp. Lưu ý Nếu CCCD/MST không tìm thấy, vui lòng thực hiện luồng xác thực thủ công: thực hiện gửi hình **2 mặt CCCD, ảnh chụp/scan giấy phép kinh doanh (có mộc đỏ)** đến email với tiêu đề **\[payOS] Xác thực thủ công + email dùng payOS**, payOS sẽ thực hiện xác thực thủ công cho tổ chức của bạn. ![Example banner](/docs/assets/images/company-info-4d08dbac4d5179d928680252c8e23de9.png) **Bước 3:** Thực hiện chuyển khoản bằng cách quét mã QR. Sau khi hoàn tất chuyển khoản, hệ thống sẽ tự động Xác thực cho tổ chức của bạn. Lưu ý Vui lòng chuyển từ Ngân hàng trùng tên với tổ chức, không chuyển từ Ví điện tử, chuyển đúng nội dung và số tiền để hệ thống tự động xác thực. ### Xác thực Tổ chức Cá nhân/Hộ kinh doanh[​](#xác-thực-tổ-chức-cá-nhânhộ-kinh-doanh "Đường dẫn trực tiếp đến Xác thực Tổ chức Cá nhân/Hộ kinh doanh") **Bước 1:** Ấn chọn **Tài khoản cá nhân/Hộ kinh doanh** ![Example banner](/docs/assets/images/select-type-individual-19617cd19ce859d37aa34a3cb3c38f4d.png) **Bước 2:** Điền thông tin CMND/CCCD cá nhân và Tên của bạn, sau đó nhấn nút **Kiểm tra**. Nếu thông tin chính xác, sẽ có thông báo **Thành công**. Lưu ý Nếu CCCD/MST không tìm thấy, vui lòng thực hiện luồng xác thực thủ công: thực hiện gửi hình **2 mặt CCCD** đến email với tiêu đề **\[payOS] Xác thực thủ công + email dùng payOS**, payOS sẽ thực hiện xác thực thủ công cho tổ chức của bạn. ![Example banner](/docs/assets/images/individual-info-1e7a1cab89b09541433d1426fe40d454.png) **Bước 3:** Thực hiện chuyển khoản bằng cách quét mã QR. Sau khi hoàn tất chuyển khoản, hệ thống sẽ tự động Xác thực cho tổ chức của bạn. Lưu ý Vui lòng chuyển từ Ngân hàng trùng tên với tổ chức, không chuyển từ Ví điện tử, chuyển đúng nội dung và số tiền để hệ thống tự động xác thực. --- # Môi trường test payOS ## Tổng quan[​](#tổng-quan "Đường dẫn trực tiếp đến Tổng quan") Hiện tại, payOS **không cung cấp môi trường test (sandbox/staging) riêng biệt**. Để trải nghiệm tích hợp và kiểm thử luồng thanh toán, khách hàng có thể sử dụng **tài khoản cá nhân** và **CCCD** để đăng ký, liên kết tài khoản và thực hiện thử nghiệm trực tiếp trên môi trường thực tế của payOS. payOS hiện vận hành trên môi trường production API chính thức. Điều này giúp khách hàng có thể: * Trải nghiệm đầy đủ quy trình tạo link thanh toán * Kiểm tra luồng redirect, callback và webhook thực tế * Kiểm thử giao diện checkout và trải nghiệm thanh toán end-user * Xác minh luồng xử lý thanh toán thành công/thất bại trong hệ thống của bạn ## Cách trải nghiệm thử với payOS[​](#cách-trải-nghiệm-thử-với-payos "Đường dẫn trực tiếp đến Cách trải nghiệm thử với payOS") Để test tích hợp payOS, khách hàng có thể thực hiện theo các bước sau: 1. Đăng ký tài khoản payOS bằng thông tin cá nhân 2. Xác thực tài khoản bằng CCCD theo hướng dẫn trên hệ thống 3. Liên kết tài khoản ngân hàng cá nhân để nhận tiền thử nghiệm 4. Tạo payment link hoặc tích hợp API/Web SDK để kiểm tra luồng thanh toán thực tế 5. Thực hiện thanh toán thử với giá trị nhỏ để xác minh luồng end-to-end (redirect, webhook, trạng thái thanh toán…) ## Sample code và demo tích hợp[​](#sample-code-và-demo-tích-hợp "Đường dẫn trực tiếp đến Sample code và demo tích hợp") Khách hàng có thể tham khảo sample React chính thức của payOS để trải nghiệm nhanh luồng tích hợp checkout: Sample này giúp bạn nhanh chóng chạy thử giao diện thanh toán, kiểm tra cách khởi tạo checkout và luồng tích hợp cơ bản trước khi đưa vào hệ thống thực tế. payOS cũng cung cấp SDK và tài liệu tích hợp cho nhiều nền tảng backend/frontend khác nhau. ## Lưu ý[​](#lưu-ý "Đường dẫn trực tiếp đến Lưu ý") Vì payOS không có sandbox riêng, các giao dịch thử nghiệm sẽ chạy trên môi trường thực tế. Khuyến nghị: * Sử dụng giá trị giao dịch nhỏ khi kiểm thử * Dùng tài khoản cá nhân để trải nghiệm trước khi triển khai production * Kiểm tra đầy đủ webhook, callback URL và trạng thái thanh toán trong hệ thống của bạn * Chuẩn bị logic xử lý retry, timeout và đồng bộ trạng thái thanh toán khi tích hợp chính thức --- # Golang SDK thông tin Code demo: ## Tài liệu đầy đủ[​](#tài-liệu-đầy-đủ "Đường dẫn trực tiếp đến Tài liệu đầy đủ") Để biết thêm chi tiết về các phương thức, tham số và tính năng nâng cao (context support, auto-paging iterators, error handling, v.v.), vui lòng xem [GitHub Repository](https://github.com/payOSHQ/payos-lib-golang). ## Cài đặt[​](#cài-đặt "Đường dẫn trực tiếp đến Cài đặt") Cài đặt thư viện `payos-lib-golang` thông qua go get: ``` go get github.com/payOSHQ/payos-lib-golang/v2 ``` ## Khởi tạo[​](#khởi-tạo "Đường dẫn trực tiếp đến Khởi tạo") Khởi tạo đối tượng PayOS với Client ID, API Key và Checksum Key: ``` import ( "context" "os" "github.com/payOSHQ/payos-lib-golang/v2/payos" ) func main() { ctx := context.Background() client, err := payos.NewPayOS(&payos.PayOSOptions{ ClientId: os.Getenv("PAYOS_CLIENT_ID"), ApiKey: os.Getenv("PAYOS_API_KEY"), ChecksumKey: os.Getenv("PAYOS_CHECKSUM_KEY"), }) if err != nil { log.Fatal(err) } } ``` ## Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Sử dụng phương thức `PaymentRequests.Create()` để tạo link thanh toán: ``` item := payos.PaymentLinkItem{ Name: "Sản phẩm A", Quantity: 1, Price: 50000, } paymentRequest := payos.CreatePaymentLinkRequest{ OrderCode: 123456, Amount: 50000, Description: "Thanh toán đơn hàng", Items: []payos.PaymentLinkItem{item}, CancelUrl: "https://your-domain.com/cancel", ReturnUrl: "https://your-domain.com/success", } paymentLink, err := client.PaymentRequests.Create(ctx, paymentRequest) if err != nil { log.Fatalf("Không thể tạo link thanh toán: %v", err) } fmt.Println(paymentLink.CheckoutUrl) ``` ## Xác minh webhook[​](#xác-minh-webhook "Đường dẫn trực tiếp đến Xác minh webhook") Sử dụng phương thức `Webhooks.VerifyData()` để xác thực dữ liệu webhook: ``` import ( "encoding/json" "net/http" ) func webhookHandler(w http.ResponseWriter, r *http.Request) { var webhookData map[string]interface{} if err := json.NewDecoder(r.Body).Decode(&webhookData); err != nil { http.Error(w, "Invalid request", http.StatusBadRequest) return } verifiedData, err := client.Webhooks.VerifyData(ctx, webhookData) if err != nil { log.Printf("Webhook không hợp lệ: %v", err) http.Error(w, "Invalid webhook", http.StatusBadRequest) return } log.Printf("Thanh toán thành công") w.WriteHeader(http.StatusOK) w.Write([]byte("OK")) } ``` ## Tạo payout[​](#tạo-payout "Đường dẫn trực tiếp đến Tạo payout") Sử dụng phương thức `Payouts.Batch.Create()` để tạo payout theo lô: ``` import "time" referenceId := fmt.Sprintf("payout_%d", time.Now().Unix()) payoutBatch := payos.PayoutBatchRequest{ ReferenceId: referenceId, Category: []string{"salary"}, ValidateDestination: true, Payouts: []payos.PayoutBatchItem{ { ReferenceId: fmt.Sprintf("%s_1", referenceId), Amount: 2000, Description: "Thanh toán lương", ToBin: "970422", ToAccountNumber: "0123456789", }, { ReferenceId: fmt.Sprintf("%s_2", referenceId), Amount: 3000, Description: "Thanh toán thưởng", ToBin: "970422", ToAccountNumber: "0987654321", }, }, } payout, err := client.Payouts.Batch.Create(ctx, payoutBatch) if err != nil { log.Fatalf("Không thể tạo payout: %v", err) } fmt.Printf("Payout ID: %s\n", payout.Id) ``` --- # Java SDK thông tin Code demo: ## Tài liệu đầy đủ[​](#tài-liệu-đầy-đủ "Đường dẫn trực tiếp đến Tài liệu đầy đủ") Để biết thêm chi tiết về các phương thức, tham số và tính năng nâng cao (pagination, custom HttpClient, error handling, v.v.), vui lòng xem [GitHub Repository](https://github.com/payOSHQ/payos-lib-java). ## Cài đặt[​](#cài-đặt "Đường dẫn trực tiếp đến Cài đặt") * Maven * Gradle Thêm dependency vào file `pom.xml`: ``` vn.payos payos-java 2.0.1 ``` Thêm dependency vào file `build.gradle`: ``` implementation 'vn.payos:payos-java:2.1.0' ``` ## Khởi tạo[​](#khởi-tạo "Đường dẫn trực tiếp đến Khởi tạo") Khởi tạo đối tượng PayOS từ biến môi trường hoặc truyền trực tiếp các thông số: ``` import vn.payos.PayOS; // Khởi tạo từ biến môi trường PayOS payOS = PayOS.fromEnv(); // Hoặc khởi tạo trực tiếp PayOS payOS = new PayOS( System.getenv("PAYOS_CLIENT_ID"), System.getenv("PAYOS_API_KEY"), System.getenv("PAYOS_CHECKSUM_KEY") ); ``` ## Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Sử dụng phương thức `paymentRequests().create()` để tạo link thanh toán: ``` import vn.payos.model.v2.paymentRequests.CreatePaymentLinkRequest; CreatePaymentLinkRequest paymentRequest = CreatePaymentLinkRequest.builder() .orderCode(System.currentTimeMillis() / 1000) .amount(2000L) .description("Thanh toán đơn hàng") .cancelUrl("https://your-domain.com/cancel") .returnUrl("https://your-domain.com/success") .build(); var paymentLink = payOS.paymentRequests().create(paymentRequest); System.out.println(paymentLink.getCheckoutUrl()); ``` ## Xác minh webhook[​](#xác-minh-webhook "Đường dẫn trực tiếp đến Xác minh webhook") Sử dụng phương thức `webhooks().verify()` để xác thực dữ liệu webhook: ``` import vn.payos.type.Webhook; @PostMapping("/webhook") public ResponseEntity handleWebhook(@RequestBody Webhook webhook) { try { var data = payOS.webhooks().verify(webhook); System.out.println("Thanh toán thành công: " + data.getOrderCode()); return ResponseEntity.ok("OK"); } catch (Exception e) { System.err.println("Webhook không hợp lệ: " + e.getMessage()); return ResponseEntity.badRequest().body("Invalid webhook"); } } ``` ## Tạo payout[​](#tạo-payout "Đường dẫn trực tiếp đến Tạo payout") Sử dụng phương thức `payouts().batch().create()` để tạo payout theo lô: ``` import vn.payos.model.v1.payouts.batch.PayoutBatchRequest; import vn.payos.model.v1.payouts.batch.PayoutBatchItem; import java.util.Arrays; String referenceId = "payout_" + System.currentTimeMillis(); PayoutBatchRequest payoutRequest = PayoutBatchRequest.builder() .referenceId(referenceId) .validateDestination(false) .category(Arrays.asList("salary")) .payout(PayoutBatchItem.builder() .referenceId(referenceId + "_1") .amount(10000L) .description("Thanh toán lương") .toBin("970422") .toAccountNumber("0123456789") .build()) .payout(PayoutBatchItem.builder() .referenceId(referenceId + "_2") .amount(50000L) .description("Thanh toán thưởng") .toBin("970418") .toAccountNumber("0987654321") .build()) .build(); var payout = payOS.payouts().batch().create(payoutRequest); System.out.println("Payout ID: " + payout.getReferenceId()); ``` --- # .NET Core SDK thông tin Code demo: ## Tài liệu đầy đủ[​](#tài-liệu-đầy-đủ "Đường dẫn trực tiếp đến Tài liệu đầy đủ") Để biết thêm chi tiết về các phương thức, tham số và tính năng nâng cao (async/await support, auto-pagination, ILogger integration, v.v.), vui lòng xem [GitHub Repository](https://github.com/payOSHQ/payos-lib-dotnet). ## Cài đặt[​](#cài-đặt "Đường dẫn trực tiếp đến Cài đặt") Cài đặt package `payOS` thông qua dotnet CLI: ``` dotnet add package payOS ``` ## Khởi tạo[​](#khởi-tạo "Đường dẫn trực tiếp đến Khởi tạo") Khởi tạo đối tượng PayOSClient với Client ID, API Key và Checksum Key: ``` using PayOS; var payOS = new PayOSClient( Environment.GetEnvironmentVariable("PAYOS_CLIENT_ID"), Environment.GetEnvironmentVariable("PAYOS_API_KEY"), Environment.GetEnvironmentVariable("PAYOS_CHECKSUM_KEY") ); ``` ## Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Sử dụng phương thức `PaymentRequests.CreateAsync()` để tạo link thanh toán: ``` using PayOS.Models; var paymentRequest = new CreatePaymentLinkRequest { OrderCode = 123, Amount = 2000, Description = "Thanh toán đơn hàng", CancelUrl = "https://your-domain.com/cancel", ReturnUrl = "https://your-domain.com/success" }; var paymentLink = await payOS.PaymentRequests.CreateAsync(paymentRequest); Console.WriteLine(paymentLink.CheckoutUrl); ``` ## Xác minh webhook[​](#xác-minh-webhook "Đường dẫn trực tiếp đến Xác minh webhook") Sử dụng phương thức `Webhooks.VerifyAsync()` để xác thực dữ liệu webhook: ``` using Microsoft.AspNetCore.Mvc; [HttpPost("webhook")] public async Task HandleWebhook([FromBody] WebhookData webhookData) { try { var verifiedData = await payOS.Webhooks.VerifyAsync(webhookData); Console.WriteLine($"Thanh toán thành công: {verifiedData.OrderCode}"); return Ok("OK"); } catch (Exception ex) { Console.WriteLine($"Webhook không hợp lệ: {ex.Message}"); return BadRequest("Invalid webhook"); } } ``` ## Tạo payout[​](#tạo-payout "Đường dẫn trực tiếp đến Tạo payout") Sử dụng phương thức `Payouts.Batch.CreateAsync()` để tạo payout theo lô: ``` using PayOS.Models; var referenceId = $"payout_{DateTimeOffset.UtcNow.ToUnixTimeSeconds()}"; var payoutRequest = new PayoutBatchRequest { ReferenceId = referenceId, Category = new List { "salary" }, ValidateDestination = true, Payouts = new List { new PayoutBatchItem { ReferenceId = $"{referenceId}_1", Amount = 2000, Description = "Thanh toán lương", ToBin = "970422", ToAccountNumber = "0123456789" }, new PayoutBatchItem { ReferenceId = $"{referenceId}_2", Amount = 3000, Description = "Thanh toán thưởng", ToBin = "970422", ToAccountNumber = "0987654321" } } }; var payout = await payOS.Payouts.Batch.CreateAsync(payoutRequest); Console.WriteLine($"Payout ID: {payout.Id}"); ``` --- # NodeJS SDK thông tin Code demo: ## Tài liệu đầy đủ[​](#tài-liệu-đầy-đủ "Đường dẫn trực tiếp đến Tài liệu đầy đủ") Để biết thêm chi tiết về các phương thức, tham số và tính năng nâng cao (pagination, error handling, logging, v.v.), vui lòng xem [GitHub Repository](https://github.com/payOSHQ/payos-lib-node). ## Cài đặt[​](#cài-đặt "Đường dẫn trực tiếp đến Cài đặt") Cài đặt gói `@payos/node` thông qua npm hoặc yarn: ``` npm install @payos/node # hoặc yarn add @payos/node ``` ## Khởi tạo[​](#khởi-tạo "Đường dẫn trực tiếp đến Khởi tạo") Khởi tạo đối tượng PayOS với Client ID, API Key và Checksum Key từ kênh thanh toán: ``` import { PayOS } from '@payos/node'; const payOS = new PayOS({ clientId: process.env.PAYOS_CLIENT_ID, apiKey: process.env.PAYOS_API_KEY, checksumKey: process.env.PAYOS_CHECKSUM_KEY, }); ``` ## Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Sử dụng phương thức `paymentRequests.create()` để tạo link thanh toán: ``` const paymentData = { orderCode: 123456, amount: 50000, description: 'Thanh toán đơn hàng', items: [ { name: 'Sản phẩm A', quantity: 1, price: 50000, }, ], cancelUrl: 'https://your-domain.com/cancel', returnUrl: 'https://your-domain.com/success', }; const paymentLink = await payOS.paymentRequests.create(paymentData); console.log(paymentLink.checkoutUrl); ``` ## Xác minh webhook[​](#xác-minh-webhook "Đường dẫn trực tiếp đến Xác minh webhook") Sử dụng phương thức `webhooks.verify()` để xác thực dữ liệu webhook: ``` app.post('/webhook', (req, res) => { try { const webhookData = payOS.webhooks.verify(req.body); console.log('Thanh toán thành công:', webhookData); res.status(200).send('OK'); } catch (error) { console.error('Webhook không hợp lệ:', error); res.status(400).send('Invalid webhook'); } }); ``` ## Tạo payout[​](#tạo-payout "Đường dẫn trực tiếp đến Tạo payout") Sử dụng phương thức `payouts.batch.create()` để tạo payout theo lô: ``` const referenceId = `payout_${Date.now()}`; const payoutBatch = await payOS.payouts.batch.create({ referenceId, category: ['salary'], validateDestination: true, payouts: [ { referenceId: `${referenceId}_1`, amount: 2000, description: 'Thanh toán lương', toBin: '970422', toAccountNumber: '0123456789', }, { referenceId: `${referenceId}_2`, amount: 3000, description: 'Thanh toán thưởng', toBin: '970422', toAccountNumber: '0987654321', }, ], }); console.log('Payout ID:', payoutBatch.id); ``` --- # PHP SDK thông tin Code demo: * Laravel: * CodeIgniter: ## Tài liệu đầy đủ[​](#tài-liệu-đầy-đủ "Đường dẫn trực tiếp đến Tài liệu đầy đủ") Để biết thêm chi tiết về các phương thức, tham số và tính năng nâng cao (PSR-18 HTTP client support, automatic retry, error handling, v.v.), vui lòng xem [GitHub Repository](https://github.com/payOSHQ/payos-lib-php). ## Cài đặt[​](#cài-đặt "Đường dẫn trực tiếp đến Cài đặt") Cài đặt thư viện `payos/payos` thông qua Composer: ``` composer require payos/payos ``` ## Khởi tạo[​](#khởi-tạo "Đường dẫn trực tiếp đến Khởi tạo") Khởi tạo đối tượng PayOS với Client ID, API Key và Checksum Key: ``` use PayOS\PayOS; $payOS = new PayOS( clientId: getenv('PAYOS_CLIENT_ID'), apiKey: getenv('PAYOS_API_KEY'), checksumKey: getenv('PAYOS_CHECKSUM_KEY') ); ``` ## Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Sử dụng phương thức `paymentRequests->create()` để tạo link thanh toán: ``` $paymentData = [ 'orderCode' => 123456, 'amount' => 50000, 'description' => 'Thanh toán đơn hàng', 'items' => [ [ 'name' => 'Sản phẩm A', 'quantity' => 1, 'price' => 50000 ] ], 'cancelUrl' => 'https://your-domain.com/cancel', 'returnUrl' => 'https://your-domain.com/success' ]; $paymentLink = $payOS->paymentRequests->create($paymentData); echo $paymentLink['checkoutUrl']; ``` ## Xác minh webhook[​](#xác-minh-webhook "Đường dẫn trực tiếp đến Xác minh webhook") Sử dụng phương thức `webhooks->verify()` để xác thực dữ liệu webhook: ``` // Trong webhook endpoint của bạn $webhookPayload = $request->getParsedBody(); // từ PSR-7 request try { $verified = $payOS->webhooks->verify($webhookPayload); // $verified là một WebhookData object error_log('Thanh toán thành công: ' . $verified->orderCode); http_response_code(200); echo 'OK'; } catch (\PayOS\Exceptions\WebhookException $e) { error_log('Webhook không hợp lệ: ' . $e->getMessage()); http_response_code(400); echo 'Invalid webhook'; } ``` ## Tạo payout[​](#tạo-payout "Đường dẫn trực tiếp đến Tạo payout") Sử dụng phương thức `payouts->batch->create()` để tạo payout theo lô: ``` $referenceId = 'payout_' . time(); $payoutBatch = $payOS->payouts->batch->create([ 'referenceId' => $referenceId, 'category' => ['salary'], 'validateDestination' => true, 'payouts' => [ [ 'referenceId' => $referenceId . '_1', 'amount' => 2000, 'description' => 'Thanh toán lương', 'toBin' => '970422', 'toAccountNumber' => '0123456789' ], [ 'referenceId' => $referenceId . '_2', 'amount' => 3000, 'description' => 'Thanh toán thưởng', 'toBin' => '970422', 'toAccountNumber' => '0987654321' ] ] ]); echo 'Payout ID: ' . $payoutBatch['id']; ``` --- # Python SDK thông tin Code demo: ## Tài liệu đầy đủ[​](#tài-liệu-đầy-đủ "Đường dẫn trực tiếp đến Tài liệu đầy đủ") Để biết thêm chi tiết về các phương thức, tham số và tính năng nâng cao (auto-pagination, async support, error handling, v.v.), vui lòng xem [GitHub Repository](https://github.com/payOSHQ/payos-lib-python). ## Cài đặt[​](#cài-đặt "Đường dẫn trực tiếp đến Cài đặt") Cài đặt thư viện `payos` thông qua pip: ``` # Windows pip install payos # Linux/macOS pip3 install payos ``` ## Khởi tạo[​](#khởi-tạo "Đường dẫn trực tiếp đến Khởi tạo") Khởi tạo đối tượng PayOS từ biến môi trường hoặc truyền trực tiếp các thông số: ``` from payos import PayOS import os # Khởi tạo từ biến môi trường payOS = PayOS( client_id=os.environ.get('PAYOS_CLIENT_ID'), api_key=os.environ.get('PAYOS_API_KEY'), checksum_key=os.environ.get('PAYOS_CHECKSUM_KEY') ) ``` ## Tạo link thanh toán[​](#tạo-link-thanh-toán "Đường dẫn trực tiếp đến Tạo link thanh toán") Sử dụng phương thức `payment_requests.create()` để tạo link thanh toán: ``` from payos.types import CreatePaymentLinkRequest import time payment_request = CreatePaymentLinkRequest( order_code=int(time.time()), amount=2000, description="Thanh toán đơn hàng", cancel_url="https://your-domain.com/cancel", return_url="https://your-domain.com/success" ) payment_link = payOS.payment_requests.create(payment_request) print(payment_link.checkout_url) ``` ## Xác minh webhook[​](#xác-minh-webhook "Đường dẫn trực tiếp đến Xác minh webhook") Sử dụng phương thức `webhooks.verify()` để xác thực dữ liệu webhook: ``` from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def webhook_handler(request): try: webhook_data = payOS.webhooks.verify(request.body) print(f"Thanh toán thành công: {webhook_data.order_code}") return JsonResponse({"message": "OK"}, status=200) except Exception as e: print(f"Webhook không hợp lệ: {e}") return JsonResponse({"message": "Invalid webhook"}, status=400) ``` ## Hỗ trợ Async[​](#hỗ-trợ-async "Đường dẫn trực tiếp đến Hỗ trợ Async") Thư viện cung cấp `AsyncPayOS` cho các framework async như FastAPI: ``` from payos import AsyncPayOS # Khởi tạo async client async_payos = AsyncPayOS(client_id, api_key, checksum_key) # Sử dụng với async/await payment_link = await async_payos.payment_requests.create(payment_request) ``` ## Tạo payout[​](#tạo-payout "Đường dẫn trực tiếp đến Tạo payout") Sử dụng phương thức `payouts.batch.create()` để tạo payout theo lô: ``` from payos.types import PayoutBatchRequest, PayoutBatchItem import time reference_id = f"payout_{int(time.time())}" payout_batch = payOS.payouts.batch.create( PayoutBatchRequest( reference_id=reference_id, category=["salary"], validate_destination=True, payouts=[ PayoutBatchItem( reference_id=f"{reference_id}_1", amount=2000, description="Thanh toán lương", to_bin="970422", to_account_number="0123456789" ), PayoutBatchItem( reference_id=f"{reference_id}_2", amount=3000, description="Thanh toán thưởng", to_bin="970422", to_account_number="0987654321" ) ] ) ) print(f"Payout ID: {payout_batch.id}") ``` --- # payOS Checkout Script JS payOS cung cấp `script-js` hỗ trợ mở link thanh toán ## Giới thiệu[​](#giới-thiệu "Đường dẫn trực tiếp đến Giới thiệu") Đây là thư viện dùng để hỗ trợ mở Pop up thanh toán trên trang web của bạn. * Javascript * ReactJS ## Cài đặt[​](#cài-đặt "Đường dẫn trực tiếp đến Cài đặt") Khai báo lệnh khởi tạo payOS ở mỗi trang trên trang web của bạn. Nó phải luôn được tải trực tiếp từ `https://cdn.payos.vn`, thay vì được đưa vào một gói cài đặt hoặc tự lưu trữ. Không giống như các SDK khác của payOS, SDK web JavaScript không được lập phiên bản; `cdn.payos.vn` sẽ tự động cung cấp SDK mới nhất hiện có. ``` ``` ## Chỉ thị CSP[​](#chỉ-thị-csp "Đường dẫn trực tiếp đến Chỉ thị CSP") Nếu bạn đang sử dụng Chính sách bảo mật nội dung (CSP), hãy sử dụng các lệnh sau để cho phép lưu lượng truy cập Liên kết: ``` default-src https://cdn.payos.vn/ script-src https://cdn.payos.vn/payos-checkout/v1/stable/payos-initialize.js frame-src https://pay.payos.vn/ https://next.pay.payos.vn/ connect-src https://payos.vn/ ``` ## Khởi tạo[​](#khởi-tạo "Đường dẫn trực tiếp đến Khởi tạo") ``` let payOSConfig: PayOSConfig = { RETURN_URL: "", // required ELEMENT_ID: "", // required CHECKOUT_URL: "", // required embedded: true, // Nếu dùng giao diện nhúng onSuccess: (event: any) => { //TODO: Hành động sau khi người dùng thanh toán đơn hàng thành công }, onCancel: (event: any) => { //TODO: Hành động sau khi người dùng Hủy đơn hàng }, onExit: (event: any) => { //TODO: Hành động sau khi người dùng tắt Pop up }, }; ``` Mô tả các thành phần của `PayOSConfig`: * **** **\* RETURN\_URL** (String): Đây là đường dẫn tới trang web của bạn khi đơn hàng được thanh toán thành công * **** **\* ELEMENT\_ID** (String): Đây là **#id** của thẻ div sẽ chứa iframe thanh toán * **** **\* CHECKOUT\_URL** (String): Đây là đường dẫn tới trang thanh toán mà chúng tôi sẽ mở nó bằng iframe * **embedded** (boolean): `false` nếu dùng pop up thanh toán, `true` nếu dùng giao diện nhúng. * **onSuccess** (Callback): Sẽ được gọi sau khi đơn hàng được thanh toán thành công. * **onCancel** (Callback): Sẽ được gọi sau khi người dùng "Hủy thanh toán". * **onExit** (Callback): Sẽ được gọi sau khi người dùng bấm thoát khỏi Pop Up thanh toán (Bấm biểu tượng "X" trên iframe). Lưu ý **RETURN\_URL** phải trùng với đường dẫn hiển thị iframe thanh toán. Mô tả các thuộc tính có trong event: * **loading**: Có giá trị `false` nếu luồng thực thi đã kết thúc. * **code**: Mã `code` phản hồi. Các giá trị của thuộc tính: * `00`: SUCCESS * `01`: FAILED * `02`: INVALID\_PARAM * **id**: `paymentLinkId`. Ví dụ: `cb62d25884c7463cbabd2997b4c03af9` * **cancel**: Có giá trị `true` khi huỷ đơn hàng và `false` khi thanh toán đơn hàng * **orderCode**: Mã đơn hàng * **status**: Có giá trị `CANCELLED` hoặc `PAID`, mô tả cho trạng thái đơn hàng đã bị huỷ hay đã được thanh toán ``` { loading: boolean; code: string; id: string; cancel: string; orderCode: number; status: string; } ``` ## Cách sử dụng[​](#cách-sử-dụng "Đường dẫn trực tiếp đến Cách sử dụng") `PayOSCheckout.usePayOS` chấp nhận một đối số là `Object` có kiểu dữ liệu `PayOSConfig` như đã mô tả ở phần trên, và trả về một `Object` gồm 2 hàm có tên là `open` và `exit`. ``` const { open, exit } = PayOSCheckout.usePayOS(payOSConfig); open(); ``` Thông tin về các hàm: * **open()** (void): Sau khi hàm này được thực thi, Pop up hoặc giao diện nhúng sẽ được thêm vào trang web. * **exit()** (void): Sau khi hàm này được thực thi, Pop up sẽ được tắt ngay lập tức ## Cài đặt[​](#cài-đặt-1 "Đường dẫn trực tiếp đến Cài đặt") Cài đặt với npm ``` npm install payos-checkout --save ``` Cài đặt với yarn ``` yarn add payos-checkout ``` Sau đó nhập kiểu dữ liệu và hàm ``` import { usePayOS, PayOSConfig } from '@payos/payos-checkout'; ``` ## Khởi tạo[​](#khởi-tạo-1 "Đường dẫn trực tiếp đến Khởi tạo") ``` const payOSConfig: PayOSConfig = { RETURN_URL: "", // required ELEMENT_ID: "", // required CHECKOUT_URL: "", // required embedded: true, // Nếu dùng giao diện nhúng onSuccess: (event: any) => { //TODO: Hành động sau khi người dùng thanh toán đơn hàng thành công }, onCancel: (event: any) => { //TODO: Hành động sau khi người dùng Hủy đơn hàng }, onExit: (event: any) => { //TODO: Hành động sau khi người dùng tắt Pop up }, }; ``` Mô tả các thành phần của `PayOSConfig`: * **** **\* RETURN\_URL** (String): Đây là đường dẫn tới trang web của bạn khi đơn hàng được thanh toán thành công * **** **\* ELEMENT\_ID** (String): Đây là **#id** của thẻ div sẽ chứa iframe thanh toán * **** **\* CHECKOUT\_URL** (String): Đây là đường dẫn tới trang thanh toán mà chúng tôi sẽ mở nó bằng iframe * **embedded** (boolean): `false` nếu dùng pop up thanh toán, `true` nếu dùng giao diện nhúng. * **onSuccess** (Callback): Sẽ được gọi sau khi đơn hàng được thanh toán thành công. * **onCancel** (Callback): Sẽ được gọi sau khi người dùng "Hủy thanh toán". * **onExit** (Callback): Sẽ được gọi sau khi người dùng bấm thoát khỏi Pop Up thanh toán (Bấm biểu tượng "X" trên iframe). * **event** (Object): Đây là một object sẽ chứa những thông tin thêm nhận được từ payOS khi người dùng thực hiện các hành động onSucess, onCancel, onExit. Lưu ý **RETURN\_URL** phải trùng với đường dẫn hiển thị iframe thanh toán. Mô tả các thuộc tính có trong event: * **loading**: có giá trị `false` nếu luồng thực thi đã kết thúc. * **code**: mã `code` phản hồi. Tập giá trị: * `00`: SUCCESS * `01`: FAILED * `02`: INVALID\_PARAM * **id**: `paymentLinkId`. Cí dụ: `cb62d25884c7463cbabd2997b4c03af9` * **cancel**: Có giá trị `true` khi huỷ đơn hàng và `false` khi thanh toán đơn hàng * **orderCode**: Mã đơn hàng * **status**: Có giá trị `CANCELLED` hoặc `PAID` mô tả cho đơn hàng đã bị huỷ hay đã được thanh toán ``` { loading: boolean; code: string; id: string; cancel: string; orderCode: number; status: string; } ``` ## Cách sử dụng[​](#cách-sử-dụng-1 "Đường dẫn trực tiếp đến Cách sử dụng") `usePayOS` chấp nhận một đối số là `Object` có kiểu dữ liệu `PayOSConfig` như đã mô tả ở phần trên, và trả về một `Object` gồm 2 hàm có tên là `open` và `exit`. ``` const { open, exit } = usePayOS(payOSConfig); open(); ``` Thông tin về các hàm: * **open()** (void): Sau khi hàm này được thực thi, Pop up hoặc giao diện nhúng sẽ được thêm vào trang web. * **exit()** (void): Sau khi hàm này được thực thi, Pop up sẽ được tắt ngay lập tức --- # SDKs Các thư viện và script giúp tích hợp nhanh payOS vào hệ thống của merchant. ### Server-side SDKs[​](#server-side-sdks "Đường dẫn trực tiếp đến Server-side SDKs") * Node * Python * .NET Core * PHP * Golang Cài đặt với npm ``` npm install @payos/node --save ``` Cài đặt với yarn ``` yarn add @payos/node ``` Cài đặt với pip ``` # Windows pip install payos # Linux/macOS pip3 install payos ``` Cài đặt với dotnet ``` dotnet add package payOS ``` Cài đặt với composer ``` composer require payos/payos ``` Cài đặt với go ``` go get github.com/payOSHQ/payos-lib-golang/v2 ``` ### Web SDKs[​](#web-sdks "Đường dẫn trực tiếp đến Web SDKs") ![payOS react](/docs/img/react.svg)![payOS react](/docs/img/react.svg) ![payOS JS](/docs/img/js.svg)![payOS JS](/docs/img/js.svg) payOS cung cấp `script-js` hỗ trợ mở link thanh toán * Javascript * ReactJS ``` ``` ``` npm install payos-checkout ``` --- # Kiểm tra dữ liệu với signature ## Kiểm tra thông tin bằng chữ ký (payment-requests)[​](#kiểm-tra-thông-tin-bằng-chữ-ký-payment-requests "Đường dẫn trực tiếp đến Kiểm tra thông tin bằng chữ ký (payment-requests)") Giá trị `signature` được dùng để kiểm tra tính chính xác của dữ liệu. ### Cách tạo signature[​](#cách-tạo-signature "Đường dẫn trực tiếp đến Cách tạo signature") * Sử dụng thuật toán HMAC\_SHA256 để tạo signature. * data tạo signature dạng: key1=value1\&key2=value2... (key1: tên field, value1 = giá trị của key1). * Dữ liệu tạo signature sắp xếp theo key thứ tự alphabet. * Cấu trúc: hash\_hmac("sha256", string $data , string $checksum\_key) Lưu ý: Checksum Key được tạo ra sau khi tạo cổng thanh toán thành công ### Code mẫu kiểm tra chính xác dữ liệu[​](#code-mẫu-kiểm-tra-chính-xác-dữ-liệu "Đường dẫn trực tiếp đến Code mẫu kiểm tra chính xác dữ liệu") * PHP * Javascript * Python * Java ``` "00", "desc" => "success", "success" => true, "data" => array( "orderCode" => 123, "amount" => 3000, "description" => "VQRIO123", "accountNumber" => "12345678", "reference" => "TF230204212323", "transactionDateTime" => "2023-02-04 18:25:00", "currency" => "VND", "paymentLinkId" => "124c33293c43417ab7879e14c8d9eb18", "code" => "00", "desc" => "Thành công", "counterAccountBankId" => "", "counterAccountBankName" => "", "counterAccountName" => "", "counterAccountNumber" => "", "virtualAccountName" => "", "virtualAccountNumber" => "" ), "signature" => "412e915d2871504ed31be63c8f62a149a4410d34c4c42affc9006ef9917eaa03" ); function isValidData($transaction, $transaction_signature, $checksum_key) { ksort($transaction); $transaction_str_arr = []; foreach ($transaction as $key => $value) { if (in_array($value, ["undefined", "null"]) || gettype($value) == "NULL") { $value = ""; } if (is_array($value)) { $valueSortedElementObj = array_map(function ($ele) { ksort($ele); return $ele; }, $value); $value = json_encode($valueSortedElementObj, JSON_UNESCAPED_UNICODE); } $transaction_str_arr[] = $key . "=" . $value; } $transaction_str = implode("&", $transaction_str_arr); dump($transaction_str); $signature = hash_hmac("sha256", $transaction_str, $checksum_key); dump($signature); return $signature == $transaction_signature; } isValidData($webhookData['data'], $webhookData['signature'], $checksum_key); ``` ``` import { createHmac } from 'crypto'; const checksumKey = '1a54716c8f0efb2744fb28b6e38b25da7f67a925d98bc1c18bd8faaecadd7675'; const webhookData = { code: '00', desc: 'success', success: true, data: { orderCode: 123, amount: 3000, description: 'VQRIO123', accountNumber: '12345678', reference: 'TF230204212323', transactionDateTime: '2023-02-04 18:25:00', currency: 'VND', paymentLinkId: '124c33293c43417ab7879e14c8d9eb18', code: '00', desc: 'Thành công', counterAccountBankId: '', counterAccountBankName: '', counterAccountName: '', counterAccountNumber: '', virtualAccountName: '', virtualAccountNumber: '', }, signature: '412e915d2871504ed31be63c8f62a149a4410d34c4c42affc9006ef9917eaa03', }; function sortObjDataByKey(object) { const orderedObject = Object.keys(object) .sort() .reduce((obj, key) => { obj[key] = object[key]; return obj; }, {}); return orderedObject; } function convertObjToQueryStr(object) { return Object.keys(object) .filter((key) => object[key] !== undefined) .map((key) => { let value = object[key]; // Sort nested object if (value && Array.isArray(value)) { value = JSON.stringify(value.map((val) => sortObjDataByKey(val))); } // Set empty string if null if ([null, undefined, 'undefined', 'null'].includes(value)) { value = ''; } return `${key}=${value}`; }) .join('&'); } function isValidData(data, currentSignature, checksumKey) { const sortedDataByKey = sortObjDataByKey(data); const dataQueryStr = convertObjToQueryStr(sortedDataByKey); const dataToSignature = createHmac('sha256', checksumKey).update(dataQueryStr).digest('hex'); return dataToSignature == currentSignature; } return isValidData(webhookData.data, webhookData.signature, checksumKey); ``` ``` // Python3 import hmac import hashlib checksum_key = "1a54716c8f0efb2744fb28b6e38b25da7f67a925d98bc1c18bd8faaecadd7675" webhook_data = { "code": '00', "desc": 'success', "success": True, "data": { "orderCode": 123, "amount": 3000, "description": 'VQRIO123', "accountNumber": '12345678', "reference": 'TF230204212323', "transactionDateTime": '2023-02-04 18:25:00', "currency": 'VND', "paymentLinkId": '124c33293c43417ab7879e14c8d9eb18', "code": '00', "desc": 'Thành công', "counterAccountBankId": '', "counterAccountBankName": '', "counterAccountName": '', "counterAccountNumber": '', "virtualAccountName": '', "virtualAccountNumber": '', }, "signature": '412e915d2871504ed31be63c8f62a149a4410d34c4c42affc9006ef9917eaa03' } def convertObjToQueryStr(obj: dict) -> str: query_string = [] for key, value in obj.items(): value_as_string = "" if isinstance(value, (int, float, bool)): value_as_string = str(value) elif value in [None, 'null', 'NULL']: value_as_string = "" elif isinstance(value, list): value_as_string = json.dumps([sortObjDataByKey(item) for item in value], separators=(',', ':')).replace('None', 'null') else: value_as_string = str(value) query_string.append(f"{key}={value_as_string}") return "&".join(query_string) def sortObjDataByKey(obj: dict) -> dict: return dict(sorted(obj.items())) def isValidData(data,signature,key): sorted_data_by_key = sortObjDataByKey(data) data_query_str = convertObjToQueryStr(sorted_data_by_key) print(data_query_str) data_to_signature = hmac.new(key.encode("utf-8"), msg=data_query_str.encode("utf-8"), digestmod=hashlib.sha256).hexdigest() return data_to_signature == signature ``` ``` import java.util.*; import org.apache.commons.codec.digest.HmacUtils; import org.json.JSONObject; public class Main { static String checksumKey = "1a54716c8f0efb2744fb28b6e38b25da7f67a925d98bc1c18bd8faaecadd7675"; static String transaction = "{'orderCode':123,'amount':3000,'description':'VQRIO123','accountNumber':'12345678','reference':'TF230204212323','transactionDateTime':'2023-02-04 18:25:00','currency':'VND','paymentLinkId':'124c33293c43417ab7879e14c8d9eb18','code':'00','desc':'Thành công','counterAccountBankId':'','counterAccountBankName':'','counterAccountName':'','counterAccountNumber':'','virtualAccountName':'','virtualAccountNumber':''}"; static String transactionSignature = "412e915d2871504ed31be63c8f62a149a4410d34c4c42affc9006ef9917eaa03"; public static Boolean isValidData(String transaction, String transactionSignature) { try { JSONObject jsonObject = new JSONObject(transaction); Iterator sortedIt = sortedIterator(jsonObject.keys(), (a, b) -> a.compareTo(b)); StringBuilder transactionStr = new StringBuilder(); while (sortedIt.hasNext()) { String key = sortedIt.next(); String value = jsonObject.get(key).toString(); transactionStr.append(key); transactionStr.append('='); transactionStr.append(value); if (sortedIt.hasNext()) { transactionStr.append('&'); } } String signature = new HmacUtils("HmacSHA256", checksumKey).hmacHex(transactionStr.toString()); return signature.equals(transactionSignature); } catch (Exception e) { e.printStackTrace(); } return false; } public static Iterator sortedIterator(Iterator it, Comparator comparator) { List list = new ArrayList(); while (it.hasNext()) { list.add((String) it.next()); } Collections.sort(list, comparator); return list.iterator(); } public static void main(String[] args) { System.out.println(isValidData(transaction, transactionSignature)); } } ``` Xem chi tiết về API [tại đây](/docs/api/.md#tag/payment-webhook/operation/confirm-webhook). ## Thông tin dữ liệu mẫu webhook link thanh toán[​](#thông-tin-dữ-liệu-mẫu-webhook-link-thanh-toán "Đường dẫn trực tiếp đến Thông tin dữ liệu mẫu webhook link thanh toán") | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | coderequired | stringMã lỗi | | descrequired | stringThông tin lỗi | | successrequired | boolean | | datarequired | object | | signaturerequired | stringChữ kí để kiểm tra thông tin, [chi tiết dữ liệu mẫu](https://payos.vn/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature/) | Copy Expand all Collapse all `{ "code": "00", "desc": "success", "success": true, "data": { "orderCode": 123, "amount": 3000, "description": "VQRIO123", "accountNumber": "12345678", "reference": "TF230204212323", "transactionDateTime": "2023-02-04 18:25:00", "currency": "VND", "paymentLinkId": "124c33293c43417ab7879e14c8d9eb18", "code": "00", "desc": "Thành công", "counterAccountBankId": "", "counterAccountBankName": "", "counterAccountName": "", "counterAccountNumber": "", "virtualAccountName": "", "virtualAccountNumber": "" }, "signature": "8d8640d802576397a1ce45ebda7f835055768ac7ad2e0bfb77f9b8f12cca4c7f" }` ## Kiểm tra thông tin bằng chữ ký (payouts)[​](#kiểm-tra-thông-tin-bằng-chữ-ký-payouts "Đường dẫn trực tiếp đến Kiểm tra thông tin bằng chữ ký (payouts)") ### Cách tạo và cấu trúc của signature[​](#cách-tạo-và-cấu-trúc-của-signature "Đường dẫn trực tiếp đến Cách tạo và cấu trúc của signature") * Sử dụng thuật toán HMAC\_SHA256 để tạo signature. * data tạo signature dạng: key1=value1\&key2=value2... (key1: tên field, value1 = **encodeURI(giá trị của key1)**). * Giá trị của key nếu là `null` hay `undefined` sẽ là chuỗi rỗng `""` * Dữ liệu tạo signature sắp xếp theo key thứ tự alphabet, thứ tự các phần từ trong mảng giữ nguyên. * Cấu trúc: hash\_hmac("sha256", string $data , string $checksum\_key) Lưu ý: Checksum key được tạo ra khi tạo kênh chuyển tiền thành công và có thể thay đổi trên [my.payos.vn](https://my.payos.vn) cảnh báo Chữ ký dùng cho API `payouts` **KHÁC** với chữ ký dùng cho API `payment-requests` ### Code mẫu kiểm tra chính xác dữ liệu[​](#code-mẫu-kiểm-tra-chính-xác-dữ-liệu-1 "Đường dẫn trực tiếp đến Code mẫu kiểm tra chính xác dữ liệu") * Javascript ``` /** * Deep sort object with optional array sorting * @param obj Object data * @param sortArrays Whether to sort arrays or maintain their order * @returns Sorted object data */ function deepSortObj(obj, sortArrays = false) { return Object.keys(obj) .sort() .reduce((acc, key) => { const value = obj[key]; if (Array.isArray(value)) { if (sortArrays) { // Sort array elements acc[key] = value .map((item) => typeof item === 'object' && item !== null ? deepSortObj(item, sortArrays) : item, ) .sort((a, b) => { // Sort primitive values if (typeof a !== 'object' && typeof b !== 'object') { return String(a).localeCompare(String(b)); } // For objects, sort by JSON string representation return JSON.stringify(a).localeCompare(JSON.stringify(b)); }); } else { // Maintain array order, but sort objects within arrays acc[key] = value.map((item) => typeof item === 'object' && item !== null ? deepSortObj(item, sortArrays) : item, ); } } else if (typeof value === 'object' && value !== null) { acc[key] = deepSortObj(value, sortArrays); } else { acc[key] = value; } return acc; }, {}); } /** * Create HMAC SHA-256 signature using Web Crypto API (browser-compatible) * * @param {string} secretKey - Secret key for HMAC signature generation * @param {object} jsonData - JSON object data to be signed * @returns {Promise} HMAC signature in hexadecimal format * * @example * // Basic usage * const signature = await createSignatureBrowser('secret', { name: 'John', age: 30 }); */ async function createSignatureBrowser(secretKey, jsonData) { const sortedData = deepSortObj(jsonData, false); const queryString = Object.keys(sortedData) .map((key) => { let value = sortedData[key]; // Handle arrays by JSON stringify them if (Array.isArray(value)) { value = JSON.stringify(value); } // Handle nested objects if (typeof value === 'object' && value !== null && !Array.isArray(value)) { value = JSON.stringify(value); } // Handle null/undefined values if (value === null || value === undefined) { value = ''; } return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`; }) .join('&'); // Web Crypto API implementation const encoder = new TextEncoder(); const keyData = encoder.encode(secretKey); const messageData = encoder.encode(queryString); const cryptoKey = await crypto.subtle.importKey( 'raw', keyData, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'], ); const signature = await crypto.subtle.sign('HMAC', cryptoKey, messageData); const hashArray = Array.from(new Uint8Array(signature)); const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join(''); return hashHex; } /** * Verify signature using Web Crypto API * * @param {string} secretKey - Secret key used for signature generation * @param {object} jsonData - JSON object data that was signed * @param {string} expectedSignature - Expected signature to verify against * @returns {Promise} true if signatures match, false otherwise */ async function verifySignatureBrowser(secretKey, jsonData, expectedSignature) { const computedSignature = await createSignatureBrowser(secretKey, jsonData); return computedSignature.toLowerCase() === expectedSignature.toLowerCase(); } const payoutChecksumKey = '6e91f59952acc8918c49c4a8e380136d66d1fbbf3375926840a8a7e434d4b325'; const expectedSignature = '34d500c4e17feaad8fab528ac3ae089353e276ca9fb4c6654c06ffdfbd88cc5d'; const payoutData = { code: '00', desc: 'success', data: { payouts: [ { id: 'batch_8f9520b9341144f38b9f5fbfa317db8e', referenceId: 'payout_1753061728877', transactions: [ { id: 'batch_txn_fdb348c0570a4cb99009da22f9504898', referenceId: 'payout_1753061728877_0', amount: 2000, description: 'batch payout', toBin: '970422', toAccountNumber: '0123456789', toAccountName: 'NGUYEN VAN A', reference: '103269845', transactionDatetime: '2025-07-21T08:35:40+07:00', errorMessage: null, errorCode: null, state: 'SUCCEEDED', }, { id: 'batch_txn_d94d371c079f4fc0ab7154e1576629d8', referenceId: 'payout_1753061728877_1', amount: 2000, description: 'batch payout', toBin: '970422', toAccountNumber: '0123456789', toAccountName: 'NGUYEN VAN A', reference: '103269846', transactionDatetime: '2025-07-21T08:35:44+07:00', errorMessage: null, errorCode: null, state: 'SUCCEEDED', }, { id: 'batch_txn_71eb922201f3442d93ec5a3c77347e9f', referenceId: 'payout_1753061728877_2', amount: 2000, description: 'batch payout', toBin: '970422', toAccountNumber: '0123456789', toAccountName: 'NGUYEN VAN A', reference: '103269847', transactionDatetime: '2025-07-21T08:35:47+07:00', errorMessage: null, errorCode: null, state: 'SUCCEEDED', }, ], category: ['salary'], approvalState: 'COMPLETED', createdAt: '2025-07-21T08:35:34+07:00', }, ], pagination: { limit: 10, offset: 0, total: 1, count: 1, hasMore: false, }, }, }; (async () => { const result = await verifySignatureBrowser( payoutChecksumKey, payoutData.data, expectedSignature, ); console.log('Signature payout validation result:', result); })(); ``` --- # Tích hợp Sapo Mỗi khi phát sinh một giao dịch mới, dựa trên mã đơn hàng và số tiền người dùng đã chuyển, payOS sẽ tự động xác nhận thanh toán và chuyển trạng thái đơn hàng trực tiếp trên website Sapo. ## Bước 1: Đăng kí tài khoản, thiết lập cổng trên payOS[​](#bước-1-đăng-kí-tài-khoản-thiết-lập-cổng-trên-payos "Đường dẫn trực tiếp đến Bước 1: Đăng kí tài khoản, thiết lập cổng trên payOS") Sau khi bạn hoàn thành bước này hãy vào giao diện payOS và lưu 3 keys dưới đây: ![Example banner](/docs/assets/images/temp-bank-when-edit-channel-d03f0e792def52b89350ca6b499ef93e.png) ## Bước 2: Lấy API Key từ sapo[​](#bước-2-lấy-api-key-từ-sapo "Đường dẫn trực tiếp đến Bước 2: Lấy API Key từ sapo") Truy cập vào admin trên trang Sapo của bạn => Ứng dụng => Ứng dụng riêng ![Example banner](/docs/assets/images/sapo1-9c42238a1e8372f99328ae7be946cb87.png) Tạo ứng dụng và cấu hình ứng dụng ![Example banner](/docs/assets/images/sapo2-e468d908e0c1745dd4dd2dd976bd145d.png) Nhập thông tin Tên ứng dụng + email của bạn và cho phép quyền đọc ghi trên đơn hàng. ![Example banner](/docs/assets/images/sapo3-f79c665593be867bc43c734f179b9d5b.png) Sau khi tạo xong ta được giao diện Ứng dụng như dưới đây: ![Example banner](/docs/assets/images/sapo4-78da1a151eb296f3f8a75edb68587445.png) ## Bước 2: Cài đặt plugin payos-sapo[​](#bước-2-cài-đặt-plugin-payos-sapo "Đường dẫn trực tiếp đến Bước 2: Cài đặt plugin payos-sapo") Đường dẫn plugin payos-sapo: ``` https://github.com/payOSHQ/payos-sapo ``` Sau khi đã cài và có được đường dẫn tương tự như này, bạn có thể đến bước tiếp theo ## Bước 3: Thiết lập trên giao diện sapo[​](#bước-3-thiết-lập-trên-giao-diện-sapo "Đường dẫn trực tiếp đến Bước 3: Thiết lập trên giao diện sapo") Sau khi đã deploy xong bằng plugin payos-sapo và có được đường dẫn public như bên dưới, bạn có thể tiến hành bước tiếp theo: ``` https://your_domain/checkout.js ``` Vào trang Admin của Sapo web => Cài đặt => Phương thức thanh toán. Ở phần thanh toán thủ công, ta tiến hành tạo ra phương thức thanh toán tùy chọn, sửa lại tên theo ý muốn sau đó lưu lại. Lưu ý: Tên phương thức thanh toán cần có chữ VietQR để hệ thống tự động nhận diện và cập nhật mã VietQR khi thanh toán. ![Example banner](/docs/assets/images/sapo5-7995c2c7613609dec430dd9719af0577.png) Quay lại phần Cài đặt => vào Trang thanh toán. Ở mục xử lý đơn hàng ta dán đoạn code bên dưới vào trường Nội dung thông báo thêm và Lưu lại. ``` ``` ![Example banner](/docs/assets/images/sapo6-f0d9f0cefb7316c09b0f99c4c726c0d6.png) Vậy là đã hoàn tất toàn bộ các bước thiết lập, hãy cùng kiểm tra lại kết quả thôi nào: ![Example banner](/docs/assets/images/sapo7-ba96cacfe9c6e73ac5663984901e1c9d.png) ![Example banner](/docs/assets/images/sapo8-9b77bce4692cd016775017082003e434.png) ![Example banner](/docs/assets/images/sapo9-b35a494733fbd569bc801d59315fc1ff.png) --- # Tích hợp WooCommerce với payOS [Embedded youtube](https://www.youtube.com/embed/7QsbC3oAIrs) ### [Tải plugin payOS](/docs/downloads.md) và thiết lập theo hướng dẫn.[​](#tải-plugin-payos-và-thiết-lập-theo-hướng-dẫn "Đường dẫn trực tiếp đến tải-plugin-payos-và-thiết-lập-theo-hướng-dẫn") --- # Bắt đầu Chào mừng bạn đến trang tài liệu của payOS. Hướng dẫn lập trình viên tích hợp payOS để xử lý giao dịch Thanh toán chuyển khoản Napas 24/7 của khách hàng. * Tích hợp nhanh [![payOS-Hosted page](/docs/assets/images/payos-accept-online-hosted-page-965d3ef9f92a1ed9ee32d5d2f256ae1c.svg)](/docs/checkout/quick-start-payos-hosted-page.md)[payOS-Hosted page](/docs/checkout/quick-start-payos-hosted-page.md) Xây dựng trang thanh toán hoặc sử dụng trang thanh toán có sẵn của payOS [![payOS embedded](/docs/assets/images/payos-accept-online-embedded-form-1ea2a96a58acc244737b5ce6fc15e849.svg)](/docs/checkout/quick-start-payos-embedded-form.md)[payOS embedded](/docs/checkout/quick-start-payos-embedded-form.md) Nhúng giao diện thanh toán vào ứng dụng hoặc website của bạn ## Clone code mẫu[​](#clone-code-mẫu "Đường dẫn trực tiếp đến Clone code mẫu") Bạn có thể tham khảo một số dự án mã nguồn mở của payOS tại [GitHub payOSHQ](https://github.com/payoshq). [payOS ReactJS example](https://github.com/payOSHQ/payos-demo-reactJS "https://github.com/payOSHQ/payos-demo-reactJS") [![Github banner](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAACXBIWXMAADddAAA3XQEZgEZdAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABiOSURBVHgB7Z2/cxtHlsffG0BnytqqxdpeexWZqiXvSO+WCGWXCcw2s5ztRaKyyyRll4nMLpP0F4jKLhMZXiQou8xDl21qTboMZ7pbn01XnS3aBKavXxOwYRk/Zgbzo9/M91NFE6IJkQL62+9Hv36PCAAAAAAAAAAAAAAAAAAAAIBfwQRUsrbWXh40qGWYWmxoefR1M/Z4EszUk89RRCfcsB+GThoDOnn+POwRUAcE7CHLy+3WhUtOiG1DIlCzYYXZYvmzFSzZx5QHTCf27+7ZRyd2KwiJg2/tzw2DgHpHn4QhAe+AgEtGxNq4SB0OrGAjc53PRbtMfiIi7lkzfiDCvmA/YLnLBQIumNU/tUWgHbGq1tp1PBZrLOwC6hkRdsDP7OMuLHWxQMA5I7Fqv0E3xLraV7uTm/vrC+dueJcD3rexdRcWOl8g4BxY+XO7Q4PofSa+od3CLsq5hTZ71Aj2jz8OuwQyBQLOiJFobXy4VXkrmxJ28TN1TcCPIeZsgIAXwIk2iq7bl/EORJuMkZgbEe/AzU4PBJwQyRo3L9GWjWnft3/sEMiC0MbMD8++o71eLzwhEBsIOCYuexxFN+Ei54hNgNkFuQerHB8IeA7nsa25R7C2RdOlBu8gVp4NBDwFCNcPXKwc8I49X94l8Csg4FewrrLEt/fqfvzjGxDyZCDgIWJxeWAeQbh+AyH/ktoLGK6yTlyBSINv1T1Grq2AXYkjm0cE4aqGmXbrnLWunYDdOe7r0W0yvE2gOrDZ7n8fPKzbOXKDasQf19s3mhfME/tu3yBQMbjTuEB/ffOdy99+/fcXtbkRVQsLDHe5XtTJra68BV5dv3o7Cug/7MM1AnWhHTFtvfH7yz98/dWL/6IKU1kLDKsLhnSbhm9V1RpX0gL/49rVm4OA9ghWF9i8pWG6UdXYuFIW2GWYL0b33PU+AF4lMA/63wU7VcpUV0bAcluIIvMElVRgFlIA0jC8WRWXuhIutCSqrHB37cM/EACzaVUpwaVewCvrV+/bfXXbPlwiAOIha+Uvb7zzTuvrv//3f5Ji1LrQwyzzE/uwTQCkJ7RZ6g+0utQqBezGirB5ingXZIHmuDggZcjtoX5gPoR4QVbIWrLe3IdSakvKUBUDS7LKvtpSVYV4F2TNkrXEf7XJrW81JbfUCHhl7eo9Yv53AiBf/vLG2++QTW49IwWoEPBQvNsEQCFwR4uIvRewOyZi/jcCoFB0iNhrAa++t/HIvpD/SgCUAnfefPsPy1bE++Qp3gpYxGsMbREA5dL2WcReCnhYXQXLC3zBWxF7J+BhwgoxL/CNto8xsVcCRrYZ+I1/iS1vBAzxAh34JWIvBCwdNAzzAwJABdx5663Lvf/96sUBlUzplxnOx3aaDwkAXZxwwJtHn4Sltukp9TKD3CqSLhoEgD5asnbdGi6R0iyw9K+6cBG3ioBu5Cri2Uu+VlafrdIscPN1TAIE+pE13Lzo2heXQilJLJdxRqEGqA5rZWWmC3ehh+M8nxIAVaPBm0WPOy1UwGiFAyrOSdPwtSJb8zSpQIajTpapTNim/w3/lHAwbFo2kGkR0MfwvTT2s30PT1imMJBZpvJoDdf4JhVEYRbYj0or7h4fhr96cd1EhyVq21dDPq6zMW14CZ7hRMqhFeozK9jwgqFwkqVbWbMhGpcdovFdu84KKUwqRMDDFrBfUMnY3frW0fNwN873SoFJFNFWQOZ9iLkkxMIS75mIHvdPKYx7VLOyviEC7lCZFBQP5y5gn857+y/5d2nO687HttAd626/D3e7CLjLAT0++4720rxfK+vtOzY4uk8lUtT5cO4CHt7t9WDYGO9bt2ahtqFuM1qiG9aU34NVzhhrbY3hx2xo7/j5YpZruW1Doh/MN1Q2gXlw/MlHdylHchWwT0dGSdznOKyutbcg5AyQ2Dbih9ZFfpCltfLCjRZydqVzrcTiQXkVKq/SIOpShshmcHR4cEU2BnGXCCTjPCm10/+er1iLu525q2nYi+t+ogHx3CgnchOwZJ29sU48OWOZBRBycph5txnxtVyE+zNd8gBXavk65RZC5uJC+5J1HmGIH35+GBYSh9tjjG0b+9xGsmsS3LWvy86iMW4cXBz8o12DnrwPTcNX8jAiuRRy9AObATTkE10qCLEqdgPbHTBtGzI3KSPscUpPzj/tjntiX9ovXeFCYB8PqMcNOmkMyFmy01M6mWXVxJ1bWqLWoEEt+1y3uO3zl41xHy1metctejbtzBa/HAdFfDfLHMQ8emF4svLeRo88mV6ZV4FH5hbYHrlsmcif2FfggK+VcfFahmXZc+T7sUMJiQutUO2bEloxHdjn9aYVLBSBy7pfomV7Hr7M7ISwIV8mY2KLQryfwUvaLuO6nX39HzBZb8gT7GvxgfUE9yhDshfw+sYXvmVmjw8PSu084txqm7F+9etiVe1/uvZDEi5h2d0d4vJT5Vpgs7yGrk+y1pIPsMdCt4pwl6fhw3nwOHmcDWfqQnuVuBph3U4qmZFb3Q/oibWsz4KAwrRFCj4w/L27NBaanLdGcsc2Url20C/J6o4jHkzpPaPGGEtobVNGZPbv8/em0eT6Z1B9fEumDjnpv+QrWW1umR0jDQI/ixps7NYjUEtOl8hHD6eV5bFSJgKWnc7XOUYuYwtqiWSiyUeMuZ1VM7xMBCzWlwDwEE+La1pZaWZhAftsfQHwFdFMFlZ4YQHD+gKQjjNePBZeSMCwvgCkh8ncXPSiw0IChvUFYCEWzkinFrDz340H9y3nYHCpoNZ4f1/bZqQXscKpBTxoUEfDZfaA6bcEaoncSCL/WcgKp3ehIx3us6H4hfegWlz4Tke3FDbpb62lErDcstHSSobhQteWqKljjYqWXPupFKQSMGd4zzVv5MXJs6UJ8JfhFUgdDNJ5tIkFPDx8vkGKaP5G0RsJssOYDdJDJ42hSSzgPusSryPyP1sOcoB1ve9pklmJBexTh4PYGHOdQK1YXW1n1xKoINIksxIJWObOKO2D3EEcXC9MU5/XlSaZlUjAHOhJXr3KhUsKXX+QHta5Vs0g2TpN5kIrqLyaivRuArXAFXAYnYnLpCc8sQWs2H12d0IbEe0QqAVykV8a7ZNOWknc6NgC1uo+O/Ea3iyrNSsoB9eD2rDKTTuJGx3fhVbqPkcDvgvx1hPpBkqejFhJQhI3OpaAJSWv0n1m3vn8s2wbaQNd9F/jDxTOrIrtRscSsLmgL4Mrb9rxp24HBjVG4mGjMR6OWXwUz4VWWAghcS8BQM6V7sqIF9JETM3NFfDwTmWHNGFdZ8S9YJzBa7StzJWOVXw0V8CNH3SJV96k/vf0gAAYQ1zpiPguKaJxcb724rjQHdKEPTrQOnMI5MtwMmCX9NCZ9w1zBcysJ/4V61vkDFqgEEVnw3G0N1PA6krSlB7cg+IYjjvtkgas9ubFwTMF3DzVI15YXxAbRRv9vGYUs13oQFH8C+sLYiJWWE1GerCIgBWd/zYUlsyB8jCGH5MOOrP+52wBq2kKxvs49wVJ6C/pOGpkmt3Xa6qAhwksFV0s2BDqnUEihrODu+Q587qqThWwpgTW2SkEDNLA+6SAWQUd011oPe5zF4UbIA1NJZ4bz7gJOFXAiq4PqthFgX9I3kRDNpqZpsbBUwU8L3j2hgaFBEBq+Bl5zqz5Xupd6OOPXWUNAOkI/E9kzZrvNV3AKjLQ3CUAFuFH/z24WZnoiQJ2Xe0VYP9hBwTAApxd0lGRtbRE8QVsGkrOf/X1OgKe4VrQKlhHZ1NC2okC5oaauao9AmBBNKyjIEhigY2S4d0NwvkvWBgm/pI8Z5ompwlYhQvd7MMCg8WJyH9DME2TwZQvqhDw6SksMFgcZv/XUcD024lfn/RFe3D8LikAJZQgE4wKC7w86euJB3wDUDU4UODJsYnvQrPSKYQAVBVOEgMDAHQwOQZmHUksAOqCoSQWWMkxEgBZoKTuoXoudJzZMQBUGdUCnlbgDUBdQBIL1B4tlYeTUC3gfhPHXWBxtFQeTkK1gM0ALjRYHC2Vh5NQLeBpV6wASITiY9PJAlZQ3C1oufYIvGeZ/GeiJieXUioo7haYSK3rAzxCQRKLkwhYC9YC/44AWAAt/d+mMa2UUokFVtK7GniLlv5vhrg36evTSil1xMBzBj8BMBc1I4QmM+U6of89gkZcuIREFkgPsw4vjnly+6iJAtbQI2gM1TsoKBctJxmRoW8nfX2yBVYSAwtRBAGDheiQAqZpcpqAe6QE6wJdJwBSsLLW7pASkrnQkSIX2lAbiSyQCkUJLJNEwBeMrpGdzd/AjQZp0OO9TSuumijg0yVd/ZbNgG4QAElhHfGvcPRJONGoThSwloFPIxAHg6S4+FfPPeCpBnVqKaWWaiwH4mCQELu+FXltPDWknSpgNqxq9m7zIm0RADEJyLxPSpg1BzuY8SRViSxS9IaAchH32SgaXjArnJ0l4B7porP6J903S0AxcGBukiYalNyFHrxGXVKGMchGgxgYPdlnof9/KQQsmWgtnTl+wpjbSGaBWVgvbUub+zxrCufsC/1GnRVuNV+nOwTANCJzjxRhaHYyeY6AdWWiBTbK4htQGNqsr4NnJ5PntdTpkjLkDZI3igB4FWXW1xHM1uBMAfeXtB0lnWMicx+xMBhHpfWl2QksYaaAh4ksjSJGLAx+iUbra7U3K4ElzO1KaQw/I43YjPTaWnuZQO1ZWbt6T6P1jaO9OG1lu6STVp/NIwK1xm3izNukk+68b5grYI0FHWN0VtbbcKVrzIDNU1LK4GUGAnZxsF4rbDH3UGJZT1bWr97X6Dqfw9158a8QbzKD1jj4nJZNYDxBVrperK5fvW1FoNn72o/zTXFHq3RJMbILNy+aJwRqgXhcRm/c6+AgnuaYYrLy3sY3ijoYTCYwD44/+egugcoiSSuJe/W6zuf1z0eHB1fifG/s4WY2pf2YtBPxnZX3ruo7DwSxqIJ4HczduN8aW8BsaI+qgOFtiLh6VEa8FhNQbGMZ24UWKuFGj4A7XRncKYNNVFZBvEncZyHRfOBKuNEjxJ1e3/gQ1Vq6+eN6+4Yx1bC8jgTus5BIwJVxo3+mLW4XRKwTKZFksqcLVfEKKZn7LCRyoYXV9Y0vKrPbjcNm+/jTj3YIeI9suMMy2Q5ViKTus5DIAguVcqPHkeTW+gassedIgUY/MB9SxcTrMJzYgCQWcH+JHlB16did/Qtkqf1j5c/tjmywhvhBlVzmcRopCqYSu9CCvJBUxR1wDNeLN+Cdo0/CXQKl4Y6HAnPPmKo37uf948MwcVfVxBbYkcLUa0PifBOZRxLzo0VP8YhwV9/beCQeUfXFS2J+U3m2qSywkO+ZMHdlnEQQ/NwNxETUElHZX3jD/qlDBTOyyI0BdZ8/D3sEckFcZRq47hkdqglpklcjmpSWiB/azG2msaL8QxqGN+cJxLlV8gbbn19URtz9HGuR+/aXtJZhNzK8//lhWLVjtVKQm2LN1yO5PXTDird+Vz8X8GhTW+Dltn3RfzRfZGqFmXeOPw23kzxldc26twUKeRxnlZm6JuDHxx+HXQKxcUdBDbphN0WZadWhmiJr6OwlX4tz93fK89OzstbeztgKd48PDzYpIbKZNH6gbXuof5vKQqZYGOpywHKPM5w2kLmuOCv7G2rTILKC5Y79EposkNgs3j36NLxFKVlIwM4K/2C+oSxZoKBCrLEJzH0fjhlkZ3UTHgN+Jt0FpT1o2l1WIy7MaVDHRNEGBDudpuEri+RUFhKwsLre3jWU8TSEBUTs+a0UscpWxCbkIDgwTD3NwharurRErTOmNgc2wWjMhs0Yt+2qWq7qWW2WLGp93d9BCzIsa/uCsiYwD/rfBTtpFrfSq2V7/Zd8S4OY5QIBSykjRLoQi1pfoUEL8tVXL07e/P1lSYFn6yIZ/ufGBfrr7y5f/vKb/3nxPMlT5Xd6+63L+9bCycG494tM3G37Zv7L8XH4ghTwzVcvnr/x5uWL9hfvEEiFWN/PDsOFy5IXtsBCblZ4CDPtNiLeSbpbud5Ixjz12lLY5Fcz4msaz5ZX3tuQm0CJq4dANtZXSFeJ9QruF8mxOksqcdJc+3OZ4IHnVWMm+cbkC/1/4FvuKA0kQqxvVu95JgIW3CWHHAeCSzybRsTHfwsfGOKH5CW8d3wYqr0cIj3DjeGFkjB1wxUrRZSZUclMwK4BfJSvUEYiTtrjefCanBH7ZymahtS39Dl+7gpYugRiYZgfZ+lxZSZgQaxw3kJJ0+PZR0uRpRtVOjW43JIFoo2klYbzyFTAIpSIuAir0ln509X7SZ7gLAX70xIoSzeqbGCFY5LDRpepgIVhgX+X8kaa0snNlQT4k3Th6t1oghWeA+8dPc/+bnnmAhaaBbmrPDCPksTDvrjSbJI1LtPA0MOpTaloUvLKd+Qi4LyPlUa4ePhSlOgyhVtoEZeaPGpU1N2sbL+0ReH8jgpzEbBQRELLkcKVlqOl8ly+CrrPP9Ml8AvySFyNk5uAC3VXB8mvNFpLvF2GiKXTCFUU5cPg8yHgDyhHchOwIO5qQUUUnTR9q0oScZcqimzaqMz6GVn7ed8Lz1XAQlFFFCYy99MM8R6KeLOohRcEVV/gqofBZ4asp8FL2qacyV3ABbrSrebrlGoiu3gKDSfivJMw3K16pw6540yAZD0VcTU0dwELhWV+jbmdxgoLklg6Ogy35JZIpkK2RytSdSVW/vgw3KSKwxBwrlnnX/0oKpBiGsLz3SwuCIw6X1qLcjNpG1u7AfQion0ZBtc/rVcrHXfZn5KVulYL7ha5UadvK5vmh1lX2s21yfV+rutyuLCAhzvorny4hmxLrlWMfLTsrvfuL34i0ZdDyxOefUe9Ogn2VYI+9Uyhq8ofztsiU6GFQoVaYGFlrS39nJ9SnjSsu4o2r6WQd3MHnzED/uDzz4rtFV5IDDyOi4fzProZZNtwHoC52Li3aPEKhQtYcEc3+d4M6iStzgIgNcx7eVZbzaIUAQu53wyCFQYFIGu4/32xce84pQlYzocb+RZQdFbW26nOhQGIw2iWV5lJy9IELLhMr9SK5nYNzdyHKw1yw67dsi+mlCpgQSqTOM8ij4F5krQRHgDzYHsk6kNVXekCFlyngvwy06003SwBmIrNOOfRXSMNXghYyPNmkFz8t2eTH6a5sQTAL0gxAjdPFh6tkiVff/Wi+8ZblzmnkR1LMkXgjXfeab395uW/yfgVApnz1lt/aEVM1UweeiZewRsLPEIsca53iCO+Iy41rDFIglxw8U28QuGllHFZXb+6a4Wc7djSV3BHWAHvNAZU5TY3hVLFUkoRr9xUIw/xVsBCESIeY48D3s9LzKMkWtU3iqoJ2GfxCl4LWFhZa2/bnH2hVVVimY0M42Y+MIZCbtBJs0+901M6mXRoPxp0PWhQK4poOQioZZ+3zGTeHR94bTcIOXrYpQpTJQH7Ll7B+4tfEhNbEVORIh4OBreiMzfcDjcg6tsHzYvuTvPEZ/TlU3S+I5rop7/nlQdADXJU5GHM+yreJbEmUVYHSVBTPMw2T0OFgAUn4pIbsoM6wHe1iFdQI2Bh2JB9EyM8QOZI7zLDt7TNa1YlYEEaAjQjvob+wyArZC0x86Yv5ZFJUCdgQY5iGueWuNItWkEhhLKWtLb7VSlgQUR8/OnBNSS3QFqk4q//kjc1n82rFfCIn5JbiItBIvju54fhHe0dRNULWJDkFuJiEAcX7wZ8TVuyahqVELAgbtDZa3ytoGFqqZDqLALlwbx39pKvVWm8TaVacEufLfvpzupaO5TKrWFFFSiQvo+vuYRXxhVnVMLqjlMZCzyOHAcUM6wM+A+7Y8equMyvUtkhGMPM4pa1xl1Y4xoysroVFe6ISlrgcWCN60i1re44tRhDBWtcE2pidcepvAUeR6zx0eHBFRR/VA9XlPE9X6mTeIVaCXiEFH9kPsgblATLsLzNKhRlpKGWAhbErZZuC9zna6ip1ocr2rHClWHabuJlTamtgEccHYWh1FTLVTJUcilgeO1PQqE6C3dE7QU8YhQfQ8ieMkxQSZyr8dpfXtQiC52E4eLYtRnrLcN006ZHOgRK47zBoCSoaLeOMe48IOApjIS8stbuMNOWIbNwe1uOqm/Z+0sUNn+gDJDkFMkMoi6BqXjfVtYXpF3qgGnbWuTrac+RJfNdhwbyK+sbT+2nDiXl3E0W4T5EfBsPCDgFqdxrRZ0OF0W8FmLzNP4zOLSi3e+f0gO4ycmAgBdArPIZ052AzPuzrLLEcHJOSTVi5Z/adygw96d+g7W2xvBjNrQHa5seCDgjxOpYqyyN4M87v7sFSl/WeYGONjj3mjC17E52YvMJPRPRY2ttQ1hbAAAAAAAAAAAAAAAAAAAAAAAA4Jf8P8WdqoAaqCHmAAAAAElFTkSuQmCC)](https://github.com/payOSHQ/payos-demo-reactJS "https://github.com/payOSHQ/payos-demo-reactJS") [Web](https://github.com/payOSHQ/payos-demo-reactJS "https://github.com/payOSHQ/payos-demo-reactJS") [payOS Java spring example](https://github.com/payOSHQ/payos-demo-java-spring "https://github.com/payOSHQ/payos-demo-java-spring") [![Github banner](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAACXBIWXMAADddAAA3XQEZgEZdAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABiOSURBVHgB7Z2/cxtHlsffG0BnytqqxdpeexWZqiXvSO+WCGWXCcw2s5ztRaKyyyRll4nMLpP0F4jKLhMZXiQou8xDl21qTboMZ7pbn01XnS3aBKavXxOwYRk/Zgbzo9/M91NFE6IJkQL62+9Hv36PCAAAAAAAAAAAAAAAAAAAAIBfwQRUsrbWXh40qGWYWmxoefR1M/Z4EszUk89RRCfcsB+GThoDOnn+POwRUAcE7CHLy+3WhUtOiG1DIlCzYYXZYvmzFSzZx5QHTCf27+7ZRyd2KwiJg2/tzw2DgHpHn4QhAe+AgEtGxNq4SB0OrGAjc53PRbtMfiIi7lkzfiDCvmA/YLnLBQIumNU/tUWgHbGq1tp1PBZrLOwC6hkRdsDP7OMuLHWxQMA5I7Fqv0E3xLraV7uTm/vrC+dueJcD3rexdRcWOl8g4BxY+XO7Q4PofSa+od3CLsq5hTZ71Aj2jz8OuwQyBQLOiJFobXy4VXkrmxJ28TN1TcCPIeZsgIAXwIk2iq7bl/EORJuMkZgbEe/AzU4PBJwQyRo3L9GWjWnft3/sEMiC0MbMD8++o71eLzwhEBsIOCYuexxFN+Ei54hNgNkFuQerHB8IeA7nsa25R7C2RdOlBu8gVp4NBDwFCNcPXKwc8I49X94l8Csg4FewrrLEt/fqfvzjGxDyZCDgIWJxeWAeQbh+AyH/ktoLGK6yTlyBSINv1T1Grq2AXYkjm0cE4aqGmXbrnLWunYDdOe7r0W0yvE2gOrDZ7n8fPKzbOXKDasQf19s3mhfME/tu3yBQMbjTuEB/ffOdy99+/fcXtbkRVQsLDHe5XtTJra68BV5dv3o7Cug/7MM1AnWhHTFtvfH7yz98/dWL/6IKU1kLDKsLhnSbhm9V1RpX0gL/49rVm4OA9ghWF9i8pWG6UdXYuFIW2GWYL0b33PU+AF4lMA/63wU7VcpUV0bAcluIIvMElVRgFlIA0jC8WRWXuhIutCSqrHB37cM/EACzaVUpwaVewCvrV+/bfXXbPlwiAOIha+Uvb7zzTuvrv//3f5Ji1LrQwyzzE/uwTQCkJ7RZ6g+0utQqBezGirB5ingXZIHmuDggZcjtoX5gPoR4QVbIWrLe3IdSakvKUBUDS7LKvtpSVYV4F2TNkrXEf7XJrW81JbfUCHhl7eo9Yv53AiBf/vLG2++QTW49IwWoEPBQvNsEQCFwR4uIvRewOyZi/jcCoFB0iNhrAa++t/HIvpD/SgCUAnfefPsPy1bE++Qp3gpYxGsMbREA5dL2WcReCnhYXQXLC3zBWxF7J+BhwgoxL/CNto8xsVcCRrYZ+I1/iS1vBAzxAh34JWIvBCwdNAzzAwJABdx5663Lvf/96sUBlUzplxnOx3aaDwkAXZxwwJtHn4Sltukp9TKD3CqSLhoEgD5asnbdGi6R0iyw9K+6cBG3ioBu5Cri2Uu+VlafrdIscPN1TAIE+pE13Lzo2heXQilJLJdxRqEGqA5rZWWmC3ehh+M8nxIAVaPBm0WPOy1UwGiFAyrOSdPwtSJb8zSpQIajTpapTNim/w3/lHAwbFo2kGkR0MfwvTT2s30PT1imMJBZpvJoDdf4JhVEYRbYj0or7h4fhr96cd1EhyVq21dDPq6zMW14CZ7hRMqhFeozK9jwgqFwkqVbWbMhGpcdovFdu84KKUwqRMDDFrBfUMnY3frW0fNwN873SoFJFNFWQOZ9iLkkxMIS75mIHvdPKYx7VLOyviEC7lCZFBQP5y5gn857+y/5d2nO687HttAd626/D3e7CLjLAT0++4720rxfK+vtOzY4uk8lUtT5cO4CHt7t9WDYGO9bt2ahtqFuM1qiG9aU34NVzhhrbY3hx2xo7/j5YpZruW1Doh/MN1Q2gXlw/MlHdylHchWwT0dGSdznOKyutbcg5AyQ2Dbih9ZFfpCltfLCjRZydqVzrcTiQXkVKq/SIOpShshmcHR4cEU2BnGXCCTjPCm10/+er1iLu525q2nYi+t+ogHx3CgnchOwZJ29sU48OWOZBRBycph5txnxtVyE+zNd8gBXavk65RZC5uJC+5J1HmGIH35+GBYSh9tjjG0b+9xGsmsS3LWvy86iMW4cXBz8o12DnrwPTcNX8jAiuRRy9AObATTkE10qCLEqdgPbHTBtGzI3KSPscUpPzj/tjntiX9ovXeFCYB8PqMcNOmkMyFmy01M6mWXVxJ1bWqLWoEEt+1y3uO3zl41xHy1metctejbtzBa/HAdFfDfLHMQ8emF4svLeRo88mV6ZV4FH5hbYHrlsmcif2FfggK+VcfFahmXZc+T7sUMJiQutUO2bEloxHdjn9aYVLBSBy7pfomV7Hr7M7ISwIV8mY2KLQryfwUvaLuO6nX39HzBZb8gT7GvxgfUE9yhDshfw+sYXvmVmjw8PSu084txqm7F+9etiVe1/uvZDEi5h2d0d4vJT5Vpgs7yGrk+y1pIPsMdCt4pwl6fhw3nwOHmcDWfqQnuVuBph3U4qmZFb3Q/oibWsz4KAwrRFCj4w/L27NBaanLdGcsc2Url20C/J6o4jHkzpPaPGGEtobVNGZPbv8/em0eT6Z1B9fEumDjnpv+QrWW1umR0jDQI/ixps7NYjUEtOl8hHD6eV5bFSJgKWnc7XOUYuYwtqiWSiyUeMuZ1VM7xMBCzWlwDwEE+La1pZaWZhAftsfQHwFdFMFlZ4YQHD+gKQjjNePBZeSMCwvgCkh8ncXPSiw0IChvUFYCEWzkinFrDz340H9y3nYHCpoNZ4f1/bZqQXscKpBTxoUEfDZfaA6bcEaoncSCL/WcgKp3ehIx3us6H4hfegWlz4Tke3FDbpb62lErDcstHSSobhQteWqKljjYqWXPupFKQSMGd4zzVv5MXJs6UJ8JfhFUgdDNJ5tIkFPDx8vkGKaP5G0RsJssOYDdJDJ42hSSzgPusSryPyP1sOcoB1ve9pklmJBexTh4PYGHOdQK1YXW1n1xKoINIksxIJWObOKO2D3EEcXC9MU5/XlSaZlUjAHOhJXr3KhUsKXX+QHta5Vs0g2TpN5kIrqLyaivRuArXAFXAYnYnLpCc8sQWs2H12d0IbEe0QqAVykV8a7ZNOWknc6NgC1uo+O/Ea3iyrNSsoB9eD2rDKTTuJGx3fhVbqPkcDvgvx1hPpBkqejFhJQhI3OpaAJSWv0n1m3vn8s2wbaQNd9F/jDxTOrIrtRscSsLmgL4Mrb9rxp24HBjVG4mGjMR6OWXwUz4VWWAghcS8BQM6V7sqIF9JETM3NFfDwTmWHNGFdZ8S9YJzBa7StzJWOVXw0V8CNH3SJV96k/vf0gAAYQ1zpiPguKaJxcb724rjQHdKEPTrQOnMI5MtwMmCX9NCZ9w1zBcysJ/4V61vkDFqgEEVnw3G0N1PA6krSlB7cg+IYjjvtkgas9ubFwTMF3DzVI15YXxAbRRv9vGYUs13oQFH8C+sLYiJWWE1GerCIgBWd/zYUlsyB8jCGH5MOOrP+52wBq2kKxvs49wVJ6C/pOGpkmt3Xa6qAhwksFV0s2BDqnUEihrODu+Q587qqThWwpgTW2SkEDNLA+6SAWQUd011oPe5zF4UbIA1NJZ4bz7gJOFXAiq4PqthFgX9I3kRDNpqZpsbBUwU8L3j2hgaFBEBq+Bl5zqz5Xupd6OOPXWUNAOkI/E9kzZrvNV3AKjLQ3CUAFuFH/z24WZnoiQJ2Xe0VYP9hBwTAApxd0lGRtbRE8QVsGkrOf/X1OgKe4VrQKlhHZ1NC2okC5oaauao9AmBBNKyjIEhigY2S4d0NwvkvWBgm/pI8Z5ompwlYhQvd7MMCg8WJyH9DME2TwZQvqhDw6SksMFgcZv/XUcD024lfn/RFe3D8LikAJZQgE4wKC7w86euJB3wDUDU4UODJsYnvQrPSKYQAVBVOEgMDAHQwOQZmHUksAOqCoSQWWMkxEgBZoKTuoXoudJzZMQBUGdUCnlbgDUBdQBIL1B4tlYeTUC3gfhPHXWBxtFQeTkK1gM0ALjRYHC2Vh5NQLeBpV6wASITiY9PJAlZQ3C1oufYIvGeZ/GeiJieXUioo7haYSK3rAzxCQRKLkwhYC9YC/44AWAAt/d+mMa2UUokFVtK7GniLlv5vhrg36evTSil1xMBzBj8BMBc1I4QmM+U6of89gkZcuIREFkgPsw4vjnly+6iJAtbQI2gM1TsoKBctJxmRoW8nfX2yBVYSAwtRBAGDheiQAqZpcpqAe6QE6wJdJwBSsLLW7pASkrnQkSIX2lAbiSyQCkUJLJNEwBeMrpGdzd/AjQZp0OO9TSuumijg0yVd/ZbNgG4QAElhHfGvcPRJONGoThSwloFPIxAHg6S4+FfPPeCpBnVqKaWWaiwH4mCQELu+FXltPDWknSpgNqxq9m7zIm0RADEJyLxPSpg1BzuY8SRViSxS9IaAchH32SgaXjArnJ0l4B7porP6J903S0AxcGBukiYalNyFHrxGXVKGMchGgxgYPdlnof9/KQQsmWgtnTl+wpjbSGaBWVgvbUub+zxrCufsC/1GnRVuNV+nOwTANCJzjxRhaHYyeY6AdWWiBTbK4htQGNqsr4NnJ5PntdTpkjLkDZI3igB4FWXW1xHM1uBMAfeXtB0lnWMicx+xMBhHpfWl2QksYaaAh4ksjSJGLAx+iUbra7U3K4ElzO1KaQw/I43YjPTaWnuZQO1ZWbt6T6P1jaO9OG1lu6STVp/NIwK1xm3izNukk+68b5grYI0FHWN0VtbbcKVrzIDNU1LK4GUGAnZxsF4rbDH3UGJZT1bWr97X6Dqfw9158a8QbzKD1jj4nJZNYDxBVrperK5fvW1FoNn72o/zTXFHq3RJMbILNy+aJwRqgXhcRm/c6+AgnuaYYrLy3sY3ijoYTCYwD44/+egugcoiSSuJe/W6zuf1z0eHB1fifG/s4WY2pf2YtBPxnZX3ruo7DwSxqIJ4HczduN8aW8BsaI+qgOFtiLh6VEa8FhNQbGMZ24UWKuFGj4A7XRncKYNNVFZBvEncZyHRfOBKuNEjxJ1e3/gQ1Vq6+eN6+4Yx1bC8jgTus5BIwJVxo3+mLW4XRKwTKZFksqcLVfEKKZn7LCRyoYXV9Y0vKrPbjcNm+/jTj3YIeI9suMMy2Q5ViKTus5DIAguVcqPHkeTW+gassedIgUY/MB9SxcTrMJzYgCQWcH+JHlB16did/Qtkqf1j5c/tjmywhvhBlVzmcRopCqYSu9CCvJBUxR1wDNeLN+Cdo0/CXQKl4Y6HAnPPmKo37uf948MwcVfVxBbYkcLUa0PifBOZRxLzo0VP8YhwV9/beCQeUfXFS2J+U3m2qSywkO+ZMHdlnEQQ/NwNxETUElHZX3jD/qlDBTOyyI0BdZ8/D3sEckFcZRq47hkdqglpklcjmpSWiB/azG2msaL8QxqGN+cJxLlV8gbbn19URtz9HGuR+/aXtJZhNzK8//lhWLVjtVKQm2LN1yO5PXTDird+Vz8X8GhTW+Dltn3RfzRfZGqFmXeOPw23kzxldc26twUKeRxnlZm6JuDHxx+HXQKxcUdBDbphN0WZadWhmiJr6OwlX4tz93fK89OzstbeztgKd48PDzYpIbKZNH6gbXuof5vKQqZYGOpywHKPM5w2kLmuOCv7G2rTILKC5Y79EposkNgs3j36NLxFKVlIwM4K/2C+oSxZoKBCrLEJzH0fjhlkZ3UTHgN+Jt0FpT1o2l1WIy7MaVDHRNEGBDudpuEri+RUFhKwsLre3jWU8TSEBUTs+a0UscpWxCbkIDgwTD3NwharurRErTOmNgc2wWjMhs0Yt+2qWq7qWW2WLGp93d9BCzIsa/uCsiYwD/rfBTtpFrfSq2V7/Zd8S4OY5QIBSykjRLoQi1pfoUEL8tVXL07e/P1lSYFn6yIZ/ufGBfrr7y5f/vKb/3nxPMlT5Xd6+63L+9bCycG494tM3G37Zv7L8XH4ghTwzVcvnr/x5uWL9hfvEEiFWN/PDsOFy5IXtsBCblZ4CDPtNiLeSbpbud5Ixjz12lLY5Fcz4msaz5ZX3tuQm0CJq4dANtZXSFeJ9QruF8mxOksqcdJc+3OZ4IHnVWMm+cbkC/1/4FvuKA0kQqxvVu95JgIW3CWHHAeCSzybRsTHfwsfGOKH5CW8d3wYqr0cIj3DjeGFkjB1wxUrRZSZUclMwK4BfJSvUEYiTtrjefCanBH7ZymahtS39Dl+7gpYugRiYZgfZ+lxZSZgQaxw3kJJ0+PZR0uRpRtVOjW43JIFoo2klYbzyFTAIpSIuAir0ln509X7SZ7gLAX70xIoSzeqbGCFY5LDRpepgIVhgX+X8kaa0snNlQT4k3Th6t1oghWeA+8dPc/+bnnmAhaaBbmrPDCPksTDvrjSbJI1LtPA0MOpTaloUvLKd+Qi4LyPlUa4ePhSlOgyhVtoEZeaPGpU1N2sbL+0ReH8jgpzEbBQRELLkcKVlqOl8ly+CrrPP9Ml8AvySFyNk5uAC3VXB8mvNFpLvF2GiKXTCFUU5cPg8yHgDyhHchOwIO5qQUUUnTR9q0oScZcqimzaqMz6GVn7ed8Lz1XAQlFFFCYy99MM8R6KeLOohRcEVV/gqofBZ4asp8FL2qacyV3ABbrSrebrlGoiu3gKDSfivJMw3K16pw6540yAZD0VcTU0dwELhWV+jbmdxgoLklg6Ogy35JZIpkK2RytSdSVW/vgw3KSKwxBwrlnnX/0oKpBiGsLz3SwuCIw6X1qLcjNpG1u7AfQion0ZBtc/rVcrHXfZn5KVulYL7ha5UadvK5vmh1lX2s21yfV+rutyuLCAhzvorny4hmxLrlWMfLTsrvfuL34i0ZdDyxOefUe9Ogn2VYI+9Uyhq8ofztsiU6GFQoVaYGFlrS39nJ9SnjSsu4o2r6WQd3MHnzED/uDzz4rtFV5IDDyOi4fzProZZNtwHoC52Li3aPEKhQtYcEc3+d4M6iStzgIgNcx7eVZbzaIUAQu53wyCFQYFIGu4/32xce84pQlYzocb+RZQdFbW26nOhQGIw2iWV5lJy9IELLhMr9SK5nYNzdyHKw1yw67dsi+mlCpgQSqTOM8ij4F5krQRHgDzYHsk6kNVXekCFlyngvwy06003SwBmIrNOOfRXSMNXghYyPNmkFz8t2eTH6a5sQTAL0gxAjdPFh6tkiVff/Wi+8ZblzmnkR1LMkXgjXfeab395uW/yfgVApnz1lt/aEVM1UweeiZewRsLPEIsca53iCO+Iy41rDFIglxw8U28QuGllHFZXb+6a4Wc7djSV3BHWAHvNAZU5TY3hVLFUkoRr9xUIw/xVsBCESIeY48D3s9LzKMkWtU3iqoJ2GfxCl4LWFhZa2/bnH2hVVVimY0M42Y+MIZCbtBJs0+901M6mXRoPxp0PWhQK4poOQioZZ+3zGTeHR94bTcIOXrYpQpTJQH7Ll7B+4tfEhNbEVORIh4OBreiMzfcDjcg6tsHzYvuTvPEZ/TlU3S+I5rop7/nlQdADXJU5GHM+yreJbEmUVYHSVBTPMw2T0OFgAUn4pIbsoM6wHe1iFdQI2Bh2JB9EyM8QOZI7zLDt7TNa1YlYEEaAjQjvob+wyArZC0x86Yv5ZFJUCdgQY5iGueWuNItWkEhhLKWtLb7VSlgQUR8/OnBNSS3QFqk4q//kjc1n82rFfCIn5JbiItBIvju54fhHe0dRNULWJDkFuJiEAcX7wZ8TVuyahqVELAgbtDZa3ytoGFqqZDqLALlwbx39pKvVWm8TaVacEufLfvpzupaO5TKrWFFFSiQvo+vuYRXxhVnVMLqjlMZCzyOHAcUM6wM+A+7Y8equMyvUtkhGMPM4pa1xl1Y4xoysroVFe6ISlrgcWCN60i1re44tRhDBWtcE2pidcepvAUeR6zx0eHBFRR/VA9XlPE9X6mTeIVaCXiEFH9kPsgblATLsLzNKhRlpKGWAhbErZZuC9zna6ip1ocr2rHClWHabuJlTamtgEccHYWh1FTLVTJUcilgeO1PQqE6C3dE7QU8YhQfQ8ieMkxQSZyr8dpfXtQiC52E4eLYtRnrLcN006ZHOgRK47zBoCSoaLeOMe48IOApjIS8stbuMNOWIbNwe1uOqm/Z+0sUNn+gDJDkFMkMoi6BqXjfVtYXpF3qgGnbWuTrac+RJfNdhwbyK+sbT+2nDiXl3E0W4T5EfBsPCDgFqdxrRZ0OF0W8FmLzNP4zOLSi3e+f0gO4ycmAgBdArPIZ052AzPuzrLLEcHJOSTVi5Z/adygw96d+g7W2xvBjNrQHa5seCDgjxOpYqyyN4M87v7sFSl/WeYGONjj3mjC17E52YvMJPRPRY2ttQ1hbAAAAAAAAAAAAAAAAAAAAAAAA4Jf8P8WdqoAaqCHmAAAAAElFTkSuQmCC)](https://github.com/payOSHQ/payos-demo-java-spring "https://github.com/payOSHQ/payos-demo-java-spring") [Backend](https://github.com/payOSHQ/payos-demo-java-spring "https://github.com/payOSHQ/payos-demo-java-spring") ## Luồng hoạt động[​](#luồng-hoạt-động "Đường dẫn trực tiếp đến Luồng hoạt động") * Bước 1: Khách hàng thực hiện mua hàng trên Website hoặc ứng dụng của merchant và lựa chọn thanh toán trực tuyến Napas 247 cho đơn hàng. * Bước 2: Website hoặc ứng dụng của merchant tiến hành gọi [tạo link thanh toán](/docs/api/.md#tag/payment-request/operation/payment-request), payOS sẽ kiểm tra dữ liệu và trả về kết quả chứa link thanh toán. Khi hệ thống của merchant nhận kết quả link thanh toán cần chuyển hướng khách hàng của bạn đến trang checkout của payOS bằng cách mở link thanh toán từ kết quả. * Bước 3: Khách hàng sử dụng ứng dụng ngân hàng để quét mã VietQR từ link thanh toán. * Bước 4: Giao dịch ghi nhận thành công tại ngân hàng, payOS sẽ trả kết quả thành công về `returnUrl` gồm: trạng thái, mã đơn hàng, mã link thanh toán, ... Từ kết quả nhận được trên `returnUrl` Website hoặc ứng dụng của merchant hiển thị giao diện thành công. * Bước 5: Sau khi có kết quả ở giao diện, đồng thời payOS sẽ gửi một [kết quả](/docs/tich-hop-webhook/kiem-tra-du-lieu-voi-signature.md) với đầy đủ thông tin thanh toán tới Webhook của cửa hàng được thiết lập trên , sau đó merchant cập nhật trạng thái đơn hàng phù hợp. thông tin [Chi tiết API tạo link thanh toán](/docs/api/.md#tag/payment-request/operation/payment-request) [Chi tiết dữ liệu gửi đến webhook của merchant](/docs/du-lieu-tra-ve/webhook.md) ## Cách tích hợp payOS với hệ thống của Merchant[​](#cách-tích-hợp-payos-với-hệ-thống-của-merchant "Đường dẫn trực tiếp đến Cách tích hợp payOS với hệ thống của Merchant") * Code để [tạo link thanh toán](/docs/api/.md#tag/payment-request/operation/payment-request), hoặc dùng [SDKs có sẵn của payOS](/docs/sdks/intro.md) * Code xử lý `returnUrl` và `cancelUrl` để nhận thông báo kết quả Thanh toán và Huỷ đơn hàng trên giao diện, hoặc sử dụng [payOS-checkout.js](/docs/sdks/front-end/script-js.md) * Code [webhook](https://www.redhat.com/en/topics/automation/what-is-a-webhook) để nhận kết quả thanh toán của một đơn hàng. ## Chương trình đối tác tích hợp[​](#chương-trình-đối-tác-tích-hợp "Đường dẫn trực tiếp đến Chương trình đối tác tích hợp") "Đối tác tích hợp" là chương trình tiếp thị liên kết (Affiliate Marketing) dành cho các lập trình viên, nhà phát triển khi tích hợp cổng thanh toán payOS vào Web/App của doanh nghiệp/khách hàng, qua đó giúp hàng triệu Website tiếp cận giải pháp cổng thanh toán không qua trung gian. * Chiết khấu 100đ/giao dịch [Chi tiết thông tin chương trình](/docs/developer-program.md) ## Rate limits[​](#rate-limits "Đường dẫn trực tiếp đến Rate limits") Để đảm bảo dịch vụ ổn định, payOS API xác định giới hạn truy cập trên mỗi lần gọi. Nếu thực hiện quá nhiều yêu cầu cùng một lúc, thì bạn sẽ nhận một kết quả HTTP là 429 Too Many Requests ---