ottu_checkout 0.0.1 copy "ottu_checkout: ^0.0.1" to clipboard
ottu_checkout: ^0.0.1 copied to clipboard

unlistedoutdated

A new flutter payment sdk

example/lib/main.dart

import 'dart:convert';
import 'dart:developer';
import 'package:ottu_checkout/ottu.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:ottu_checkout/paymentDelegate/paymentDelegate.dart';
import 'package:http/http.dart' as http;

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> implements PaymentDelegate {
  bool _isloading = false;
  final TextEditingController textEditingController = TextEditingController();
  ottu_checkout ottu_checkout = ottu_checkout();
  String amount = '';
  String lan = '';
  String sessionid = '';
  openSDK() async {
    setState(() {
      _isloading = true;
    });
    try {
      await createPaymentTransaction();
      await ottu_checkout.open(context, sessionid, this, sdkLanguage: lan);
      setState(() {
        _isloading = false;
      });
    } catch (e) {
      setState(() {
        _isloading = false;
      });
    }
  }

  Future createPaymentTransaction() async {
    String datad = jsonEncode({
      "type": "e_commerce",
      "pg_codes": ["ottu_pg_kwd_tkn", "knet-test", "mpgs"], //"ottu_pg_kwd_tkn",
      "amount": amount.toString(),
      "customer_id": "test",
      "currency_code": "KWD",
      "disclosure_url": "https://postapp.knpay.net/disclose_ok/",
      "redirect_url": "https://postapp.knpay.net/redirected/",
      "expiration_time": "30000:01"
    });
    return await http.post(
      Uri.parse('https://ksa.ottu_checkout.dev/b/checkout/v1/pymt-txn/'),
      body: datad,
      headers: {
        'Authorization': 'Api-Key L0Fc5f81.dLqByodGesaD9pJdzoKpo6rP1FQBkVzR',
        'Content-Type': 'application/json',
      },
    ).then((http.Response response) async {
      const JsonDecoder _decoder = JsonDecoder();
      log(response.body);
      var res = _decoder.convert(response.body);
      setState(() {
        sessionid = res['session_id'];
      });
      if (kDebugMode) {
        print(res);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Padding(
            padding: const EdgeInsets.all(40.0),
            child: TextFormField(
              controller: textEditingController,
              onChanged: (v) {
                setState(() {
                  amount = v;
                });
              },
              keyboardType: TextInputType.number,
              decoration: InputDecoration(
                hintText: 'amount',
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(
                    color: Colors.grey[400]!,
                  ),
                  borderRadius: BorderRadius.circular(12),
                ),
                focusedBorder: OutlineInputBorder(
                  borderSide: BorderSide(
                    color: Colors.grey[400]!,
                  ),
                  borderRadius: BorderRadius.circular(12),
                ),
                border: OutlineInputBorder(
                  borderSide: BorderSide(
                    color: Colors.grey[400]!,
                  ),
                  borderRadius: BorderRadius.circular(12),
                ),
              ),
            ),
          ),
          const Text('SDK Language'),
          const SizedBox(
            height: 20,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Column(
                children: [
                  const Text('English'),
                  CustomRadio(
                    value: 'en',
                    groupValue: lan,
                    onChanged: (e) {
                      setState(() {
                        lan = e;
                      });
                    },
                  ),
                ],
              ),
              const SizedBox(
                width: 20,
              ),
              Column(
                children: [
                  const Text('Arabic'),
                  CustomRadio(
                    value: 'ar',
                    groupValue: lan,
                    onChanged: (e) {
                      setState(() {
                        lan = e;
                      });
                    },
                  ),
                ],
              ),
            ],
          ),
          if (amount.isNotEmpty)
            _isloading
                ? const CircularProgressIndicator()
                : Center(
                    child: ElevatedButton(
                      child: const Text('Open SDK'),
                      onPressed: () {
                        openSDK();
                      },
                    ),
                  ),
        ],
      ),
    );
  }

  @override
  void successCallback(String paymentStatus) {
    ScaffoldMessenger.of(context).showMaterialBanner(
      MaterialBanner(
        backgroundColor: Colors.green,
        content:
            Text(paymentStatus, style: const TextStyle(color: Colors.white)),
        actions: [
          ElevatedButton(
            onPressed: () {
              ScaffoldMessenger.of(context).hideCurrentMaterialBanner();
            },
            child: const Text('ok'),
          )
        ],
      ),
    );
  }

  @override
  void errorCallback(String paymentStatus) {}

  @override
  void beforeRedirect(String paymentStatus) {
    print(paymentStatus);
  }

  @override
  void cancelCallback(String paymentStatus) {
    ScaffoldMessenger.of(context).showMaterialBanner(
      MaterialBanner(
        backgroundColor: Colors.red,
        content: Text(
          paymentStatus,
          style: TextStyle(color: Colors.white),
        ),
        actions: [
          ElevatedButton(
            onPressed: () {
              ScaffoldMessenger.of(context).hideCurrentMaterialBanner();
            },
            child: const Text('ok'),
          )
        ],
      ),
    );
  }
}

class CustomRadio extends StatefulWidget {
  final String value;
  final String groupValue;
  final void Function(String) onChanged;
  const CustomRadio(
      {Key? key,
      required this.value,
      required this.groupValue,
      required this.onChanged})
      : super(key: key);

  @override
  _CustomRadioState createState() => _CustomRadioState();
}

class _CustomRadioState extends State<CustomRadio> {
  @override
  Widget build(BuildContext context) {
    bool selected = (widget.value == widget.groupValue);

    return ClipRRect(
      borderRadius: BorderRadius.circular(40),
      child: InkWell(
        onTap: () => widget.onChanged(widget.value),
        child: Container(
          margin: const EdgeInsets.all(4),
          padding: const EdgeInsets.all(1),
          decoration: BoxDecoration(
              shape: BoxShape.circle,
              color: selected ? Colors.white : Colors.grey[200]),
          child: Icon(
            Icons.circle,
            size: 13,
            color: selected ? Colors.green : Colors.grey[200],
          ),
        ),
      ),
    );
  }
}