startPayment method
Starts the payment flow
Implementation
Future<Map<dynamic, dynamic>> startPayment(
Map<dynamic, dynamic> options) async {
//required for sending value after the data has been populated
var completer = Completer<Map<dynamic, dynamic>>();
var returnMap = <dynamic, dynamic>{}; // main map object
var dataMap = <dynamic, dynamic>{}; // return map object
// Handle retry options
if (options['retry'] is Map && options['retry']['enabled'] == true) {
options['retry'] = true;
} else {
options['retry'] = false;
}
// Create script element
var rzpjs = web.document.createElement('script') as web.HTMLScriptElement;
rzpjs.id = 'rzp-jssdk';
rzpjs.src = 'https://checkout.razorpay.com/v1/checkout.js';
// Define load handler
void onScriptLoad(web.Event _) {
// Create JS Options
var jsOptions = options.jsify() as JSObject;
// Add handler
jsOptions.setProperty(
'handler'.toJS,
(JSObject response) {
returnMap['type'] = ResponseCodes.CODE_PAYMENT_SUCCESS;
dataMap['razorpay_payment_id'] =
response.getProperty('razorpay_payment_id'.toJS).dartify();
if (response.hasProperty('razorpay_order_id'.toJS).toDart) {
dataMap['razorpay_order_id'] =
response.getProperty('razorpay_order_id'.toJS).dartify();
}
if (response.hasProperty('razorpay_signature'.toJS).toDart) {
dataMap['razorpay_signature'] =
response.getProperty('razorpay_signature'.toJS).dartify();
}
returnMap['data'] = dataMap;
completer.complete(returnMap);
}.toJS);
// Add modal.ondismiss
jsOptions.setProperty(
'modal.ondismiss'.toJS,
() {
if (!completer.isCompleted) {
returnMap['type'] = ResponseCodes.CODE_PAYMENT_ERROR;
dataMap['code'] = ResponseCodes.PAYMENT_CANCELLED;
dataMap['message'] = 'Payment processing cancelled by user';
returnMap['data'] = dataMap;
completer.complete(returnMap);
}
}.toJS);
// Initialize Razorpay
var razorpay = Razorpay(jsOptions);
// Add failure listener
razorpay.on(
'payment.failed',
(JSObject response) {
returnMap['type'] = ResponseCodes.CODE_PAYMENT_ERROR;
dataMap['code'] = ResponseCodes.BASE_REQUEST_ERROR;
var error = response.getProperty('error'.toJS) as JSObject;
dataMap['message'] =
error.getProperty('description'.toJS).dartify();
var metadataMap = <dynamic, dynamic>{};
if (error.hasProperty('metadata'.toJS).toDart) {
var metadata = error.getProperty('metadata'.toJS) as JSObject;
if (metadata.hasProperty('payment_id'.toJS).toDart) {
metadataMap['payment_id'] =
metadata.getProperty('payment_id'.toJS).dartify();
}
}
dataMap['metadata'] = metadataMap;
if (error.hasProperty('source'.toJS).toDart) {
dataMap['source'] = error.getProperty('source'.toJS).dartify();
}
if (error.hasProperty('step'.toJS).toDart) {
dataMap['step'] = error.getProperty('step'.toJS).dartify();
}
returnMap['data'] = dataMap;
completer.complete(returnMap);
}.toJS);
razorpay.open();
}
rzpjs.addEventListener('load', onScriptLoad.toJS);
// Insert script logic
var scripts = web.document.getElementsByTagName('script');
if (scripts.length > 0) {
var firstScript = scripts.item(0)!;
firstScript.parentNode?.insertBefore(rzpjs, firstScript);
} else {
web.document.head?.append(rzpjs);
}
return completer.future;
}