How to use Razorpay Orders API in Flutter?

I'm implementing a payment gateway in my flutter application. So Razorpay recommends me to use Orders API. But I don't get any ways to implement Orders API.

I had referred the below documentation. It contains examples for java, PHP, etc. But nothing found for Flutter / Dart.

https://razorpay.com/docs/payment-gateway/orders/integration/#example

Thanks in advance.

Upvotes: 3

Views: 6251

Answers (6)

Aditya Aggarwal
Aditya Aggarwal

Reputation: 1

I have a direct paste to go solution here,

import 'package:dio/dio.dart' as dio;

createRazorpayOrder(double amount, String custEmail) async {
  try {
    dio.Dio dioClient = dio.Dio();
    dioClient.options.headers['Authorization'] =
        'Basic ' + base64.encode(utf8.encode('RazorpayKey:KeyPassword'));
    // Replace with your actual Razorpay API key and secret
    dioClient.options.headers['Content-Type'] = 'application/json';

    Map<String, dynamic> data = {
      "amount": amount * 100,
      "currency": "INR",
      "receipt": "receipt#1",
      "notes": {"key1": "value3", "key2": "value2"}
    };

    `dio.Response` response =
        await dioClient.post('https://api.razorpay.com/v1/orders', data: data);

    if (response.statusCode == 200) {
      var orderId = response.data['id'];
      return orderId; // Get the order_id from the response
      // openGateway(amount, custEmail); // Call openGateway with order_id
    } else {
      print('Failed to create order: ${response.statusCode}');
    }
  } catch (e) {
    print('Error creating order: $e');
  }
}

This function is to create an orderId. next we will use this orderId in openGateway function as below

void openGateway(amount, String email) async {
  final orderId = await APIs.instance.createRazorpayOrder(amount, email);

  var options = {
    'key': 'rzpKey',
    'order_id': orderId,
    'amount': amount * 100,
    // Amount in the smallest currency unit (e.g., paise)
    'name': 'Name',
    'description': 'Event Payment',
    'prefill': {'contact': 'user_phone_number', 'email': email},
    'reminder_enable': true,
    'timeout': 60,
  };

  try {
    _razorpay.open(options);
  } catch (e) {
    print('Error initializing Razorpay: $e');
  }
}

Upvotes: 0

Tuhin
Tuhin

Reputation: 392

Might be helpful for someone.

Hope you set up all the necessary things.

Step 1: creating Order using Razorpay official Order Api:

  //* create order##############################################################
  void createOrder() async {
    String username = 'xxxxxxxxxx';// razorpay pay key
    String password = "xxxxxxxxxxxxxxxx";// razoepay secret key
    String basicAuth =
        'Basic ${base64Encode(utf8.encode('$username:$password'))}';

    Map<String, dynamic> body = {
      "amount": 1 * 100, 
      "currency": "INR",
      "receipt": "rcptid_11"
    };
    var res = await http.post(
      Uri.https(
          "api.razorpay.com", "v1/orders"), //https://api.razorpay.com/v1/orders // Api provided by Razorpay Official 💙
      headers: <String, String>{
        "Content-Type": "application/json",
        'authorization': basicAuth,
      },
      body: jsonEncode(body),
    );

    if (res.statusCode == 200) {
      openCheckout(jsonDecode(res.body)['id']); // 😎🔥
    }
    print(res.body);
  }
  //*#################################################################

Step 2: Open Razorpay checkout interface.

After getting orderId from Razorpay official Api, pass the id when calling openCheckout(jsonDecode(res.body)['id']); function

 void openCheckout(String orderId) async {
    var options = {
      'key': 'xxxxxxxxxxxxxxxx',
      "amount": 1 * 100,
      'order_id': orderId,
      'name': 'main.co.in',
      // 'prefill': {'contact': '', 'email': '[email protected]'},
      'external': {
        'wallets': ['paytm']
      }
    };

    try {
      razorpay.open(options);
    } catch (e) {
      debugPrint('Error: e');
    }
  }

3rd Step: Signature verification.

This is important if you automatically wanna transfer your amount to your bank account.

for Hmac SHA key , install this package: crypto:

     handlerPaymentSuccess(PaymentSuccessResponse response) {
    final key = utf8.encode('NgDLPyiDRPuQpcXy1E3GKTDv');
    final bytes = utf8.encode('${response.orderId}|${response.paymentId}');
    final hmacSha256 = Hmac(sha256, key);
    final  generatedSignature = hmacSha256.convert(bytes);
    if (generatedSignature.toString() == response.signature) {
      log("Payment was successful!");
      //Handle what to do after a successful payment.
      showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text("Success : payment successful"),
          // content: const Text("Are you sure you wish to delete this item?"),
          actions: <Widget>[
            ElevatedButton(
                onPressed: () {
                  Navigator.of(context).pop(true);
                  // PlaceOrderPrepaid();
                },
                child: Text("OK"))
            // ),
          ],
        );
      },
    );
    } else {
      log("The payment was unauthentic!");
    }
    

  }

Thats it!

enter image description here

Upvotes: 0

Shailendra Rajput
Shailendra Rajput

Reputation: 2879

You can use the Below code. it's working as expected.

createOrderId(amount, description, id, userId) async {
    final int Amount = int.parse(amount) * 100;
    http.Response response = await http.post(
        Uri.parse(
          "https://api.razorpay.com/v1/orders",
        ),
        headers: {
          "Content-Type": "application/json",
          "Authorization":
              "Basic ${base64Encode(utf8.encode('testKey:secreateKey'))} "
        },
        body: json.encode({
          "amount": Amount,
          "currency": "INR",
          "receipt": "OrderId_$id",
          "notes": {"userId": "$userId", "packageId": "$id"},
        }));
    if (response.statusCode == 200) {
      var data = jsonDecode(response.body);
      openCheckout(amount, description, id, userId, data["id"]);
    }
    print(response.body);
  }

void openCheckout(amount, description, id, userId, String orderId) async {
    final int Amount = int.parse(amount) * 100;

    var options = {
      'key': 'testkey',
      'amount': Amount,
      'name': 'Name',
      'description': description,
      'order_id': orderId,
      // "prefill": {
      //   "name": name,
      //   "email": emails,
      // },
      "notes": {"userId": "$userId", "packageId": "$id"},
      'external': {
        'wallets': ['paytm']
      }
    };

    try {
      _razorpay.open(options);
    } catch (e) {
      debugPrint('Error: e');
    }
  }

Upvotes: 0

  Future<void> generate_ODID() async {
      var orderOptions = {
        'amount': 50000,  // amount in the smallest currency unit
        'currency': "INR",
        'receipt': "order_rcptid_11"
      };
      final client = HttpClient();
      final request =
          await client.postUrl(Uri.parse('https://api.razorpay.com/v1/orders'));
      request.headers.set(
          HttpHeaders.contentTypeHeader, "application/json; charset=UTF-8");
      String basicAuth = 'Basic ' +
          base64Encode(utf8.encode(
              '${'YourKEY'}:${'YourSECRET'}'));
      request.headers.set(HttpHeaders.authorizationHeader, basicAuth);
      request.add(utf8.encode(json.encode(orderOptions)));
      final response = await request.close();
      response.transform(utf8.decoder).listen((contents) {
        print('ORDERID'+contents);
        String orderId = contents.split(',')[0].split(":")[1];
        orderId = orderId.substring(1, orderId.length - 1);
        Fluttertoast.showToast(
            msg: "ORDERID: " +orderId,
            toastLength: Toast.LENGTH_SHORT);
        Map<String, dynamic> checkoutOptions = {
          'key': 'YourKEY',
          'amount': 11100,
          'name': 'Demo',
          'description': 'Fssai Registrtion Charge',
          'prefill': {'contact': '8910407549', 'email': '[email protected]'},
          'external': {
            'wallets': ['paytm']
          }
        };
        try {
          _razorpay.open(checkoutOptions);
        } catch (e) {
          print(e.toString());
        }
    });
    }

I am using this same code snippet but when I am trying to do payments with google pay then it will fail with "Your money is not debited, Your server is busy" Error, but when I try to do with providing UPI Id manually then the transaction goes smoothly, otherwise transactions not done using UPI. Is there any way to solve this?

Upvotes: 6

Paul Joseph
Paul Joseph

Reputation: 32

final client = HttpClient();
  final request =
      await client.postUrl(Uri.parse('https://api.razorpay.com/v1/orders'));
  request.headers.set(
      HttpHeaders.contentTypeHeader, "application/json; charset=UTF-8");
  String basicAuth = 'Basic ' +
      base64Encode(utf8.encode(
          '${dotenv.env['RAZORPAY_KEY']!}:${dotenv.env['RAZORPAY_SECRET']!}'));
  request.headers.set(HttpHeaders.authorizationHeader, basicAuth);
  request.add(utf8.encode(json.encode(orderOptions)));
  final response = await request.close();
  response.transform(utf8.decoder).listen((contents) {
    String orderId = contents.split(',')[0].split(":")[1];
    orderId = orderId.substring(1, orderId.length - 1);
    Map<String, dynamic> checkoutOptions = {
      'key': dotenv.env['RAZORPAY_KEY']!,
      'amount': total * 100,
      "currency": "INR",
      'name': 'E Drives',
      'description': 'E Bike',
      'order_id': orderId, // Generate order_id using Orders API
      'timeout': 300,
    };
    try {
      _razorpay.open(checkoutOptions);
    } catch (e) {
      log.e(e.toString());
    }

You can use HttpClient and send a request to the Razorpay Orders API. Hope this answers your question.

Upvotes: 1

Sukhi
Sukhi

Reputation: 14125

Thankfully, Razorpay has Flutter package which you can use. The following code snippet might help :

import 'package:razorpay_flutter/razorpay_flutter.dart';

_razorpay = Razorpay();

var options = {
      'key': '<YOUR_KEY_ID>',
      'amount': 100, //in the smallest currency sub-unit.
      'name': 'Acme Corp.',
      'order_id': 'order_EMBFqjDHEEn80l', // Generate order_id using Orders API
      'description': 'Fine T-Shirt',
      'prefill': {
        'contact': '9123456789',
        'email': '[email protected]'
      }
    };

_razorpay.open(options);

Please go through this page for further details. And this YouTube video will help as well.

Upvotes: 1

Related Questions