Skip to main content
Version: 1.1.0 (Latest)

Tích hợp SDK iOS Native

Thư viện TingeePaySDK giúp các ứng dụng iOS Native dễ dàng nhúng màn hình thanh toán trực quan dưới dạng Bottom Sheet hoặc Toàn màn hình.

SPM Compatible iOS 14.0+


1. Cài đặt SDK

Bạn có thể cài đặt TingeePaySDK cho ứng dụng iOS bằng một trong hai cách dưới đây:

Đây là phương thức cài đặt được khuyến nghị.

  1. Mở dự án của bạn trên Xcode.
  2. Chọn File > Add Packages... (hoặc Add Package Dependencies...).
  3. Nhập URL của kho lưu trữ Github chứa TingeePay SDK:
    https://github.com/tingeedev/tingee-pay-sdk-ios.git
  4. Chọn quy tắc phiên bản (ví dụ: Up to Next Major Version) và nhấn Add Package.

2. Cấu hình quyền hệ thống

Để hỗ trợ tính năng lưu mã QR thanh toán vào album ảnh của thiết bị (khi người dùng bấm nút "Tải mã QR" trên giao diện cổng), bạn bắt buộc phải cấu hình quyền truy cập thư viện ảnh trong tệp Info.plist.

Mở tệp Info.plist dưới dạng Source Code và thêm khóa sau:

<key>NSPhotoLibraryAddUsageDescription</key>
<string>Ứng dụng cần quyền để lưu mã QR thanh toán vào thư viện ảnh của bạn.</string>

[!WARNING] Nếu thiếu cấu hình này, ứng dụng sẽ bị crash ngay lập tức khi người dùng nhấn nút lưu mã QR trên màn hình thanh toán.


3. Hướng dẫn Tích hợp nhanh

Tùy theo cấu trúc dự án của bạn là UIKit hay SwiftUI, hãy tham khảo hướng dẫn tương ứng:

Tại UIViewController nơi bạn muốn gọi thanh toán (ví dụ: nút thanh toán được bấm):

CheckoutViewController.swift
import UIKit
import TingeePaySDK

class CheckoutViewController: UIViewController {

func openPayment(checkoutUrlString: String) {
guard let checkoutUrl = URL(string: checkoutUrlString) else { return }

// Gọi SDK để hiển thị cổng thanh toán
TingeePay.presentCheckout(
from: self,
checkoutUrl: checkoutUrl,
style: .bottomSheet, // Hoặc .fullScreen
delegate: self
)
}
}

4. Lắng nghe & Xử lý kết quả

Để nhận các sự kiện từ màn hình thanh toán, bạn cần tuân thủ và kế thừa protocol TingeePayCheckoutDelegate:

extension CheckoutViewController: TingeePayCheckoutDelegate {

/// Sự kiện: Thanh toán hoàn tất hoặc kết thúc (Thành công, Lỗi, Hết hạn...)
func tingeePayCheckoutDidFinish(with result: TingeePaymentResult) {
print("Trạng thái thanh toán: \(result.status.rawValue)")
print("Mã đơn hàng: \(result.orderId ?? "")")

switch result.status {
case .success:
// Xử lý khi thanh toán thành công (ví dụ: Chuyển màn hình cảm ơn)
print("Thanh toán thành công!")

case .failed:
// Giao dịch thanh toán thất bại
print("Lỗi thanh toán: \(result.errorMessage ?? "")")

case .cancelled:
// Giao dịch bị hủy bỏ trên cổng
print("Giao dịch đã bị huỷ.")

case .expired:
// Hết hạn thời gian thanh toán
print("Đơn hàng đã hết hạn thanh toán.")

case .error:
// Lỗi hệ thống phát sinh
print("Lỗi hệ thống cổng thanh toán.")
}
}

/// Sự kiện: Người dùng chủ động nhấn nút "Đóng" (X) hoặc vuốt tắt Bottom Sheet để thoát
func tingeePayCheckoutDidCancel() {
print("Người dùng đã thoát màn hình thanh toán.")
}

/// Sự kiện: Lỗi phát sinh khi SDK cố gắng tải cổng thanh toán (ví dụ: Sai định dạng URL, Mất kết nối Internet...)
func tingeePayCheckoutDidFail(with error: Error) {
print("Lỗi khởi tạo/tải màn hình thanh toán: \(error.localizedDescription)")
}
}

5. Mô hình dữ liệu

TingeePaymentResult

Đối tượng chứa kết quả giao dịch được SDK trả về qua callback tingeePayCheckoutDidFinish.

Thuộc tínhKiểu dữ liệuMô tả
statusTingeePaymentStatusTrạng thái cuối cùng của giao dịch.
orderIdString?Mã đơn hàng trên hệ thống của bạn (Mã đã truyền vào khi tạo link thanh toán).
errorMessageString?Thông báo lỗi chi tiết (nếu có).

TingeePaymentStatus

Là một Enum đại diện cho các trạng thái giao dịch:

  • .success: Giao dịch thành công.
  • .failed: Giao dịch thất bại.
  • .cancelled: Giao dịch bị hủy.
  • .expired: Giao dịch hết hạn thanh toán.
  • .error: Giao dịch gặp lỗi hệ thống.

6. Xử lý sự cố thường gặp

Nút "Tải mã QR" không hoạt động

  • Nguyên nhân: Chưa cấu hình key NSPhotoLibraryAddUsageDescription trong tệp Info.plist.
  • Cách khắc phục: Xem lại bước cấu hình quyền hệ thống và bổ sung key này vào file plist của bạn.

Test trên môi trường Sandbox

  • SDK Mobile tự động chuyển môi trường dựa vào URL. Nếu checkoutUrl bắt đầu bằng URL Sandbox của Tingee, SDK sẽ tự hiểu và hiển thị giao diện Sandbox.