Flutter - การรับชำระเงิน
เรียนรู้วิธีการรับชำระเงินในแอปพลิเคชัน Flutter โดยใช้ Omise คำแนะนำนี้ครอบคลุมการรวมการชำระเงินข้ามแพลตฟอร์มที่มีประสิทธิภาพในตัวของ iOS/Android ผ่านช่องสัญญาณแพลตฟอร์ม
ภาพรวม
การรวม Omise ในแอปพลิเคชัน Flutter ให้บริการคุณด้วยการรวมชำระเงินข้ามแพลตฟอร์มที่มีประสิทธิภาพในตัวของ SDK ผ่านช่องสัญญาณแพลตฟอร์ม
คุณสมบัติหลัก
- ข้ามแพลตฟอร์ม - ชุดรหัส Dart แบบเดียวสำหรับ iOS/Android
- ประสิทธิภาพในตัว - ใช้ประโยชน์จาก SDK ในตัวผ่านช่องสัญญาณแพลตฟอร์ม
- ความปลอดภัยของประเภท - การพิมพ์ที่หนักแน่นของ Dart เพื่อความเชื่อถือได้
- Hot Reload - การพัฒนาอย่างรวดเร็วด้วยการโหลดร้อนของ Flutter
- Material & Cupertino - ส่วนประกอบ UI เฉพาะแพลตฟอร์ม
- Null Safety - Dart สมัยใหม่ที่มี Null Safety
ข้อกำหนดเบื้องต้น
ก่อนที่จะใช้งานการรับชำระเงิน:
- Flutter SDK 3.0 ขึ้นไปที่ได้รับการติดตั้ง
- สภาพแวดล้อมการพัฒนา iOS/Android ในตัว
- API ด้านหลังสำหรับการสร้างใบเรียกเก็บเงิน
- บัญชี Omise พร้อมกับคีย์ API
การติดตั้ง
เพิ่มการพึ่งพา
เพิ่มสิ่งต่อไปนี้ใน pubspec.yaml:
dependencies:
flutter:
sdk: flutter
http: ^1.1.0
webview_flutter: ^4.4.0
url_launcher: ^6.2.0
dev_dependencies:
flutter_test:
sdk: flutter
การตั้งค่าช่องสัญญาณแพลตฟอร์ม
สร้างช่องสัญญาณแพลตฟอร์มสำหรับการรวม SDK ในตัว:
// lib/services/omise_service.dart
import 'package:flutter/services.dart';
class OmiseService {
static const MethodChannel _channel = MethodChannel('omise_payment');
final String publicKey;
OmiseService({required this.publicKey});
Future<OmiseToken> createToken({
required String cardNumber,
required String cardholderName,
required int expiryMonth,
required int expiryYear,
required String cvv,
}) async {
try {
final result = await _channel.invokeMethod('createToken', {
'publicKey': publicKey,
'cardNumber': cardNumber,
'cardholderName': cardholderName,
'expiryMonth': expiryMonth,
'expiryYear': expiryYear,
'cvv': cvv,
});
return OmiseToken.fromJson(result);
} on PlatformException catch (e) {
throw OmiseException(
message: e.message ?? 'Failed to create token',
code: e.code,
);
}
}
}
การใช้งาน iOS ในตัว
สร้าง ios/Runner/OmisePlugin.swift:
import Flutter
import OmiseSDK
class OmisePlugin: NSObject, FlutterPlugin {
static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(
name: "omise_payment",
binaryMessenger: registrar.messenger()
)
let instance = OmisePlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "createToken":
createToken(call: call, result: result)
default:
result(FlutterMethodNotImplemented)
}
}
private func createToken(call: FlutterMethodCall, result: @escaping FlutterResult) {
guard let args = call.arguments as? [String: Any],
let publicKey = args["publicKey"] as? String,
let cardNumber = args["cardNumber"] as? String,
let cardholderName = args["cardholderName"] as? String,
let expiryMonth = args["expiryMonth"] as? Int,
let expiryYear = args["expiryYear"] as? Int,
let cvv = args["cvv"] as? String else {
result(FlutterError(code: "INVALID_ARGS", message: "Invalid arguments", details: nil))
return
}
let client = OmiseSDKClient(publicKey: publicKey)
let request = OmiseTokenRequest(
name: cardholderName,
number: cardNumber,
expirationMonth: expiryMonth,
expirationYear: expiryYear,
securityCode: cvv
)
client.send(request) { tokenResult in
switch tokenResult {
case .success(let token):
result([
"id": token.id,
"object": token.object,
"livemode": token.livemode,
])
case .failure(let error):
result(FlutterError(
code: "TOKEN_ERROR",
message: error.localizedDescription,
details: nil
))
}
}
}
}
การใช้งาน Android ในตัว
สร้าง android/app/src/main/kotlin/OmisePlugin.kt:
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import co.omise.android.OmiseClient
import co.omise.android.models.CardParam
import co.omise.android.models.Token
class OmisePlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
private lateinit var channel: MethodChannel
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(binding.binaryMessenger, "omise_payment")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
when (call.method) {
"createToken" -> createToken(call, result)
else -> result.notImplemented()
}
}
private fun createToken(call: MethodCall, result: MethodChannel.Result) {
val publicKey = call.argument<String>("publicKey") ?: run {
result.error("INVALID_ARGS", "Missing public key", null)
return
}
val cardNumber = call.argument<String>("cardNumber") ?: ""
val cardholderName = call.argument<String>("cardholderName") ?: ""
val expiryMonth = call.argument<Int>("expiryMonth") ?: 0
val expiryYear = call.argument<Int>("expiryYear") ?: 0
val cvv = call.argument<String>("cvv") ?: ""
val client = OmiseClient(publicKey)
val cardParam = CardParam(
name = cardholderName,
number = cardNumber,
expirationMonth = expiryMonth,
expirationYear = expiryYear,
securityCode = cvv
)
client.send(cardParam, object : RequestListener<Token> {
override fun onRequestSucceed(token: Token) {
result.success(mapOf(
"id" to token.id,
"object" to token.`object`,
"livemode" to token.livemode
))
}
override fun onRequestFailed(throwable: Throwable) {
result.error(
"TOKEN_ERROR",
throwable.message ?: "Failed to create token",
null
)
}
})
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
}