banking_dcb_sdk_flutter 0.0.3
banking_dcb_sdk_flutter: ^0.0.3 copied to clipboard
Partner UI Integration Library for Flutter
example/lib/main.dart
import 'dart:convert';
import 'dart:io';
import 'package:banking_dcb_sdk_flutter/banking_dcb_sdk_flutter.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:url_launcher/url_launcher.dart';
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await dotenv.load(fileName: "lib/.env");
HttpOverrides.global = MyHttpOverrides();
await PartnerLibrary.init(
dotenv.env['BASE_URL']!,
whitelistedDomains: [
"razorpay.com",
"sbmkycuat.esbeeyem.com",
"m2pfintech.com",
"https://capture.kyc.idfy.com"
],
deviceBindingEnabled: false,
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: MyHome(),
);
}
}
class MyHome extends StatefulWidget {
@override
_MyHomeState createState() => _MyHomeState();
}
class _MyHomeState extends State<MyHome> {
final _formKey = GlobalKey<FormState>();
final _nameController = TextEditingController();
final _emailController = TextEditingController();
final _phoneController = TextEditingController();
final _prospectIDController = TextEditingController();
final _partnerUserIdController = TextEditingController();
String name = '';
String email = '';
String phone = '';
// final String? clientId = dotenv.env['KID'];
String baseUrl = '';
String token = '';
@override
void initState() {
baseUrl = dotenv.env['BASE_URL']!;
super.initState();
// _setupDeepLinks();
_checkSession((WebViewCallback action) {
switch (action.type) {
case WebViewCallbackType.redirect:
print("Redirected with status: ${action.status}");
break;
case WebViewCallbackType.logout:
print("User logged out");
break;
}
});
}
// Future<Dio> createPemTrustedDio() async {
// final pemBytes = (await rootBundle.load('assets/certs/uatcbp_chain.pem')).buffer.asUint8List();
// final context = SecurityContext(withTrustedRoots: false)..setTrustedCertificatesBytes(pemBytes);
//
// final dio = Dio(BaseOptions(
// connectTimeout: const Duration(seconds: 20),
// receiveTimeout: const Duration(seconds: 20),
// ));
// (dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
// final client = HttpClient(context: context);
// client.connectionTimeout = const Duration(seconds: 20);
// return client;
// };
// return dio;
// }
Future<void> _checkSession(WebViewCallbackFunction callback) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String? name = prefs.getString('name');
String? email = prefs.getString('email');
String? phone = prefs.getString('phone');
setState(() {
_nameController.text = name ?? '';
_emailController.text = email ?? '';
_phoneController.text = phone ?? '';
});
}
Future<void> createToken( //SBM
String module, String photo, WebViewCallbackFunction callback,
{String? nameInput, String? emailInput, String? phoneInput}) async {
setState(() {
name = nameInput?.isNotEmpty == true ? nameInput! : _nameController.text;
email =
emailInput?.isNotEmpty == true ? emailInput! : _emailController.text;
phone =
phoneInput?.isNotEmpty == true ? phoneInput! : _phoneController.text;
});
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString('name', name);
await prefs.setString('email', email);
await prefs.setString('phone', phone);
final String clientId = dotenv.env['KID']!;
print("clientId $clientId");
final Map<String, Object> headers = {
'kid': clientId,
'typ': 'JWT',
'alg': 'HS256',
};
final Map<String, String> attributes = {
'name': name.trim(),
'photo': photo,
"partner_user_id": _partnerUserIdController.text.trim() ?? "1234"
};
const Duration expirationDuration = Duration(milliseconds: 300000);
final clientSecret = dotenv.env['CLIENT_SECRET'];
print("clientSecret $clientSecret");
final jwt = JWT(
{
'attributes': attributes,
// 'module': '/banking/dcb/credit_card/CRE',
// "redirect_url": "https://credilio.in",
"prospect_id": _prospectIDController.text.trim(),
"device_binded": true,
},
header: headers,
);
token = await jwt.sign(
SecretKey(clientSecret!),
expiresIn: expirationDuration,
);
print("Token generated FROM client side is: $token for module $module");
final sdkLoginResponse = await PartnerLibrary.instance.sdkLogin(context,token: token,partner: 'dcb');
final pbApi = await PartnerLibrary.instance.publicCallAPI('https://uatcbp.dcbbank.com/api/user/token',
'POST',
// headers: {
// 'Content-Type': 'application/json',
// },
body: {'token': token},
);
print("Public API response: ${pbApi}");
print("sdkLoginResponse $sdkLoginResponse");
await PartnerLibrary.instance.open(context, module, token, callback);
}
// void _setupDeepLinks() {
// partnerLibrary.initializeDeepLinks(
// context,
// onDeepLinkNavigate: (String path) {
// switch (path) {
// case '/deeplink1':
// Navigator.of(context).push(MaterialPageRoute(
// builder: (context) => DeepLinkTest(),
// ));
// break;
// case '/deeplink2':
// Navigator.of(context).push(MaterialPageRoute(
// builder: (context) => DeepLinkTest2(),
// ));
// break;
// }
// },
// onSpenseLoadSlug: (String loadSlug) {
// print("Handling Spense load slug: $loadSlug");
// },
// );
// }
@override
void dispose() {
_nameController.dispose();
_emailController.dispose();
_phoneController.dispose();
_prospectIDController.dispose();
_partnerUserIdController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Spacer(),
SizedBox(
height: 48,
child: TextButton(
style: TextButton.styleFrom(
foregroundColor: Colors.black,
),
onPressed: () {
if (_formKey.currentState!.validate()) {
createToken(dotenv.env['SPENSE_MODULE']!, '',
(WebViewCallback action) {
switch (action.type) {
case WebViewCallbackType.redirect:
print(
"Redirected with status: ${action.status}");
break;
case WebViewCallbackType.logout:
print("User logged out");
break;
}
});
}
},
child: const Text(
'Dashboard',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
),
),
),
),
],
),
SizedBox(height: MediaQuery.of(context).size.height * 0.02),
const Text(
'User Details',
style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
),
SizedBox(height: MediaQuery.of(context).size.height * 0.02),
TextFormField(
controller: _prospectIDController,
decoration: const InputDecoration(
fillColor: Colors.grey,
labelText: 'Prospect ID',
border: OutlineInputBorder(),
),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your prospect ID';
}
return null;
},
),
// SizedBox(height: MediaQuery.of(context).size.height * 0.02),
// TextFormField(
// controller: _partnerUserIdController,
// decoration: const InputDecoration(
// fillColor: Colors.grey,
// labelText: 'Partner User ID',
// border: OutlineInputBorder(),
// ),
// // validator: (value) {
// // if (value == null || value.isEmpty) {
// // return 'Please enter your prospect ID';
// // }
// // return null;
// // },
// ),
// -------------------------------COMMENTED FOR SBM -------------------------
// SizedBox(height: MediaQuery.of(context).size.height * 0.02),
// TextFormField(
// controller: _nameController,
// decoration: const InputDecoration(
// fillColor: Colors.grey,
// labelText: 'Name',
// border: OutlineInputBorder(),
// ),
// validator: (value) {
// if (value == null || value.isEmpty) {
// return 'Please enter your name';
// }
// return null;
// },
// ),
// SizedBox(height: MediaQuery.of(context).size.height * 0.02),
// TextFormField(
// controller: _emailController,
// decoration: const InputDecoration(
// fillColor: Colors.grey,
// labelText: 'Email',
// border: OutlineInputBorder(),
// ),
// validator: (value) {
// if (value == null || value.isEmpty) {
// return 'Please enter your email';
// }
// return null;
// },
// ),
// SizedBox(height: MediaQuery.of(context).size.height * 0.02),
// TextFormField(
// controller: _phoneController,
// decoration: const InputDecoration(
// fillColor: Colors.grey,
// labelText: 'Phone number',
// border: OutlineInputBorder(),
// ),
// validator: (value) {
// if (value == null || value.isEmpty) {
// return 'Please enter your phone number';
// }
// return null;
// },
// ),
// SizedBox(
// height: 48,
// child: TextButton(
// style: TextButton.styleFrom(
// foregroundColor: Colors.black,
// ),
// onPressed: () {
// if (_formKey.currentState!.validate()) {
// createToken('${dotenv.env['MODULE']!}/pay_bill', '',
// (WebViewCallback action) {
// switch (action.type) {
// case WebViewCallbackType.redirect:
// print("Redirected with status: ${action.status}");
// break;
// case WebViewCallbackType.logout:
// print("User logged out");
// break;
// }
// });
// }
// },
// child: const Text(
// 'Pay Bill',
// style: TextStyle(
// fontWeight: FontWeight.bold,
// fontSize: 20,
// ),
// ),
// ),
// ),
// SizedBox(
// height: 48,
// child: TextButton(
// style: TextButton.styleFrom(
// foregroundColor: Colors.black,
// ),
// onPressed: () {
// if (_formKey.currentState!.validate()) {
// createToken('${dotenv.env['MODULE']!}/card_limits', '',
// (WebViewCallback action) {
// switch (action.type) {
// case WebViewCallbackType.redirect:
// print("Redirected with status: ${action.status}");
// break;
// case WebViewCallbackType.logout:
// print("User logged out");
// break;
// }
// });
// }
// },
// child: const Text(
// 'Manage Card',
// style: TextStyle(
// fontWeight: FontWeight.bold,
// fontSize: 20,
// ),
// ),
// ),
// ),
// SizedBox(
// height: 48,
// child: TextButton(
// style: TextButton.styleFrom(
// foregroundColor: Colors.black,
// ),
// onPressed: () {
// if (_formKey.currentState!.validate()) {
// createToken(
// '${dotenv.env['MODULE']!}/all_transactions', '',
// (WebViewCallback action) {
// switch (action.type) {
// case WebViewCallbackType.redirect:
// print("Redirected with status: ${action.status}");
// break;
// case WebViewCallbackType.logout:
// print("User logged out");
// break;
// }
// });
// }
// },
// child: const Text(
// 'Transactions',
// style: TextStyle(
// fontWeight: FontWeight.bold,
// fontSize: 20,
// ),
// ),
// ),
// ),
// SizedBox(
// height: 48,
// child: TextButton(
// style: TextButton.styleFrom(
// foregroundColor: Colors.black,
// ),
// onPressed: () {
// if (_formKey.currentState!.validate()) {
// createToken('${dotenv.env['MODULE']!}/enhance', '',
// (WebViewCallback action) {
// switch (action.type) {
// case WebViewCallbackType.redirect:
// print("Redirected with status: ${action.status}");
// break;
// case WebViewCallbackType.logout:
// print("User logged out");
// break;
// }
// });
// }
// },
// child: const Text(
// 'Enhance',
// style: TextStyle(
// fontWeight: FontWeight.bold,
// fontSize: 20,
// ),
// ),
// ),
// ),
// const Spacer(),
// ElevatedButton(
// onPressed: () {
// Navigator.of(context).push(MaterialPageRoute(
// builder: (context) => DeepLinkTest(),
// ));
// },
// child: Text('Go to DeepLink')),
// ElevatedButton(
// onPressed: () {
// Navigator.of(context).push(MaterialPageRoute(
// builder: (context) => RateLimiterScreen(
// onCallback: (WebViewCallback action) {
// switch (action.type) {
// case WebViewCallbackType.redirect:
// print("Redirected with status: ${action.status}");
// break;
// case WebViewCallbackType.logout:
// print("User logged out");
// break;
// }
// },
// ),
// ));
// },
// child: Text('Rate Limiter'),
// ),
],
),
),
),
),
);
}
}