Fawry EMVQR SDK Integration Guide

Welcome to the comprehensive Fawry EMVQR SDK Integration Guide. This guide will walk you through the seamless integration of Fawry's native Android and iOS SDKs into your Flutter projects for effortless EMVQR scanning.

Table of Contents


Getting Started

Adding Fawry EMVQR SDK Pub

To begin, add the Fawry EMVQR SDK plugin to your Flutter project's dependencies. Open the terminal in the root project and install the pub using following command

flutter pub add emvqr

Android Setup

  1. To integrate with Android, Update the minimum SDK version to 21 or higher in your build.gradle file:
android {
    compileSdkVersion flutter.compileSdkVersion
    minSdkVersion 21
    // ...
}
  1. Set your compile sdk version to 34
  compileSdkVersion 34
  1. In your build.gradle add the following code to the "buildscript" and "allprojects" blocks
repositories {
    google()
    mavenCentral()
    maven { url 'https://nexus.mobile.fawry.io/repository/maven-public/' }
}

iOS Setup

For iOS integration, follow these steps:

  1. Set the minimum iOS version under "Deployment info" to 12.1 or higher in your Runner project in Xcode.

  2. Enhance pod distribution by adding the following code at the end of the pod file (Podfile):

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
        end
    end
end

Fawry EMVQR SDK Imports

Before you proceed, make sure to import the necessary Fawry SDK packages at the beginning of your Dart file:

import 'package:emvqr/model/scan_result.dart';
import 'package:emvqr/emvqr.dart';
import 'package:emvqr/model/qr_model.dart';

Streaming Result Data

  late StreamSubscription? _fawryCallbackResultStream;
  QrModel? qrModel;
  List<ScanResult> qrResponses = [];

  @override
  void initState() {
    super.initState();
    setupCallback();
  }

  @override
  void dispose() {
    _fawryCallbackResultStream?.cancel();
    super.dispose();
  }

  Future<void> setupCallback() async {
    try {
      _fawryCallbackResultStream =
          Emvqr.instance.callbackResultStream().listen((event) {
        setState(() {
          Map<Object?, Object?> eventData = event;
          ScanResult response = ScanResult.fromJson(eventData);
          qrResponses.add(response);
          QrModel? model = response.extractQrModel();

          qrModel = model ?? qrModel;
          if (qrModel != null) {
            debugPrint(qrModel.toString());
          }
        });
      });
    } catch (ex) {
      debugPrint("Error in setupCallback: $ex");
    }
  }

  Future<void> startScanning() async {
    await Emvqr.instance.scanQR();
  }

Models Explained :

ScanResult

PARAMETER NAME PARAMETER TYPE DESCRIPTION
status String The status of the scan operation. This can be a success or an error message.
data String? The optional data obtained from the scan operation. This may be null if no data was retrieved.
extractQrModel() QrModel? Method to return a QrModel object from ScanResult.

QrModel

PARAMETER NAME TYPE DESCRIPTION
merchantID String The merchant ID associated with the QR code.
mcc String? Merchant Category Code (MCC) - an optional field.
currency String? The currency used for the transaction - an optional field.
amount String The amount of the transaction.
feesAmount String? Fees associated with the transaction - an optional field.
countryCode String? The country code associated with the QR code - an optional field.
merchantName String? The name of the merchant - an optional field.
merchantCity String? The city where the merchant is located - an optional field.
postalCode String? The postal code of the merchant's location - an optional field.
ref1 String? Additional reference information (Reference 1) - an optional field.
ref2 String? Additional reference information (Reference 2) - an optional field.
additionalInfo AdditionalInfo? Additional information associated with the QR code - an optional field.
terminalId String? The terminal ID associated with the QR code - an optional field.
qrTimeStamp String? Timestamp associated with the QR code - an optional field.
unreservedTemplate Map<String, Map<String, String>> Unreserved Template - a map containing String keys and values, where each key is associated with an inner map of type Map<String, String>.

AdditionalInfo

PARAMETER NAME PARAMETER TYPE DESCRIPTION
storeId String? Store Id information.
billNumber String? Bill number information.
mobileNumber String? Mobile number information.
loyaltyNumber String? Loyalty number information.
referenceLabel String? Reference label information.
customerLabel String? Customer label information.

Conclusion

You've successfully integrated the Fawry EMVQR SDK into your Flutter project. Follow the streamlined steps for Android and iOS platforms outlined in this guide.

Utilize the startScanning function to initiate QR code scanning and the setupCallback method for result streaming. Extract relevant information using the ScanResult, QrModel, and AdditionalInfo models.

For any queries or assistance, consult the documentation or contact Fawry's support.

Thank you for choosing Fawry. Happy coding!