You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
6.5 KiB
Dart
195 lines
6.5 KiB
Dart
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, int? languageID}) async {
|
|
Map<String, dynamic> body = {"Integration_Id": integrationId, "ServID": serviceId, "ProjectID": projectId, "LanguageID": languageID};
|
|
|
|
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<void> addPayfortApplePayResponse(num patientID, {PayFortResult? result}) async {
|
|
Map<String, dynamic> body = {
|
|
"Fort_id": result!.fortId,
|
|
"CommandType": result!.command,
|
|
"Amount": (num.parse(result.amount!) / 100),
|
|
"Payment_Option": result.paymentOption,
|
|
"Customer_IP": result.customerIp,
|
|
"ECI": result.eci,
|
|
"Response_Message": result.responseMessage,
|
|
"Card_Number": result.cardNumber,
|
|
"Status": result.status,
|
|
"Merchant_Ref": result.merchantReference,
|
|
"Pat_Token": result.tokenName,
|
|
"IsRefund": false,
|
|
"RemmeberMe": false,
|
|
"Reconciliation_Reference": result.reconciliationReference,
|
|
"LanguageID": 1,
|
|
"PatientID": patientID
|
|
};
|
|
|
|
await baseAppClient.post(
|
|
addPayFortApplePayResponse,
|
|
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,
|
|
);
|
|
}
|
|
|
|
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<String> getPayfortSignature(
|
|
String applePayAccessCode,
|
|
String merchantIdentifier,
|
|
String applePayShaRequestPhrase,
|
|
) async {
|
|
String? deviceId = await _payfort.getDeviceId();
|
|
SdkTokenRequest tokenRequest = SdkTokenRequest(
|
|
accessCode: applePayAccessCode,
|
|
deviceId: deviceId ?? '',
|
|
merchantIdentifier: merchantIdentifier,
|
|
);
|
|
|
|
String? signature = await _payfort.generateSignature(
|
|
shaType: "SHA-256",
|
|
concatenatedString: tokenRequest.toConcatenatedString(applePayShaRequestPhrase),
|
|
);
|
|
|
|
return signature!;
|
|
}
|
|
|
|
Future<void> paymentWithApplePay({
|
|
SucceededCallback? onSucceeded,
|
|
FailedCallback? onFailed,
|
|
String? customerName,
|
|
String? customerEmail,
|
|
String? orderDescription,
|
|
num? 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());
|
|
}
|
|
}
|
|
}
|