samsung_pay_sdk_flutter_mada 1.0.4 copy "samsung_pay_sdk_flutter_mada: ^1.0.4" to clipboard
samsung_pay_sdk_flutter_mada: ^1.0.4 copied to clipboard

PlatformAndroid

SamsungPay SDK depends on the official SDK from Samsung offers an easy way to implement samsung pay for android devices and support MADA

example/lib/main.dart

import 'dart:convert' show jsonDecode;

import 'package:flutter/material.dart';
import 'package:samsung_pay_sdk_flutter_mada/model/amount_box_control.dart';
import 'package:samsung_pay_sdk_flutter_mada/model/custom_sheet.dart';
import 'package:samsung_pay_sdk_flutter_mada/model/custom_sheet_payment_info.dart';
import 'package:samsung_pay_sdk_flutter_mada/samsung_pay_sdk_flutter.dart';
import 'dart:async';

import 'dart:io';
import 'dart:math';

void main() {
  runApp(const MaterialApp(home: MyHomePage(title: "In-App Payment"), debugShowCheckedModeBanner: false));
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // Set PartnerInfo to initialize SamsungPaySdkFlutter

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var isAvailbelSamsungpay = false;

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

    checkSamsungPaystatus();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title)),
      body: const Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Card(
              child: Padding(
                padding: EdgeInsets.all(10.0),
                child: Column(
                  children: [
                    SizedBox(height: 10),
                    Row(
                      children: [
                        SizedBox(width: 60),
                        SizedBox(width: 20),
                        Text('SamsungPay', textAlign: TextAlign.left),
                      ],
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
      //Add the Samsung Pay button in the bottom navigation bar
      bottomNavigationBar: InkWell(
        onTap: () async {
          final samsungPayService = SamsungPayService(serviceId: "samsungServiceId", amountTotal: 100.0, paymentBrands: ["mada", "visa", "masterCard", "discover", "americanExpress"]);
          var dataToken = await samsungPayService.requestPaymentWithSamsungWallet();
          print(dataToken);
        },
        child: Image.asset('assets/pay_rectangular_full_screen_black.png'),
      ),
    );
  }

  Future<void> checkSamsungPaystatus() async {
    if (Platform.isAndroid) {
      try {
        isAvailbelSamsungpay = await SamsungPayManager.isAvailable("serviceIdentifier"); // add here serviceIdentifier
      } catch (e, s) {
        debugPrint("SamsungPay ERROR: $e");
        debugPrintStack(stackTrace: s);
      }
    }
  }
}

class SamsungPayService {
  final String serviceId;
  double amountTotal;
  final List<String> paymentBrands;

  SamsungPayService({required this.serviceId, required this.amountTotal, required this.paymentBrands});

  List<Brand> get brandList {
    final brands = paymentBrands.map(brandFromString).whereType<Brand>().toList();

    return brands.isEmpty ? [Brand.VISA, Brand.MASTERCARD, Brand.AMERICANEXPRESS, Brand.DISCOVER, Brand.MADA] : brands;
  }

  static String currency = "SAR";
  static String AMOUNT_CONTROL_ID = "amountControlId";

  late final SamsungPaySdkFlutter samsungPaySdkFlutterPlugin = SamsungPaySdkFlutter(PartnerInfo(serviceId: serviceId, data: {SpaySdk.PARTNER_SERVICE_TYPE: ServiceType.INAPP_PAYMENT.name}));

  /// Convert callback API → Future<bool>
  Future<bool> checkSamsungPayStatus() {
    final completer = Completer<bool>();

    samsungPaySdkFlutterPlugin.getSamsungPayStatus(
      StatusListener(
        onSuccess: (status, bundle) {
          completer.complete(status == "2");
        },
        onFail: (errorCode, bundle) {
          completer.complete(false);
        },
      ),
    );

    return completer.future;
  }

  Future<String?> requestPaymentWithSamsungWallet() {
    final completer = Completer<String?>();

    samsungPaySdkFlutterPlugin.startInAppPayWithCustomSheet(
      makeTransactionDetailsWithSheet(),
      CustomSheetTransactionInfoListener(
        onCardInfoUpdated: (cardInfo, sheet) {
          samsungPaySdkFlutterPlugin.updateSheet(sheet);
        },
        onSuccess: (info, credential, extraData) {
          try {
            final Map<String, dynamic> jsonData = jsonDecode(credential);
            final String dataValue = jsonData['3DS']['data'];
            completer.complete(dataValue);
          } catch (e) {
            print("Failed to parse paymentCredential: $e");
            completer.completeError(e); // complete with error
          }
        },
        onFail: (errorCode, bundle) {
          print("Payment Failed: $errorCode");
          completer.completeError("Payment Failed: $errorCode");
        },
      ),
    );

    return completer.future;
  }

  CustomSheetPaymentInfo makeTransactionDetailsWithSheet() {
    final extraPaymentInfo = <String, dynamic>{SpaySdk.EXTRA_CRYPTOGRAM_TYPE: 'NONE', SpaySdk.EXTRA_ACCEPT_COMBO_CARD: false, SpaySdk.EXTRA_REQUIRE_CPF: false};

    final paymentInfo = CustomSheetPaymentInfo(merchantName: "Blu app", customSheet: makeUpCustomSheet());

    paymentInfo.merchantId = "samsungMerchantId"; // needed it be added
    paymentInfo.setOrderNumber(getRandomNumber(length: 10));
    paymentInfo.setMerchantCountryCode("SA");
    paymentInfo.addressInPaymentSheet = AddressInPaymentSheet.DO_NOT_SHOW;
    paymentInfo.allowedCardBrand = brandList;
    paymentInfo.setCardHolderNameEnabled(false);
    paymentInfo.setExtraPaymentInfo(extraPaymentInfo);

    return paymentInfo;
  }

  String getRandomNumber({int length = 10}) {
    final rng = Random();
    return List.generate(length, (_) => rng.nextInt(10)).join();
  }

  CustomSheet makeUpCustomSheet() {
    final sheet = CustomSheet();
    sheet.addControl(makeAmountControl());
    return sheet;
  }

  AmountBoxControl makeAmountControl() {
    final control = AmountBoxControl(AMOUNT_CONTROL_ID, currency);
    control.setAmountTotal(amountTotal, SpaySdk.FORMAT_TOTAL_PRICE_ONLY);
    return control;
  }

  Brand? brandFromString(String brand) {
    switch (brand) {
      case "visa":
        return Brand.VISA;
      case "masterCard":
        return Brand.MASTERCARD;
      case "mada":
        return Brand.MADA;

      case "americanExpress":
      case "amex":
        return Brand.AMERICANEXPRESS;

      case "discover":
        return Brand.DISCOVER;

      default:
        return null;
    }
  }
}

class SamsungPayManager {
  static bool? _available;

  static Future<bool> isAvailable(String id) async {
    if (_available != null) return _available!;

    final service = SamsungPayService(serviceId: id, amountTotal: 1, paymentBrands: ["mada", "visa", "masterCard", "americanExpress", "amex", "discover"]);

    _available = await service.checkSamsungPayStatus();
    return _available!;
  }
}
1
likes
150
points
120
downloads

Publisher

unverified uploader

Weekly Downloads

SamsungPay SDK depends on the official SDK from Samsung offers an easy way to implement samsung pay for android devices and support MADA

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

dartdoc, flutter, plugin_platform_interface

More

Packages that depend on samsung_pay_sdk_flutter_mada

Packages that implement samsung_pay_sdk_flutter_mada