ottu_checkout 0.0.1
ottu_checkout: ^0.0.1 copied to clipboard
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],
),
),
),
);
}
}