flutter_sslcommerz 3.0.0 copy "flutter_sslcommerz: ^3.0.0" to clipboard
flutter_sslcommerz: ^3.0.0 copied to clipboard

Official Flutter plugin for SSLCommerz integration with Android 16KB page support.

example/lib/main.dart

// ignore_for_file: deprecated_member_use
import 'package:flutter/material.dart';
import 'package:flutter_sslcommerz/model/SSLCAdditionalInitializer.dart';
import 'package:flutter_sslcommerz/model/SSLCCustomerInfoInitializer.dart';
import 'package:flutter_sslcommerz/model/SSLCEMITransactionInitializer.dart';
import 'package:flutter_sslcommerz/model/SSLCSdkType.dart';
import 'package:flutter_sslcommerz/model/SSLCShipmentInfoInitializer.dart';
import 'package:flutter_sslcommerz/model/SSLCTransactionInfoModel.dart';
import 'package:flutter_sslcommerz/model/SSLCommerzInitialization.dart';
import 'package:flutter_sslcommerz/model/SSLCurrencyType.dart';
import 'package:flutter_sslcommerz/sslcommerz.dart';
import 'package:fluttertoast/fluttertoast.dart';

enum SdkType { live, testbox }

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: SSLCommerzScreen());
  }
}

class SSLCommerzScreen extends StatefulWidget {
  const SSLCommerzScreen({super.key});

  @override
  // ignore: library_private_types_in_public_api
  _SSLCommerzScreenState createState() => _SSLCommerzScreenState();
}

class _SSLCommerzScreenState extends State<SSLCommerzScreen> {
  final _formKey = GlobalKey<FormState>();
  final Map<String, dynamic> _formData = {};
  SdkType _sdkType = SdkType.live;
  String _selectedLanguage = "en"; // Default to English

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('SSLCommerz')),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              _buildTextField(
                label: "Store ID",
                initialValue: "demotest",
                onSaved: (value) => _formData['store_id'] = value,
                validator: _validateNotEmpty,
              ),
              _buildTextField(
                label: "Store Password",
                initialValue: "qwerty",
                onSaved: (value) => _formData['store_password'] = value,
                validator: _validateNotEmpty,
              ),
              _buildRadioButtons(),
              _buildLanguageDropdown(),
              _buildTextField(
                label: "Phone Number",
                keyboardType: TextInputType.phone,
                onSaved: (value) => _formData['phone'] = value,
              ),
              _buildTextField(
                label: "Payment Amount",
                initialValue: "10",
                keyboardType: TextInputType.numberWithOptions(decimal: true),
                onSaved:
                    (value) =>
                        _formData['amount'] = double.tryParse(value ?? '0'),
                validator: _validateNotEmpty,
              ),
              _buildTextField(
                label: "Enter Multi Card",
                onSaved: (value) => _formData['multicard'] = value,
              ),
              ElevatedButton(
                onPressed: _onPayNowPressed,
                child: Text("Pay now"),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Widget _buildTextField({
    required String label,
    String? initialValue,
    TextInputType keyboardType = TextInputType.text,
    FormFieldSetter<String>? onSaved,
    FormFieldValidator<String>? validator,
  }) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: TextFormField(
        initialValue: initialValue,
        keyboardType: keyboardType,
        decoration: InputDecoration(
          border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.0)),
          hintText: label,
        ),
        onSaved: onSaved,
        validator: validator,
      ),
    );
  }

  Widget _buildRadioButtons() {
    return Row(
      children: [
        _buildRadio(SdkType.testbox, "TESTBOX"),
        _buildRadio(SdkType.live, "LIVE"),
      ],
    );
  }

  Widget _buildLanguageDropdown() {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: DropdownButtonFormField<String>(
        value: _selectedLanguage,
        decoration: InputDecoration(
          border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.0)),
          labelText: "Payment Gateway Language",
        ),
        items: const [
          DropdownMenuItem(value: "en", child: Text("English")),
          DropdownMenuItem(value: "bn", child: Text("বাংলা (Bangla)")),
        ],
        onChanged: (value) {
          setState(() {
            _selectedLanguage = value ?? "en";
          });
        },
      ),
    );
  }

  Widget _buildRadio(SdkType type, String label) {
    return Row(
      children: [
        Radio(
          value: type,
          groupValue: _sdkType,
          activeColor: Colors.blue,
          onChanged: (value) {
            setState(() => _sdkType = value as SdkType);
          },
        ),
        Text(label),
      ],
    );
  }

  String? _validateNotEmpty(String? value) {
    return (value == null || value.isEmpty) ? "Please input value" : null;
  }

  Future<void> _onPayNowPressed() async {
    if (_formKey.currentState != null && _formKey.currentState!.validate()) {
      _formKey.currentState!.save();
      _startSSLCommerzTransaction();
    }
  }

  Future<void> _startSSLCommerzTransaction() async {
    Sslcommerz sslcommerz = Sslcommerz(
      initializer: SSLCommerzInitialization(
        ipn_url: "www.ipnurl.com",
        multi_card_name: _formData['multicard'],
        currency: SSLCurrencyType.BDT,
        product_category: "Food",
        sdkType:
            _sdkType == SdkType.testbox
                ? SSLCSdkType.TESTBOX
                : SSLCSdkType.LIVE,
        store_id: _formData['store_id'],
        store_passwd: _formData['store_password'],
        total_amount: _formData['amount'],
        tran_id: "1231123131212",
        language: _selectedLanguage, // Set payment gateway language
      ),
    );

    sslcommerz
        .addShipmentInfoInitializer(
          sslcShipmentInfoInitializer: SSLCShipmentInfoInitializer(
            shipmentMethod: "yes",
            numOfItems: 5,
            shipmentDetails: ShipmentDetails(
              shipAddress1: "Ship address 1",
              shipCity: "Faridpur",
              shipCountry: "Bangladesh",
              shipName: "Ship name 1",
              shipPostCode: "7860",
            ),
          ),
        )
        .addCustomerInfoInitializer(
          customerInfoInitializer: SSLCCustomerInfoInitializer(
            customerState: "Chattogram",
            customerName: "Abu Sayed Chowdhury",
            customerEmail: "abc@gmail.com",
            customerAddress1: "Anderkilla",
            customerCity: "Chattogram",
            customerPostCode: "200",
            customerCountry: "Bangladesh",
            customerPhone: _formData['phone'],
          ),
        )
        .addEMITransactionInitializer(
          sslcemiTransactionInitializer: SSLCEMITransactionInitializer(
            emi_options: 1,
            emi_max_list_options: 9,
            emi_selected_inst: 0,
          ),
        )
        .addAdditionalInitializer(
          sslcAdditionalInitializer: SSLCAdditionalInitializer(
            valueA: "value a ",
            valueB: "value b",
            valueC: "value c",
            valueD: "value d",
            extras: {
              "disbursements_acct":
                  '[{"sslcz_ref_id":"servicecharge","amount":9.80},{"sslcz_ref_id":"schoolpay","amount":"0.20"}]'
                      .toString(),
            },
          ),
        );
    SSLCTransactionInfoModel result = await sslcommerz.payNow();
    _displayPaymentStatus(result);
  }

  void _displayPaymentStatus(SSLCTransactionInfoModel result) {
    String message;
    Color bgColor;

    switch (result.status?.toLowerCase()) {
      case "failed":
        message = "Transaction Failed";
        bgColor = Colors.red;
        break;
      case "closed":
        message = "SDK Closed by User";
        bgColor = Colors.orange;
        break;
      default:
        message =
            "Transaction ${result.status} - Amount: ${result.amount ?? 0}";
        bgColor = Colors.green;
    }

    Fluttertoast.showToast(
      msg: message,
      toastLength: Toast.LENGTH_SHORT,
      gravity: ToastGravity.CENTER,
      backgroundColor: bgColor,
      textColor: Colors.white,
      fontSize: 16.0,
    );
  }
}
55
likes
130
points
681
downloads

Publisher

unverified uploader

Weekly Downloads

Official Flutter plugin for SSLCommerz integration with Android 16KB page support.

Homepage

Documentation

API reference

License

unknown (license)

Dependencies

flutter, json_annotation, plugin_platform_interface

More

Packages that depend on flutter_sslcommerz

Packages that implement flutter_sslcommerz