import 'dart:convert'; import 'dart:developer'; import 'dart:io'; import 'dart:math' as maths; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:driver/constant/collection_name.dart'; import 'package:driver/constant/constant.dart'; import 'package:driver/constant/show_toast_dialog.dart'; import 'package:driver/models/cab_order_model.dart'; import 'package:driver/models/order_model.dart'; import 'package:driver/models/parcel_order_model.dart'; import 'package:driver/models/payment_model/flutter_wave_model.dart'; import 'package:driver/models/payment_model/mercado_pago_model.dart'; import 'package:driver/models/payment_model/mid_trans.dart'; import 'package:driver/models/payment_model/orange_money.dart'; import 'package:driver/models/payment_model/pay_fast_model.dart'; import 'package:driver/models/payment_model/pay_stack_model.dart'; import 'package:driver/models/payment_model/paypal_model.dart'; import 'package:driver/models/payment_model/razorpay_model.dart'; import 'package:driver/models/payment_model/stripe_model.dart'; import 'package:driver/models/payment_model/xendit.dart'; import 'package:driver/models/rental_order_model.dart'; import 'package:driver/models/user_model.dart'; import 'package:driver/models/wallet_transaction_model.dart'; import 'package:driver/models/withdraw_method_model.dart'; import 'package:driver/models/withdrawal_model.dart'; import 'package:driver/payment/MercadoPagoScreen.dart'; import 'package:driver/payment/PayFastScreen.dart'; import 'package:driver/payment/midtrans_screen.dart'; import 'package:driver/payment/orangePayScreen.dart'; import 'package:driver/payment/paystack/pay_stack_screen.dart'; import 'package:driver/payment/paystack/pay_stack_url_model.dart'; import 'package:driver/payment/paystack/paystack_url_genrater.dart'; import 'package:driver/payment/stripe_failed_model.dart'; import 'package:driver/payment/xenditModel.dart'; import 'package:driver/payment/xenditScreen.dart'; import 'package:driver/themes/app_them_data.dart'; import 'package:driver/utils/fire_store_utils.dart'; import 'package:driver/utils/preferences.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart' as flutterStipe; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:razorpay_flutter/razorpay_flutter.dart'; import 'package:uuid/uuid.dart'; class WalletController extends GetxController { RxBool isLoading = true.obs; Rx topUpAmountController = TextEditingController().obs; RxString selectedPaymentMethod = "".obs; Rx amountTextFieldController = TextEditingController().obs; Rx noteTextFieldController = TextEditingController().obs; Rx userModel = UserModel().obs; RxList walletTopTransactionList = [].obs; RxList withdrawalList = [].obs; RxList dailyEarningList = [].obs; RxList monthlyEarningList = [].obs; RxList yearlyEarningList = [].obs; RxList dailyParcelEarningList = [].obs; RxList monthlyParcelEarningList = [].obs; RxList yearlyParcelEarningList = [].obs; RxList dailyRentalEarningList = [].obs; RxList monthlyRentalEarningList = [].obs; RxList yearlyRentalEarningList = [].obs; RxList dailyCabEarningList = [].obs; RxList monthlyCabEarningList = [].obs; RxList yearlyCabEarningList = [].obs; RxList dropdownValue = ["Daily", "Monthly", "Yearly"].obs; RxString selectedDropDownValue = "Daily".obs; RxInt selectedTabIndex = 0.obs; RxInt selectedValue = 0.obs; Rx withdrawMethodModel = WithdrawMethodModel().obs; @override void onInit() { // TODO: implement onInit getWalletTransaction(); getPaymentSettings(); super.onInit(); } Rx payFastModel = PayFastModel().obs; Rx mercadoPagoModel = MercadoPagoModel().obs; Rx payPalModel = PayPalModel().obs; Rx stripeModel = StripeModel().obs; Rx flutterWaveModel = FlutterWaveModel().obs; Rx payStackModel = PayStackModel().obs; Rx razorPayModel = RazorPayModel().obs; Rx midTransModel = MidTrans().obs; Rx orangeMoneyModel = OrangeMoney().obs; Rx xenditModel = Xendit().obs; Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then( (value) { payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); flutterStipe.Stripe.publishableKey = stripeModel.value.clientpublishableKey.toString(); flutterStipe.Stripe.merchantIdentifier = 'eMart Driver'; flutterStipe.Stripe.instance.applySettings(); setRef(); razorPay.on(Razorpay.EVENT_PAYMENT_SUCCESS, handlePaymentSuccess); razorPay.on(Razorpay.EVENT_EXTERNAL_WALLET, handleExternalWaller); razorPay.on(Razorpay.EVENT_PAYMENT_ERROR, handlePaymentError); }, ); } Future getWalletTransaction() async { await FireStoreUtils.getWalletTransaction().then( (value) { if (value != null) { walletTopTransactionList.value = value; } }, ); await FireStoreUtils.getWithdrawHistory().then( (value) { if (value != null) { withdrawalList.value = value; } }, ); DateTime nowDate = DateTime.now(); await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then( (value) { if (value != null) { userModel.value = value; } }, ); // if(userModel.value.serviceType == "delivery-service"){ // await FireStoreUtils.fireStore // .collection(CollectionName.vendorOrders) // .where('driverID', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year, nowDate.month, nowDate.day))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // OrderModel dailyEarningModel = OrderModel.fromJson(element.data()); // dailyEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // // await FireStoreUtils.fireStore // .collection(CollectionName.vendorOrders) // .where('driverID', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year, nowDate.month))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // OrderModel dailyEarningModel = OrderModel.fromJson(element.data()); // monthlyEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // // await FireStoreUtils.fireStore // .collection(CollectionName.vendorOrders) // .where('driverID', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // OrderModel dailyEarningModel = OrderModel.fromJson(element.data()); // yearlyEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // } // else if(userModel.value.serviceType == "parcel_delivery"){ // await FireStoreUtils.fireStore // .collection(CollectionName.parcelOrders) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year, nowDate.month, nowDate.day))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // ParcelOrderModel dailyEarningModel = ParcelOrderModel.fromJson(element.data()); // dailyParcelEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // // await FireStoreUtils.fireStore // .collection(CollectionName.parcelOrders) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year, nowDate.month))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // ParcelOrderModel dailyEarningModel = ParcelOrderModel.fromJson(element.data()); // monthlyParcelEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // // await FireStoreUtils.fireStore // .collection(CollectionName.parcelOrders) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // ParcelOrderModel dailyEarningModel = ParcelOrderModel.fromJson(element.data()); // yearlyParcelEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // } // else if(userModel.value.serviceType == "rental-service"){ // await FireStoreUtils.fireStore // .collection(CollectionName.rentalOrders) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year, nowDate.month, nowDate.day))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // RentalOrderModel dailyEarningModel = RentalOrderModel.fromJson(element.data()); // dailyRentalEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // // await FireStoreUtils.fireStore // .collection(CollectionName.rentalOrders) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year, nowDate.month))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // RentalOrderModel dailyEarningModel = RentalOrderModel.fromJson(element.data()); // monthlyRentalEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // // await FireStoreUtils.fireStore // .collection(CollectionName.rentalOrders) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // RentalOrderModel dailyEarningModel = RentalOrderModel.fromJson(element.data()); // yearlyRentalEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // } // else if(userModel.value.serviceType == "cab-service"){ // await FireStoreUtils.fireStore // .collection(CollectionName.ridesBooking) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year, nowDate.month, nowDate.day))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // CabOrderModel dailyEarningModel = CabOrderModel.fromJson(element.data()); // dailyCabEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // // await FireStoreUtils.fireStore // .collection(CollectionName.ridesBooking) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year, nowDate.month))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // CabOrderModel dailyEarningModel = CabOrderModel.fromJson(element.data()); // monthlyCabEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // // await FireStoreUtils.fireStore // .collection(CollectionName.ridesBooking) // .where('driverId', isEqualTo: Constant.userModel!.id.toString()) // .where('createdAt', isGreaterThanOrEqualTo: Timestamp.fromDate(DateTime(nowDate.year))) // .orderBy('createdAt', descending: true) // .get() // .then((value) { // for (var element in value.docs) { // CabOrderModel dailyEarningModel = CabOrderModel.fromJson(element.data()); // yearlyCabEarningList.add(dailyEarningModel); // } // }).catchError((error) { // log(error.toString()); // }); // } await getPaymentMethod(); isLoading.value = false; } Future getPaymentMethod() async { await FireStoreUtils.fireStore.collection(CollectionName.settings).doc("razorpaySettings").get().then((user) { try { razorPayModel.value = RazorPayModel.fromJson(user.data() ?? {}); } catch (e) { debugPrint('FireStoreUtils.getUserByID failed to parse user object ${user.id}'); } }); await FireStoreUtils.fireStore.collection(CollectionName.settings).doc("paypalSettings").get().then((paypalData) { try { payPalModel.value = PayPalModel.fromJson(paypalData.data() ?? {}); } catch (error) { debugPrint(error.toString()); } }); await FireStoreUtils.fireStore.collection(CollectionName.settings).doc("stripeSettings").get().then((paypalData) { try { stripeModel.value = StripeModel.fromJson(paypalData.data() ?? {}); } catch (error) { debugPrint(error.toString()); } }); await FireStoreUtils.fireStore.collection(CollectionName.settings).doc("flutterWave").get().then((paypalData) { try { flutterWaveModel.value = FlutterWaveModel.fromJson(paypalData.data() ?? {}); } catch (error) { debugPrint(error.toString()); } }); await FireStoreUtils.getWithdrawMethod().then( (value) { if (value != null) { withdrawMethodModel.value = value; } }, ); } Future walletTopUp() async { WalletTransactionModel transactionModel = WalletTransactionModel( id: Constant.getUuid(), amount: double.parse(topUpAmountController.value.text), date: Timestamp.now(), paymentMethod: selectedPaymentMethod.value, transactionUser: "user", userId: FireStoreUtils.getCurrentUid(), isTopup: true, note: "Wallet Top-up", paymentStatus: "success"); await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { if (value == true) { await FireStoreUtils.updateUserWallet(amount: topUpAmountController.value.text, userId: FireStoreUtils.getCurrentUid()) .then((value) { getWalletTransaction(); Get.back(); }); } }); ShowToastDialog.showToast("Amount Top-up successfully".tr); } // final _flutterPaypalNativePlugin = FlutterPaypalNative.instance; // void initPayPal() async { // //set debugMode for error logging // FlutterPaypalNative.isDebugMode = paytmModel.value.isSandboxEnabled == true ? true : false; // //initiate payPal plugin // await _flutterPaypalNativePlugin.init( // //your app id !!! No Underscore!!! see readme.md for help // returnUrl: "com.parkme://paypalpay", // //client id from developer dashboard // clientID: payPalModel.value.paypalClient.toString(), // //sandbox, staging, live etc // payPalEnvironment: payPalModel.value.isLive == false ? FPayPalEnvironment.sandbox : FPayPalEnvironment.live, // //what currency do you plan to use? default is US dollars // currencyCode: FPayPalCurrencyCode.usd, // //action paynow? // action: FPayPalUserAction.payNow, // ); // //call backs for payment // _flutterPaypalNativePlugin.setPayPalOrderCallback( // callback: FPayPalOrderCallback( // onCancel: () { // //user canceled the payment // ShowToastDialog.showToast("Payment canceled"); // }, // onSuccess: (data) { // //successfully paid // //remove all items from queue // // _flutterPaypalNativePlugin.removeAllPurchaseItems(); // ShowToastDialog.showToast("Payment Successful!!"); // walletTopUp(); // }, // onError: (data) { // //an error occured // ShowToastDialog.showToast("error: ${data.reason}"); // }, // onShippingChange: (data) { // //the user updated the shipping address // ShowToastDialog.showToast("shipping change: ${data.shippingChangeAddress?.adminArea1 ?? ""}"); // }, // ), // ); // } //Paypal void paypalPaymentSheet(String amount, context) { Navigator.of(context).push( MaterialPageRoute( builder: (BuildContext context) => UsePaypal( sandboxMode: payPalModel.value.isLive == true ? false : true, clientId: payPalModel.value.paypalClient ?? '', secretKey: payPalModel.value.paypalSecret ?? '', returnURL: "com.parkme://paypalpay", cancelURL: "com.parkme://paypalpay", transactions: [ { "amount": { "total": amount, "currency": "USD", "details": {"subtotal": amount} }, } ], note: "Contact us for any questions on your order.", onSuccess: (Map params) async { log("onSuccess: $params"); getWalletTransaction(); ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { log("onError: $error"); Get.back(); ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { log("onError: $params"); Get.back(); ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }), ), ); } // Strip Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { Map? paymentIntentData = await createStripeIntent(amount: amount); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); } else { await flutterStipe.Stripe.instance.initPaymentSheet( paymentSheetParameters: flutterStipe.SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, googlePay: const flutterStipe.PaymentSheetGooglePay( merchantCountryCode: 'US', testEnv: true, currencyCode: "USD", ), customFlow: true, style: ThemeMode.system, appearance: flutterStipe.PaymentSheetAppearance( colors: flutterStipe.PaymentSheetAppearanceColors( primary: AppThemeData.primary300, ), ), merchantDisplayName: 'GoRide')); displayStripePaymentSheet(amount: amount); } } catch (e, s) { log("$e \n$s"); ShowToastDialog.showToast("exception:$e \n$s"); } } Future displayStripePaymentSheet({required String amount}) async { try { await flutterStipe.Stripe.instance.presentPaymentSheet().then((value) { ShowToastDialog.showToast("Payment successfully".tr); walletTopUp(); }); } on flutterStipe.StripeException catch (e) { var lo1 = jsonEncode(e); var lo2 = jsonDecode(lo1); StripePayFailedModel lom = StripePayFailedModel.fromJson(lo2); ShowToastDialog.showToast(lom.error.message); } catch (e) { ShowToastDialog.showToast(e.toString()); } } Future createStripeIntent({required String amount}) async { try { Map body = { 'amount': ((double.parse(amount) * 100).round()).toString(), 'currency': "USD", 'payment_method_types[]': 'card', "description": "Strip Payment", "shipping[name]": userModel.value.fullName(), "shipping[address][line1]": "510 Townsend St", "shipping[address][postal_code]": "98140", "shipping[address][city]": "San Francisco", "shipping[address][state]": "CA", "shipping[address][country]": "US", }; var stripeSecret = stripeModel.value.stripeSecret; var response = await http.post(Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}); return jsonDecode(response.body); } catch (e) { log(e.toString()); } } //mercadoo Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { final headers = { 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json', }; final body = jsonEncode({ "items": [ { "title": "Test", "description": "Test Payment", "quantity": 1, "currency_id": "BRL", // or your preferred currency "unit_price": double.parse(amount), } ], "payer": {"email": userModel.value.email}, "back_urls": { "failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success", }, "auto_return": "approved" // Automatically return after payment is approved }); final response = await http.post( Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body, ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast("Something want wrong please contact administrator".tr); print('Error creating preference: ${response.body}'); return null; } } ///PayStack Payment Method Future payStackPayment(String totalAmount) async { await PayStackURLGen.payStackURLGen( amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value) .then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to(PayStackScreen( secretKey: payStackModel.value.secretKey.toString(), callBackUrl: payStackModel.value.callbackURL.toString(), initialURl: payStackModel0.data.authorizationUrl, amount: totalAmount, reference: payStackModel0.data.reference, ))! .then((value) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); } }); } //flutter wave Payment Method Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); final headers = { 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json', }; final body = jsonEncode({ "tx_ref": _ref, "amount": amount, "currency": "NGN", "redirect_url": "${Constant.globalUrl}payment/success", "payment_options": "ussd, card, barter, payattitude", "customer": { "email": userModel.value.email.toString(), "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, "customizations": { "title": "Payment for Services", "description": "Payment for XYZ services", } }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { print('Payment initialization failed: ${response.body}'); return null; } } String? _ref; void setRef() { maths.Random numRef = maths.Random(); int year = DateTime.now().year; int refNumber = numRef.nextInt(20000); if (Platform.isAndroid) { _ref = "AndroidRef$year$refNumber"; } else if (Platform.isIOS) { _ref = "IOSRef$year$refNumber"; } } // payFast void payFastPayment({required BuildContext context, required String amount}) { PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value) .then((String? value) async { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr); walletTopUp(); } else { Get.back(); ShowToastDialog.showToast("Payment Failed".tr); } }); } ///RazorPay payment function final Razorpay razorPay = Razorpay(); void openCheckout({required amount, required orderId}) async { var options = { 'key': razorPayModel.value.razorpayKey, 'amount': amount * 100, 'name': 'GoRide', 'order_id': orderId, "currency": "INR", 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, 'prefill': { 'contact': userModel.value.phoneNumber, 'email': userModel.value.email, }, 'external': { 'wallets': ['paytm'] } }; try { razorPay.open(options); } catch (e) { debugPrint('Error: $e'); } } void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); ShowToastDialog.showToast("Payment Failed!!".tr); } //Midtrans payment Future midtransMakePayment({required String amount, required BuildContext context}) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { Get.to(() => MidtransScreen( initialURl: url, ))! .then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } }); } Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); final url = Uri.parse( midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); final response = await http.post( url, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!), }, body: jsonEncode({ 'transaction_details': { 'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt(), }, 'usage_limit': 2, "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, }), ); if (response.statusCode == 200 || response.statusCode == 201) { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { ShowToastDialog.showToast("something went wrong, please contact admin.".tr); return ''; } } String generateBasicAuthHeader(String apiKey) { String credentials = '$apiKey:'; String base64Encoded = base64Encode(utf8.encode(credentials)); return 'Basic $base64Encoded'; } //Orangepay payment static String accessToken = ''; static String payToken = ''; static String orderId = ''; static String amount = ''; Future orangeMakePayment({required String amount, required BuildContext context}) async { reset(); var id = const Uuid().v4(); var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { Get.to(() => OrangeMoneyScreen( initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken, ))! .then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } }); } else { ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = { 'grant_type': 'client_credentials', }; var response = await http.post(Uri.parse(apiUrl), headers: { 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json', }, body: requestBody); // Handle the response if (response.statusCode == 200) { Map responseData = jsonDecode(response.body); accessToken = responseData['access_token']; // ignore: use_build_context_synchronously return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); return ''; } } Future webpayment( {required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { orderId = orderIdData; amount = amountData; String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, "order_id": orderId, "amount": amount, "reference": 'Y-Note Test', "lang": "en", "return_url": orangeMoneyModel.value.returnUrl!.toString(), "cancel_url": orangeMoneyModel.value.cancelUrl!.toString(), "notif_url": orangeMoneyModel.value.notifUrl!.toString(), }; var response = await http.post( Uri.parse(apiUrl), headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, body: json.encode(requestBody), ); // Handle the response if (response.statusCode == 201) { Map responseData = jsonDecode(response.body); if (responseData['message'] == 'OK') { payToken = responseData['pay_token']; return responseData['payment_url']; } else { return ''; } } else { ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); return ''; } } static void reset() { accessToken = ''; payToken = ''; orderId = ''; amount = ''; } //XenditPayment Future xenditPayment(context, amount) async { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { Get.to(() => XenditScreen( initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString(), ))! .then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } }); } Future createXenditInvoice({required var amount}) async { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; final body = jsonEncode({ 'external_id': const Uuid().v1(), 'amount': amount, 'payer_email': 'customer@domain.com', 'description': 'Test - VA Successful invoice payment', 'currency': 'IDR', //IDR, PHP, THB, VND, MYR }); try { final response = await http.post(Uri.parse(url), headers: headers, body: body); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); return model; } else { return XenditModel(); } } catch (e) { return XenditModel(); } } }