Skip to content

Commit 2c5ab70

Browse files
authored
Merge pull request #75 from razorpay/PO-73
PO-73 (No 'merchant_order_id' for few of the transaction on WHMCS plugin)
2 parents 2e987eb + 844bfc3 commit 2c5ab70

File tree

4 files changed

+155
-6
lines changed

4 files changed

+155
-6
lines changed

modules/gateways/razorpay.php

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?php
22

33
require_once __DIR__.'/razorpay/razorpay-sdk/Razorpay.php';
4+
require_once __DIR__.'/razorpay/rzpordermapping.php';
5+
46

57
use Razorpay\Api\Api;
68
use Razorpay\Api\Errors;
@@ -39,6 +41,16 @@ function razorpay_config()
3941
global $CONFIG;
4042

4143
$webhookUrl = $CONFIG['SystemURL'].'/modules/gateways/razorpay/razorpay-webhook.php';
44+
$rzpOrderMapping = new RZPOrderMapping(razorpay_MetaData()['DisplayName']);
45+
46+
try
47+
{
48+
$rzpOrderMapping->createTable();
49+
}
50+
catch (Exception $e)
51+
{
52+
logTransaction(razorpay_MetaData()['DisplayName'], $e->getMessage(), "Unsuccessful - Create Table");
53+
}
4254

4355
return array(
4456
// the friendly display name for a payment gateway should be
@@ -145,6 +157,28 @@ function createRazorpayOrderId(array $params)
145157

146158
$_SESSION[$sessionKey] = $razorpayOrderId;
147159

160+
$rzpOrderMapping = new RZPOrderMapping(razorpay_MetaData()['DisplayName']);
161+
162+
if ((isset($params['invoiceid']) === false) or
163+
(isset($razorpayOrderId) === false))
164+
{
165+
$error = [
166+
"invoice_id" => $params['invoiceid'],
167+
"razorpay_order_id" => $razorpayOrderId
168+
];
169+
logTransaction(razorpay_MetaData()['DisplayName'], $error, "Validation Failure");
170+
return;
171+
}
172+
173+
try
174+
{
175+
$rzpOrderMapping->insertOrder($params['invoiceid'], $razorpayOrderId);
176+
}
177+
catch (Exception $e)
178+
{
179+
logTransaction(razorpay_MetaData()['DisplayName'], $e->getMessage(), "Unsuccessful - Insert Order");
180+
}
181+
148182
return $razorpayOrderId;
149183
}
150184

@@ -176,7 +210,7 @@ function razorpay_link($params)
176210
$whmcsVersion = $params['whmcsVersion'];
177211
$razorpayWHMCSVersion = RAZORPAY_WHMCS_VERSION;
178212
$checkoutUrl = 'https://checkout.razorpay.com/v1/checkout.js';
179-
$callbackUrl = (substr($params['systemurl'], -1) === '/') ? $params['systemurl'] . 'modules/gateways/razorpay/razorpay.php' : $params['systemurl'] . '/modules/gateways/razorpay/razorpay.php';
213+
$callbackUrl = (substr($params['systemurl'], -1) === '/') ? $params['systemurl'] . 'modules/gateways/razorpay/razorpay.php?merchant_order_id=' . $invoiceId : $params['systemurl'] . '/modules/gateways/razorpay/razorpay.php?merchant_order_id=' . $invoiceId;
180214

181215
$razorpayOrderId = createRazorpayOrderId($params);
182216

modules/gateways/razorpay/razorpay-webhook.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ function orderPaid(array $data, $gatewayParams)
108108
// We don't process subscription/invoice payments here
109109
if (isset($data['payload']['payment']['entity']['invoice_id']) === true)
110110
{
111+
logTransaction($gatewayParams['name'], "returning order.paid webhook", "Invoice ID exists");
111112
return;
112113
}
113114

@@ -137,6 +138,7 @@ function orderPaid(array $data, $gatewayParams)
137138
// If it is already marked as paid or failed ignore the event
138139
if($order['totalresults'] == 0 or $order['orders']['order'][0]['paymentstatus'] === 'Paid')
139140
{
141+
logTransaction($gatewayParams['name'], "order detail not found or already paid or failed", "INFO");
140142
return;
141143
}
142144

modules/gateways/razorpay/razorpay.php

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
require_once __DIR__ . '/../../../includes/gatewayfunctions.php';
1313
require_once __DIR__ . '/../../../includes/invoicefunctions.php';
1414
require_once __DIR__ . '/razorpay-sdk/Razorpay.php';
15+
require_once __DIR__ . '/rzpordermapping.php';
1516

1617
use Razorpay\Api\Api;
1718
use Razorpay\Api\Errors;
@@ -29,8 +30,8 @@
2930
}
3031

3132
// Retrieve data returned in payment gateway callback
32-
$merchant_order_id = $_POST["merchant_order_id"];
33-
$razorpay_payment_id = $_POST["razorpay_payment_id"];
33+
$merchant_order_id = (isset($_POST['merchant_order_id']) === true) ? $_POST['merchant_order_id'] : $_GET['merchant_order_id'];
34+
$razorpay_payment_id = $_POST['razorpay_payment_id'];
3435

3536
// Validate Callback Invoice ID.
3637
$merchant_order_id = checkCbInvoiceID($merchant_order_id, $gatewayParams['name']);
@@ -99,8 +100,34 @@ function verifySignature(int $order_no, array $response, $gatewayParams)
99100
);
100101

101102
$sessionKey = getOrderSessionKey($order_no);
102-
103-
$attributes[RAZORPAY_ORDER_ID] = $_SESSION[$sessionKey];
104-
103+
$razorpayOrderId = "";
104+
105+
if (isset($_SESSION[$sessionKey]) === true)
106+
{
107+
$razorpayOrderId = $_SESSION[$sessionKey];
108+
}
109+
else
110+
{
111+
logTransaction($gatewayParams['name'], $sessionKey, "Session not found");
112+
try
113+
{
114+
if (isset($order_no) === true)
115+
{
116+
$rzpOrderMapping = new RZPOrderMapping($gatewayParams['name']);
117+
$razorpayOrderId = $rzpOrderMapping->getRazorpayOrderID($order_no);
118+
}
119+
else
120+
{
121+
$error = "merchant_order_id is not set";
122+
logTransaction($gatewayParams['name'], $error, "Validation Failure");
123+
}
124+
}
125+
catch (Exception $e)
126+
{
127+
logTransaction($gatewayParams['name'], $e->getMessage(), "Unsuccessful - Fetch Order");
128+
}
129+
}
130+
131+
$attributes[RAZORPAY_ORDER_ID] = $razorpayOrderId;
105132
$api->utility->verifyPaymentSignature($attributes);
106133
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
use Illuminate\Database\Capsule\Manager as Capsule;
4+
5+
class RZPOrderMapping
6+
{
7+
private $name;
8+
9+
function __construct($name)
10+
{
11+
$this->name = $name;
12+
}
13+
14+
function createTable()
15+
{
16+
if (!Capsule::schema()->hasTable('tblrzpordermapping'))
17+
{
18+
Capsule::schema()->create('tblrzpordermapping', function($table) {
19+
$table->increments('id');
20+
$table->string('merchant_order_id', 20);
21+
$table->string('razorpay_order_id', 20);
22+
});
23+
}
24+
}
25+
26+
function insertOrder($merchant_order_id, $razorpay_order_id)
27+
{
28+
$merchant_order_id = stripcslashes($merchant_order_id);
29+
$razorpay_order_id = stripcslashes($razorpay_order_id);
30+
31+
if (($this->validateMerchantOrderID($merchant_order_id) === false) or
32+
($this->validateRazorpayOrderID($razorpay_order_id) === false))
33+
{
34+
$error = [
35+
"merchant_order_id" => $merchant_order_id,
36+
"razorpay_order_id" => $razorpay_order_id
37+
];
38+
39+
logTransaction($this->name, $error, 'Validation Failure');
40+
41+
return;
42+
}
43+
$insert_array = [
44+
"merchant_order_id" => $merchant_order_id,
45+
"razorpay_order_id" => $razorpay_order_id
46+
];
47+
48+
Capsule::table('tblrzpordermapping')->insert($insert_array);
49+
}
50+
51+
function getRazorpayOrderID($merchant_order_id)
52+
{
53+
$merchant_order_id = stripcslashes($merchant_order_id);
54+
55+
if (($this->validateMerchantOrderID($merchant_order_id)) === false)
56+
{
57+
$error = [
58+
"merchant_order_id" => $merchant_order_id
59+
];
60+
61+
logTransaction($this->name, $error, 'Validation Failure');
62+
63+
return;
64+
}
65+
$result = Capsule::table('tblrzpordermapping')
66+
->select('razorpay_order_id')
67+
->where('merchant_order_id', '=', $merchant_order_id)
68+
->orderBy('id', 'desc')
69+
->first();
70+
71+
return $result->razorpay_order_id;
72+
}
73+
74+
function validateMerchantOrderID($merchant_order_id)
75+
{
76+
$pattern = '(^[0-9]+$)';
77+
return (preg_match($pattern, (string) $merchant_order_id) === 1) ? true : false;
78+
}
79+
80+
function validateRazorpayOrderID($razorpay_order_id)
81+
{
82+
$pattern = '(^order_[a-zA-Z0-9]+$)';
83+
return ((preg_match($pattern, (string) $razorpay_order_id) === 1)
84+
and (strlen(substr($razorpay_order_id, 6)) === 14)) ? true : false;
85+
}
86+
}

0 commit comments

Comments
 (0)