Added InAppApple Pay with PayFort

dev_3.3_faiz_payfort
Faiz Hashmi 2 years ago
parent b769959823
commit ccb9e93d62

@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:amazon_payfort/amazon_payfort.dart';
import 'package:diplomaticquarterapp/models/Request.dart'; import 'package:diplomaticquarterapp/models/Request.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
@ -620,6 +621,14 @@ var PAYFORT_PROD_URL = 'https://paymentservices.payfort.com/FortAPI/paymentApi';
var CHECK_PATIENT_NPHIES_ELIGIBILITY = 'Services/Doctors.svc/REST/checkPatientInsuranceCompanyValidity'; var CHECK_PATIENT_NPHIES_ELIGIBILITY = 'Services/Doctors.svc/REST/checkPatientInsuranceCompanyValidity';
var CONVERT_PATIENT_TO_CASH = 'Services/Doctors.svc/REST/deActivateInsuranceCompany'; var CONVERT_PATIENT_TO_CASH = 'Services/Doctors.svc/REST/deActivateInsuranceCompany';
//PAYFORT
var getPayFortProjectDetails = "Services/PayFort_Serv.svc/REST/GetPayFortProjectDetails";
var payFortEnvironment = FortEnvironment.test;
var applePayMerchantId = "merchant.com.hmgwebservices.uat";
class AppGlobal { class AppGlobal {
static var context; static var context;

@ -0,0 +1,44 @@
enum ServiceTypeEnum {
advancePayment, //3
ancillaryOrder, //3
appointmentPayment, //2
covidPayment, //2
erOnlineCheckIn, //3
liveCareAppointment //4
}
extension ServiceTypeEnumExt on ServiceTypeEnum {
String value() {
switch (this) {
case ServiceTypeEnum.advancePayment:
return "Advance Payment";
case ServiceTypeEnum.ancillaryOrder:
return "Ancillary Order";
case ServiceTypeEnum.appointmentPayment:
return "Appointment Payment";
case ServiceTypeEnum.covidPayment:
return "Covid Payment";
case ServiceTypeEnum.erOnlineCheckIn:
return "ER Online Check In";
case ServiceTypeEnum.liveCareAppointment:
return "LiveCare Appointment";
}
}
int getIdFromServiceEnum() {
switch (this) {
case ServiceTypeEnum.advancePayment:
return 3;
case ServiceTypeEnum.ancillaryOrder:
return 3;
case ServiceTypeEnum.appointmentPayment:
return 2;
case ServiceTypeEnum.covidPayment:
return 2;
case ServiceTypeEnum.erOnlineCheckIn:
return 3;
case ServiceTypeEnum.liveCareAppointment:
return 4;
}
}
}

@ -13,6 +13,8 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddr
import 'package:diplomaticquarterapp/core/viewModels/product_categories_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/product_categories_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/weather/weather_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/weather/weather_view_model.dart';
import 'package:diplomaticquarterapp/services/payfort_services/payfort_service.dart';
import 'package:diplomaticquarterapp/services/payfort_services/payfort_view_model.dart';
import 'package:diplomaticquarterapp/services/pharmacy_services/cancelOrder_service.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/cancelOrder_service.dart';
import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart';
import 'package:diplomaticquarterapp/services/pharmacy_services/recommendedProduct_service.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/recommendedProduct_service.dart';
@ -202,6 +204,7 @@ void setupLocator() {
locator.registerLazySingleton(() => VaccinationTableService()); locator.registerLazySingleton(() => VaccinationTableService());
locator.registerLazySingleton(() => AncillaryOrdersService()); locator.registerLazySingleton(() => AncillaryOrdersService());
locator.registerLazySingleton(() => EdOnlineServices()); locator.registerLazySingleton(() => EdOnlineServices());
locator.registerLazySingleton(() => PayfortService());
//pharmacy //pharmacy
// locator.registerLazySingleton(() => PharmacyCategoriseService()); // locator.registerLazySingleton(() => PharmacyCategoriseService());
@ -309,6 +312,7 @@ void setupLocator() {
locator.registerFactory(() => BestSellerViewModel()); locator.registerFactory(() => BestSellerViewModel());
locator.registerFactory(() => LastVisitedViewModel()); locator.registerFactory(() => LastVisitedViewModel());
locator.registerFactory(() => MostViewedViewModel()); locator.registerFactory(() => MostViewedViewModel());
locator.registerFactory(() => PayfortViewModel());
// Offer And Packages // Offer And Packages
//---------------------- //----------------------

@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/core/viewModels/PharmacyPagesViewModel.dart
import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/services/payfort_services/payfort_view_model.dart';
import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart';
import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart';
import 'package:diplomaticquarterapp/theme/theme_notifier.dart'; import 'package:diplomaticquarterapp/theme/theme_notifier.dart';
@ -118,12 +119,15 @@ class _MyApp extends State<MyApp> {
), ),
ChangeNotifierProvider<CompareList>(create: (context) => CompareList()), ChangeNotifierProvider<CompareList>(create: (context) => CompareList()),
ChangeNotifierProvider<OrderPreviewViewModel>(create: (context) => OrderPreviewViewModel()), ChangeNotifierProvider<OrderPreviewViewModel>(create: (context) => OrderPreviewViewModel()),
ChangeNotifierProvider<PayfortViewModel>(create: (context) => PayfortViewModel()),
], ],
child: Consumer<ProjectViewModel>( child: Consumer<ProjectViewModel>(
builder: (context, projectProvider, child) => MaterialApp( builder: (context, projectProvider, child) => MaterialApp(
builder: (BuildContext context, Widget child) { builder: (BuildContext context, Widget child) {
return MediaQuery( return MediaQuery(
data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0,), //set desired text scale factor here data: MediaQuery.of(context).copyWith(
textScaleFactor: 1.0,
), //set desired text scale factor here
child: child, child: child,
); );
}, },

@ -24,6 +24,7 @@ import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart' as family; import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart' as family;
import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart';
import 'package:diplomaticquarterapp/services/payfort_services/payfort_view_model.dart';
import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart';
import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/LocalNotification.dart';
@ -302,6 +303,9 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
} }
}); });
PayfortViewModel payfortViewModel = context.read<PayfortViewModel>();
payfortViewModel.initPayfort();
// HMG (Guest/Internet) Wifi Access [Zohaib Kambrani] // HMG (Guest/Internet) Wifi Access [Zohaib Kambrani]
// for now commented to reduce this call will enable it when needed // for now commented to reduce this call will enable it when needed
// HMGNetworkConnectivity(context).start(); // HMGNetworkConnectivity(context).start();

@ -1,5 +1,8 @@
import 'dart:developer';
import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/enum/PayfortEnums.dart';
import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/AdvanceModel.dart'; import 'package:diplomaticquarterapp/core/model/my_balance/AdvanceModel.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info_and_mobile_number.dart'; import 'package:diplomaticquarterapp/core/model/my_balance/patient_info_and_mobile_number.dart';
@ -7,11 +10,14 @@ import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_mod
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/LiveCare/ApplePayInsertRequest.dart';
import 'package:diplomaticquarterapp/models/apple_pay_request.dart'; import 'package:diplomaticquarterapp/models/apple_pay_request.dart';
import 'package:diplomaticquarterapp/models/apple_pay_response.dart'; import 'package:diplomaticquarterapp/models/apple_pay_response.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart';
import 'package:diplomaticquarterapp/services/payfort_services/payfort_view_model.dart';
import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart';
@ -24,12 +30,10 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/otp/sms-popup.dart'; import 'package:diplomaticquarterapp/widgets/otp/sms-popup.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
// import 'package:pay/pay.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'new_text_Field.dart'; import 'new_text_Field.dart';
class ConfirmPaymentPage extends StatefulWidget { class ConfirmPaymentPage extends StatefulWidget {
final AdvanceModel advanceModel; final AdvanceModel advanceModel;
final PatientInfoAndMobileNumber patientInfoAndMobileNumber; final PatientInfoAndMobileNumber patientInfoAndMobileNumber;
@ -214,9 +218,73 @@ class _ConfirmPaymentPageState extends State<ConfirmPaymentPage> {
padding: EdgeInsets.all(20), padding: EdgeInsets.all(20),
child: DefaultButton( child: DefaultButton(
TranslationBase.of(context).confirm.toUpperCase(), TranslationBase.of(context).confirm.toUpperCase(),
() { () async {
if (widget.advanceModel.fileNumber == projectViewModel.user.patientID.toString()) { if (widget.advanceModel.fileNumber == projectViewModel.user.patientID.toString()) {
openPayment(widget.selectedPaymentMethod, widget.authenticatedUser, double.parse(widget.advanceModel.amount), null); if (widget.selectedPaymentMethod == "ApplePay") {
transID = Utils.getAdvancePaymentTransID(widget.advanceModel.hospitalsModel.iD, int.parse(widget.advanceModel.fileNumber));
print("TransactionID: $transID");
GifLoaderDialogUtils.showMyDialog(context);
LiveCareService service = new LiveCareService();
ApplePayInsertRequest applePayInsertRequest = new ApplePayInsertRequest();
applePayInsertRequest.clientRequestID = transID;
applePayInsertRequest.clinicID = 0;
applePayInsertRequest.currency = projectViewModel.authenticatedUserObject.user.outSA == 1 ? "AED" : "SAR";
applePayInsertRequest.customerEmail = projectViewModel.authenticatedUserObject.user.emailAddress;
applePayInsertRequest.customerID = projectViewModel.authenticatedUserObject.user.patientID;
applePayInsertRequest.customerName = projectViewModel.authenticatedUserObject.user.firstName + " " + projectViewModel.authenticatedUserObject.user.lastName;
applePayInsertRequest.deviceToken = await AppSharedPreferences().getString(PUSH_TOKEN);
applePayInsertRequest.voipToken = await AppSharedPreferences().getString(ONESIGNAL_APNS_TOKEN);
applePayInsertRequest.doctorID = 0;
applePayInsertRequest.projectID = widget.advanceModel.hospitalsModel.iD.toString();
applePayInsertRequest.serviceID = ServiceTypeEnum.advancePayment.getIdFromServiceEnum().toString();
applePayInsertRequest.channelID = 3;
applePayInsertRequest.patientID = projectViewModel.authenticatedUserObject.user.patientID;
applePayInsertRequest.patientTypeID = projectViewModel.authenticatedUserObject.user.patientType;
applePayInsertRequest.patientOutSA = projectViewModel.authenticatedUserObject.user.outSA;
applePayInsertRequest.appointmentDate = null;
applePayInsertRequest.appointmentNo = 0;
applePayInsertRequest.orderDescription = "Advance Payment";
applePayInsertRequest.liveServiceID = "0";
applePayInsertRequest.latitude = "0.0";
applePayInsertRequest.longitude = "0.0";
applePayInsertRequest.amount = widget.advanceModel.amount.toString();
applePayInsertRequest.isSchedule = "0";
applePayInsertRequest.language = projectViewModel.isArabic ? 'ar' : 'en';
applePayInsertRequest.userName = projectViewModel.authenticatedUserObject.user.patientID;
applePayInsertRequest.responseContinueURL = "http://hmg.com/Documents/success.html";
applePayInsertRequest.backClickUrl = "http://hmg.com/Documents/success.html";
applePayInsertRequest.paymentOption = "ApplePay";
service.applePayInsertRequest(applePayInsertRequest, context).then((res) async {
GifLoaderDialogUtils.hideDialog(context);
await context.read<PayfortViewModel>().initiateApplePayWithPayfort(
customerName: projectViewModel.authenticatedUserObject.user.firstName + " " + projectViewModel.authenticatedUserObject.user.lastName,
customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress,
orderDescription: "Advance Payment",
orderAmount: double.parse(widget.advanceModel.amount),
merchantReference: transID,
onFailed: (failureResult) {
log("failureResult: ${failureResult.toString()}");
},
onSuccess: (successResult) {
log("Payfort: ${successResult.responseMessage}");
checkPaymentStatus(AppoitmentAllHistoryResultList());
},
projectId: widget.advanceModel.hospitalsModel.iD,
// projectId: 95,
serviceTypeEnum: ServiceTypeEnum.advancePayment,
);
}).catchError((err) {
print(err);
if (context = null) GifLoaderDialogUtils.hideDialog(context);
AppToast.showErrorToast(message: err);
});
} else {
openPayment(widget.selectedPaymentMethod, widget.authenticatedUser, double.parse(widget.advanceModel.amount), AppoitmentAllHistoryResultList());
}
} else { } else {
GifLoaderDialogUtils.showMyDialog(context); GifLoaderDialogUtils.showMyDialog(context);
model.sendActivationCodeForAdvancePayment(patientID: int.parse(widget.advanceModel.fileNumber), projectID: widget.advanceModel.hospitalsModel.iD).then((value) { model.sendActivationCodeForAdvancePayment(patientID: int.parse(widget.advanceModel.fileNumber), projectID: widget.advanceModel.hospitalsModel.iD).then((value) {
@ -231,7 +299,7 @@ class _ConfirmPaymentPageState extends State<ConfirmPaymentPage> {
// GifLoaderDialogUtils.showMyDialog(context); // GifLoaderDialogUtils.showMyDialog(context);
// model.sendActivationCodeForAdvancePayment(patientID: int.parse(widget.advanceModel.fileNumber), projectID: widget.advanceModel.hospitalsModel.iD).then((value) { // model.sendActivationCodeForAdvancePayment(patientID: int.parse(widget.advanceModel.fileNumber), projectID: widget.advanceModel.hospitalsModel.iD).then((value) {
// GifLoaderDialogUtils.hideDialog(context); // GifLoaderDialogUtils.hideDialog(context);
// if (model.state != ViewState.ErrorLocal && model.state != ViewState.Error) showSMSDialog(model); // if (model.state = ViewState.ErrorLocal && model.state = ViewState.Error) showSMSDialog(model);
// }); // });
}, },
), ),
@ -410,7 +478,7 @@ class _ConfirmPaymentPageState extends State<ConfirmPaymentPage> {
} }
onBrowserExit(AppoitmentAllHistoryResultList appo, bool isPaymentMade) { onBrowserExit(AppoitmentAllHistoryResultList appo, bool isPaymentMade) {
print("onBrowserExit Called!!!!"); print("onBrowserExit Called");
if (widget.selectedPaymentMethod == "TAMARA" && tamaraPaymentStatus != null && tamaraPaymentStatus == "approved") { if (widget.selectedPaymentMethod == "TAMARA" && tamaraPaymentStatus != null && tamaraPaymentStatus == "approved") {
var res = { var res = {
"Amount": double.parse(widget.advanceModel.amount), "Amount": double.parse(widget.advanceModel.amount),

@ -0,0 +1,36 @@
class PayfortProjectDetailsRespModel {
String accessCode;
int integrationId;
String merchantIdentifier;
int projectID;
String projectName;
int servID;
String shaRequest;
String shaResponse;
PayfortProjectDetailsRespModel({this.accessCode, this.integrationId, this.merchantIdentifier, this.projectID, this.projectName, this.servID, this.shaRequest, this.shaResponse});
PayfortProjectDetailsRespModel.fromJson(Map<String, dynamic> json) {
accessCode = json['AccessCode'];
integrationId = json['Integration_Id'];
merchantIdentifier = json['MerchantIdentifier'];
projectID = json['ProjectID'];
projectName = json['ProjectName'];
servID = json['ServID'];
shaRequest = json['Sha_Request'];
shaResponse = json['Sha_Response'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['AccessCode'] = this.accessCode;
data['Integration_Id'] = this.integrationId;
data['MerchantIdentifier'] = this.merchantIdentifier;
data['ProjectID'] = this.projectID;
data['ProjectName'] = this.projectName;
data['ServID'] = this.servID;
data['Sha_Request'] = this.shaRequest;
data['Sha_Response'] = this.shaResponse;
return data;
}
}

@ -0,0 +1,140 @@
import 'dart:convert';
import 'package:amazon_payfort/amazon_payfort.dart';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:diplomaticquarterapp/services/payfort_services/payfort_project_details_resp_model.dart';
import 'package:diplomaticquarterapp/services/payfort_services/sdk_token_response_model.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:http/http.dart';
import 'package:network_info_plus/network_info_plus.dart';
class PayfortService extends BaseService {
final AmazonPayfort _payfort = AmazonPayfort.instance;
final NetworkInfo _info = NetworkInfo();
Future<void> initPayfortSDK() async {
await AmazonPayfort.initialize(
PayFortOptions(environment: payFortEnvironment),
);
}
Future<PayfortProjectDetailsRespModel> getPayfortConfigurations({int serviceId, int projectId, int integrationId = 2}) async {
Map<String, dynamic> body = {"Integration_Id": integrationId, "ServID": serviceId, "ProjectID": projectId};
PayfortProjectDetailsRespModel payfortProjectDetailsRespModel = PayfortProjectDetailsRespModel();
await baseAppClient.post(
getPayFortProjectDetails,
onSuccess: (response, statusCode) async {
payfortProjectDetailsRespModel = PayfortProjectDetailsRespModel.fromJson(response.isNotEmpty ? response.first : response);
},
onFailure: (String error, int statusCode) {
Utils.showErrorToast(error);
return null;
},
body: body,
isAllowAny: true,
);
return payfortProjectDetailsRespModel;
}
Future<SdkTokenResponse> generateSdkSignatureFromAPI(SdkTokenRequest request) async {
var response = await post(
Uri.parse(payFortEnvironment.paymentApi),
headers: {'Content-Type': 'application/json'},
body: jsonEncode(request.asRequest()),
);
if (response.statusCode == 200) {
var decodedResponse = jsonDecode(response.body);
return SdkTokenResponse.fromMap(decodedResponse);
}
return null;
}
Future<SdkTokenResponse> _generateSdkResponse({
String applePayAccessCode,
String merchantIdentifier,
String applePayShaType,
String applePayShaRequestPhrase,
}) async {
try {
String deviceId = await _payfort.getDeviceId();
/// Step 2: Generate the Signature
SdkTokenRequest tokenRequest = SdkTokenRequest(
accessCode: applePayAccessCode,
deviceId: deviceId ?? '',
merchantIdentifier: merchantIdentifier,
);
String signature = await _payfort.generateSignature(
shaType: applePayShaType,
concatenatedString: tokenRequest.toConcatenatedString(applePayShaRequestPhrase),
);
tokenRequest = tokenRequest.copyWith(signature: signature);
/// Step 3: Generate the SDK Token
return await generateSdkSignatureFromAPI(tokenRequest);
} catch (e) {
print("Error here: ${e.toString()}");
}
return null;
}
Future<void> paymentWithApplePay({
SucceededCallback onSucceeded,
FailedCallback onFailed,
String customerName,
String customerEmail,
String orderDescription,
double orderAmount,
String merchantIdentifier,
String applePayAccessCode,
String applePayShaRequestPhrase,
String merchantReference,
String currency = "SAR",
String applePayShaType = "SHA-256",
String countryIsoCode = "SA",
}) async {
try {
SdkTokenResponse sdkTokenResponse = await _generateSdkResponse(
applePayAccessCode: applePayAccessCode,
merchantIdentifier: merchantIdentifier,
applePayShaType: applePayShaType,
applePayShaRequestPhrase: applePayShaRequestPhrase,
);
if (sdkTokenResponse != null && sdkTokenResponse.sdkToken == null) {
onFailed(sdkTokenResponse.responseMessage ?? '');
return;
}
/// Step 4: Processing Payment [Don't multiply with 100]
/// Amount value send always round ex. [100] not [100.00, 100.21]
FortRequest request = FortRequest(
amount: orderAmount,
customerName: customerName,
customerEmail: customerEmail,
orderDescription: orderDescription,
sdkToken: sdkTokenResponse?.sdkToken ?? '',
merchantReference: merchantReference,
currency: currency,
customerIp: (await _info.getWifiIP() ?? ''),
);
_payfort.callPayFortForApplePay(
request: request,
countryIsoCode: countryIsoCode,
applePayMerchantId: applePayMerchantId,
callback: ApplePayResultCallback(
onSucceeded: onSucceeded,
onFailed: onFailed,
),
);
} catch (e) {
onFailed(e.toString());
}
}
}

@ -0,0 +1,68 @@
import 'package:amazon_payfort/amazon_payfort.dart';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/enum/PayfortEnums.dart';
import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/services/payfort_services/payfort_project_details_resp_model.dart';
import 'package:diplomaticquarterapp/services/payfort_services/payfort_service.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:flutter/cupertino.dart';
class PayfortViewModel extends ChangeNotifier {
PayfortService _payfortService = locator<PayfortService>();
Future<void> initPayfort() async {
await _payfortService.initPayfortSDK();
}
Future<PayfortProjectDetailsRespModel> getProjectDetailsForPayfort({ int serviceId, int projectId}) async {
PayfortProjectDetailsRespModel payfortProjectDetailsRespModel = PayfortProjectDetailsRespModel();
try {
payfortProjectDetailsRespModel = await _payfortService.getPayfortConfigurations(serviceId: serviceId, projectId: projectId);
return payfortProjectDetailsRespModel;
} on Exception catch (e, s) {
print(s);
return null;
}
}
Future<void> initiateApplePayWithPayfort({
String customerName,
String customerEmail,
String orderDescription,
String merchantReference,
double orderAmount,
SucceededCallback onSuccess,
FailedCallback onFailed,
ServiceTypeEnum serviceTypeEnum,
int projectId,
}) async {
GifLoaderDialogUtils.showMyDialog(AppGlobal.context);
PayfortProjectDetailsRespModel payfortProjectDetailsRespModel = await getProjectDetailsForPayfort(projectId: projectId, serviceId: serviceTypeEnum.getIdFromServiceEnum());
if (payfortProjectDetailsRespModel == null) {
GifLoaderDialogUtils.hideDialog(AppGlobal.context);
return;
}
try {
await _payfortService.paymentWithApplePay(
onSucceeded: onSuccess,
onFailed: onFailed,
customerName: customerName,
customerEmail: customerEmail,
orderDescription: orderDescription,
orderAmount: orderAmount,
merchantReference: merchantReference,
merchantIdentifier: payfortProjectDetailsRespModel.merchantIdentifier ?? "",
applePayAccessCode: payfortProjectDetailsRespModel.accessCode ?? "",
applePayShaRequestPhrase: payfortProjectDetailsRespModel.shaRequest ?? "",
);
GifLoaderDialogUtils.hideDialog(AppGlobal.context);
} catch (e) {
Utils.showErrorToast(e.toString());
GifLoaderDialogUtils.hideDialog(AppGlobal.context);
throw e;
}
}
}

@ -0,0 +1,55 @@
class SdkTokenResponse {
SdkTokenResponse({
this.responseCode,
this.deviceId,
this.responseMessage,
this.serviceCommand,
this.sdkToken,
this.signature,
this.merchantIdentifier,
this.accessCode,
this.language,
this.status,
});
String responseCode;
String deviceId;
String responseMessage;
String serviceCommand;
String sdkToken;
String signature;
String merchantIdentifier;
String accessCode;
String language;
String status;
factory SdkTokenResponse.fromMap(Map<String, dynamic> data) {
return SdkTokenResponse(
responseCode: data['response_code'],
deviceId: data['device_id'],
responseMessage: data['response_message'],
serviceCommand: data['service_command'],
sdkToken: data['sdk_token'],
signature: data['signature'],
merchantIdentifier: data['merchant_identifier'],
accessCode: data['access_code'],
language: data['language'],
status: data['status'],
);
}
Map<String, dynamic> toMap() {
return {
'response_code': responseCode,
'device_id': deviceId,
'response_message': responseMessage,
'service_command': serviceCommand,
'sdk_token': sdkToken,
'signature': signature,
'merchant_identifier': merchantIdentifier,
'access_code': accessCode,
'language': language,
'status': status,
};
}
}

@ -218,6 +218,8 @@ dependencies:
# open_file: ^3.2.1 # open_file: ^3.2.1
open_filex: ^4.3.2 open_filex: ^4.3.2
path_provider: ^2.0.8 path_provider: ^2.0.8
amazon_payfort: ^1.0.5
network_info_plus: ^3.0.5
# flutter_callkit_incoming: ^1.0.3+3 # flutter_callkit_incoming: ^1.0.3+3
# firebase_core: 1.12.0 # firebase_core: 1.12.0

Loading…
Cancel
Save