Integration steps:
- Create a Payment request
- Redirect payer to request link
- Handle successful/failed payments
- Webhook
- Redirect
- Query status of a Payment requests
- Additional features
- Refunds
- Light Checkout
Create a Payment Request:
Get the final amount from your cart total and call the Create a Request endpoint of our API. The values of fields like amount
, buyer_name
, email
, and phone
are straight-forward. The values of send_email
and send_sms
should be false
.
The purpose
field can be used to pass the custom data (unique identifier) created on your end. This is going to be useful later on to identify the order using this custom data (unique identifier) for which a particular payment was made.
Redirect payer to request link:
The Payment link creation will return a longurl
, this URL can be used to get the payment from the user. You need to redirect the buyer to this Payment link programmatically by using redirection statements in your respective programming language.
Post payment processing:
1. Redirection:
Once the payment is done user will be redirected to the redirect_url
specified during the link creation and we will append three more query arguments with it: payment_id
, payment_request_id
and payment_status
.
Example:
If your redirect_url
was http://www.example.com then the user will be redirected to something like: http://www.example.com?payment_id=MOJO5a06005J21512197&payment_status=Credit&payment_request_id=d66cb29dd059482e8072999f995c4eef
Now using the payment_request_id
and payment_id
you can query our Get Payment Details endpoint to get the details related to the Request and Payment.
2. Webhook:
Webhook is the URL to which we send the payment details as a POST request. Note that the content type of this request is application/x-www-form-urlencoded
.
Following fields are sent with the webhook request:
Field | Description | Example value |
---|---|---|
amount | Amount related to the payment | 2500.00 |
buyer | Buyer's email | [email protected] |
buyer_name | Buyer's name | John Doe |
buyer_phone | Buyer's phone number | 9999999999 |
currency | Currency related to the payment | INR |
fees | Fees charged by Instamojo | 125.00 |
longurl | URL related to the payment request | https://www.instamojo.com/@ashwch/d66cb29dd059482e8072999f995c4eef |
mac | Message Authentication code of this webhook request | 1ddf3b78f84d071324c0bf1d3f095898267d60ee |
payment_id | ID of the payment | MOJO5a06005J21512197 |
payment_request_id | ID of the payment request | d66cb29dd059482e8072999f995c4eef |
purpose | Purpose of the Payment request | FIFA 16 |
shorturl | Short URL of the payment request | https://imjo.in/NNxHg |
status | Status of the Payment. This can be either "Credit" or "Failed". | Credit |
For more information on how to validate the webhook request using mac
read: What is the Message Authentication Code in Webhook?
<?php
/*
Basic PHP script to handle Instamojo RAP webhook.
*/
$data = $_POST;
$mac_provided = $data['mac']; // Get the MAC from the POST data
unset($data['mac']); // Remove the MAC key from the data.
$ver = explode('.', phpversion());
$major = (int) $ver[0];
$minor = (int) $ver[1];
if($major >= 5 and $minor >= 4){
ksort($data, SORT_STRING | SORT_FLAG_CASE);
}
else{
uksort($data, 'strcasecmp');
}
// You can get the 'salt' from Instamojo's developers page(make sure to log in first): https://www.instamojo.com/developers
// Pass the 'salt' without <>
$mac_calculated = hash_hmac("sha1", implode("|", $data), "<YOUR_SALT>");
if($mac_provided == $mac_calculated){
if($data['status'] == "Credit"){
// Payment was successful, mark it as successful in your database.
// You can acess payment_request_id, purpose etc here.
}
else{
// Payment was unsuccessful, mark it as failed in your database.
// You can acess payment_request_id, purpose etc here.
}
}
else{
echo "MAC mismatch";
}
?>
import hmac
import hashlib
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
import urlparse
PORT = 8000
class MojoHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['content-length'])
querystring = self.rfile.read(content_length)
data = urlparse.parse_qs(querystring)
mac_provided = data.pop('mac')
message = "|".join(v for k, v in sorted(data.items(), key=lambda x: x[0].lower()))
# Pass the 'salt' without the <>.
mac_calculated = hmac.new("<YOUR_SALT>", message, hashlib.sha1).hexdigest()
if mac_provided == mac_calculated:
if data['status'] == "Credit":
# Payment was successful, mark it as completed in your database.
else:
# Payment was unsuccessful, mark it as failed in your database.
self.send_response(200)
else:
self.send_response(400)
self.send_header('Content-type', 'text/html')
self.end_headers()
httpd = HTTPServer(('', PORT), MojoHandler)
httpd.serve_forever()
We recommend passing both webhook
and redirect_url
URLs while creating the Payment link because users sometimes close the tab before redirection can happen and in that case, the webhook request comes in handy and will save you from manual updating of the database.
ADDITIONAL FEATURES:
1. Light Checkout:
With Light Checkout, the payment form loads faster and takes the payer directly to the final payment page. The payer is taken to the final payment page only if buyer_name
, email
and phone
were supplied during request creation, else the payer will have to fill these details in before paying.
To use light checkout, simply append ?embed=form
at the end of your request URL.
Standard request URL: https://www.instamojo.com/@ashwch/d66cb29dd059482e8072999f995c4eef
Light checkout URL: https://www.instamojo.com/@ashwch/d66cb29dd059482e8072999f995c4eef?embed=form
2. Floating Checkout:
Allow customers to pay without leaving your website.
Create an embeddable checkout with just a few lines of code.
Just replace REQUEST_URL
with your Request URL in the snippet below and you're good to go.
<a href="REQUEST_URL" rel="im-checkout" data-behaviour="remote" data-style="light" data-text="Checkout With Instamojo"></a>
<script src="https://d2xwmjc4uy2hr5.cloudfront.net/im-embed/im-embed.min.js"></script>
The above code stylizes the button with the default light green for light backgrounds with (data-style="light")
All styling options
- For light backgrounds (Green button): data-style="light"
- For dark backgrounds (Yellow button) : data-style="dark"
- Flat button for light backgrounds : data-style="flat"
- Flat button for dark backgrounds : data-style="flat-dark"
- No styling : data-style="no-style"