import 'dart:ffi'; import 'dart:io'; import 'package:ffi/ffi.dart'; class MidtransTransaction extends Struct { Pointer order_id; @Long() int gross_amount; } class MidtransBanktransfer extends Struct { Pointer bank; Pointer va_number; Pointer bca; Pointer permata; } typedef MidtransStatus = Pointer Function(Pointer); typedef MidtransBanktransferNew = MidtransBanktransfer Function(Pointer); typedef MidtransChargeBanktransfer = Pointer Function(MidtransBanktransfer, MidtransTransaction); class Midtrans { final dylib = Platform.isAndroid ? DynamicLibrary.open('libmidtrans.so') : DynamicLibrary.process(); Midtrans(String apiKey, String pem) { final apiKeyUtf8 = apiKey.toNativeUtf8(); final pemUtf8 = pem.toNativeUtf8(); dylib.lookupFunction , Pointer), void Function(Pointer, Pointer)> ('midtrans_init')(apiKeyUtf8, pemUtf8); calloc.free(apiKeyUtf8); calloc.free(pemUtf8); } String chargeBanktransfer(String bank, String orderID, int grossAmount) { final bankUtf8 = bank.toNativeUtf8(); final order_id = orderID.toNativeUtf8(); final vaNumber = dylib.lookupFunction ('midtrans_charge_banktransfer') (dylib.lookupFunction ('midtrans_banktransfer_new')(bankUtf8), dylib.lookupFunction , Long), MidtransTransaction Function (Pointer, int)> ('midtrans_transaction_new')(order_id, grossAmount)) .toDartString(); calloc.free(bankUtf8); calloc.free(order_id); return vaNumber; } String status(String orderID) { final order_id = orderID.toNativeUtf8(); final status = dylib.lookupFunction ('midtrans_status')(order_id).toDartString(); calloc.free(order_id); return status; } void cleanup() { dylib.lookupFunction ('midtrans_cleanup')(); } }