Changeset 3269687
- Timestamp:
- 04/09/2025 12:32:44 PM (11 months ago)
- Location:
- woo-razorpay/trunk
- Files:
-
- 3 edited
-
includes/razorpay-webhook.php (modified) (7 diffs)
-
readme.txt (modified) (2 diffs)
-
woo-razorpay.php (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
woo-razorpay/trunk/includes/razorpay-webhook.php
r3221997 r3269687 3 3 require_once __DIR__ . '/../woo-razorpay.php'; 4 4 require_once __DIR__ . '/../razorpay-sdk/Razorpay.php'; 5 require_once ABSPATH . '/wp-admin/includes/upgrade.php'; 5 6 6 7 use Razorpay\Api\Api; … … 151 152 } 152 153 153 if (in_array($data['event'], $this->subscriptionEvents) === false)154 {155 if ($this->razorpay->isHposEnabled)156 {157 $order = wc_get_order($orderId);158 $rzpWebhookNotifiedAt = $order->get_meta('rzp_webhook_notified_at');159 }160 else161 {162 $rzpWebhookNotifiedAt = get_post_meta($orderId, "rzp_webhook_notified_at", true);163 }164 165 if ($rzpWebhookNotifiedAt === '')166 {167 if ($this->razorpay->isHposEnabled)168 {169 $order->update_meta_data('rzp_webhook_notified_at', time());170 $order->save();171 }172 else173 {174 update_post_meta($orderId, "rzp_webhook_notified_at", time());175 }176 177 rzpLogInfo("ORDER NUMBER $orderId:webhook conflict due to early execution for razorpay order: $razorpayOrderId ");178 header('Status: ' . static::HTTP_CONFLICT_STATUS . ' Webhook conflicts due to early execution.', true, static::HTTP_CONFLICT_STATUS);// nosemgrep : php.lang.security.non-literal-header.non-literal-header179 return;180 }181 elseif ((time() - $rzpWebhookNotifiedAt) < static::WEBHOOK_NOTIFY_WAIT_TIME)182 {183 rzpLogInfo("ORDER NUMBER $orderId:webhook conflict due to early execution for razorpay order: $razorpayOrderId ");184 header('Status: ' . static::HTTP_CONFLICT_STATUS . ' Webhook conflicts due to early execution.', true, static::HTTP_CONFLICT_STATUS);// nosemgrep : php.lang.security.non-literal-header.non-literal-header185 return;186 }187 188 rzpLogInfo("ORDER NUMBER $orderId:webhook conflict over for razorpay order: $razorpayOrderId");189 }190 191 154 rzpLogInfo("Woocommerce orderId: $orderId webhook process intitiated for event: ". $data['event']); 192 155 193 156 switch ($data['event']) { 194 157 case self::PAYMENT_AUTHORIZED: 195 return $this->paymentAuthorized($data); 158 $webhookFilteredData = [ 159 'invoice_id' => $data['payload']['payment']['entity']['invoice_id'], 160 'woocommerce_order_number' => $data['payload']['payment']['entity']['notes']['woocommerce_order_number'], 161 'razorpay_payment_id' => $data['payload']['payment']['entity']['id'], 162 'event' => $data['event'] 163 ]; 164 $this->saveWebhookEvent($webhookFilteredData, $data['payload']['payment']['entity']['order_id']); 165 return; 196 166 197 167 case self::VIRTUAL_ACCOUNT_CREDITED: … … 227 197 228 198 /** 199 * saves triggered webhook event in rzp_webhook_data table 200 * @param array $data Webook event Data 201 */ 202 protected function saveWebhookEvent($data, $rzpOrderId) 203 { 204 global $wpdb; 205 206 try 207 { 208 $tableName = $wpdb->prefix . 'rzp_webhook_requests'; 209 210 $integration = "woocommerce"; 211 212 $webhookEvents = $wpdb->get_results("SELECT rzp_webhook_data FROM $tableName where order_id=" . $data['woocommerce_order_number'] . "rzp_order_id=" . $rzpOrderId . ";"); 213 214 $rzpWebhookData = (array) json_decode($webhookEvents['rzp_webhook_data']); 215 216 $rzpWebhookData[] = $data; 217 218 $wpdb->update( 219 $tableName, 220 array( 221 'rzp_webhook_data' => json_encode($rzpWebhookData), 222 'rzp_webhook_notified_at' => time() 223 ), 224 array( 225 'integration' => $integration, 226 'order_id' => $data['woocommerce_order_number'], 227 'rzp_order_id' => $rzpOrderId 228 ) 229 ); 230 rzpLogInfo("webhook event saved for order:" . $data['woocommerce_order_number']); 231 } 232 catch (Exception $e) 233 { 234 rzpLogError("Insert webhook event failed. " . $e->getMessage()); 235 } 236 } 237 238 /** 229 239 * Does nothing for the main payments flow currently 230 240 * @param array $data Webook Data … … 276 286 * @param array $data Webook Data 277 287 */ 278 p rotectedfunction paymentAuthorized(array $data)288 public function paymentAuthorized(array $data) 279 289 { 280 290 // We don't process subscription/invoice payments here 281 if (isset($data[' payload']['payment']['entity']['invoice_id']) === true) {291 if (isset($data['invoice_id']) === true) { 282 292 return; 283 293 } … … 286 296 // Order entity should be sent as part of the webhook payload 287 297 // 288 $orderId = $data[' payload']['payment']['entity']['notes']['woocommerce_order_number'];289 290 rzpLogInfo("Woocommerce orderId: $orderId webhook process intitiated for payment authorized event");298 $orderId = $data['woocommerce_order_number']; 299 300 rzpLogInfo("Woocommerce orderId: $orderId, webhook process intitiated for payment authorized event by cron"); 291 301 292 302 if (!empty($orderId)) { … … 310 320 } 311 321 312 $razorpayPaymentId = $data[' payload']['payment']['entity']['id'];322 $razorpayPaymentId = $data['razorpay_payment_id']; 313 323 314 324 $payment = $this->getPaymentEntity($razorpayPaymentId, $data); … … 356 366 357 367 $this->razorpay->updateOrder($order, $success, $errorMessage, $razorpayPaymentId, null, true); 358 rzpLogInfo("Woocommerce orderId: $orderId webhook process finished the update order function");359 368 360 369 rzpLogInfo("Woocommerce orderId: $orderId webhook process finished the updateOrder function"); 361 362 // Graceful exit since payment is now processed.363 exit;364 370 } 365 371 -
woo-razorpay/trunk/readme.txt
r3260564 r3269687 3 3 Tags: razorpay, payments, india, woocommerce, curlec, malaysia, ecommerce, international, cross border 4 4 Requires at least: 3.9.2 5 Tested up to: 6. 66 Stable tag: 4.7. 15 Tested up to: 6.7 6 Stable tag: 4.7.2 7 7 Requires PHP: 7.0 8 8 License: GPLv2 or later … … 69 69 70 70 == Changelog == 71 72 = 4.7.2 = 73 * Added cron for webhook. 71 74 72 75 = 4.7.1 = -
woo-razorpay/trunk/woo-razorpay.php
r3260564 r3269687 4 4 * Plugin URI: https://razorpay.com 5 5 * Description: Razorpay Payment Gateway Integration for WooCommerce.Razorpay Welcome Back Offer: New to Razorpay? Sign up to enjoy FREE payments* of INR 2 lakh till March 31st! Transact before January 10th to grab the offer. 6 * Version: 4.7. 17 * Stable tag: 4.7. 16 * Version: 4.7.2 7 * Stable tag: 4.7.2 8 8 * Author: Team Razorpay 9 9 * WC tested up to: 9.1.2 … … 34 34 require_once __DIR__.'/includes/cron/cron.php'; 35 35 require_once __DIR__.'/includes/cron/plugin-fetch.php'; 36 require_once ABSPATH . '/wp-admin/includes/upgrade.php'; 36 37 37 38 use Razorpay\Api\Api; … … 147 148 const PREPAY_COD_URL = '1cc/orders/cod/convert'; 148 149 const ONE_CC_MERCHANT_PREF = 'one_cc_merchant_preference'; 150 151 const RZP_ORDER_CREATED = 0; 152 const RZP_ORDER_PROCESSED_BY_CALLBACK = 1; 153 const RZP_INTEGRATION = 'woocommerce'; 149 154 150 155 protected $supportedWebhookEvents = array( … … 1227 1232 // Calls the helper function to create order data 1228 1233 global $woocommerce; 1234 global $wpdb; 1229 1235 1230 1236 $api = $this->getRazorpayApiInstance(); … … 1279 1285 1280 1286 $order->add_order_note("Razorpay OrderId: $razorpayOrderId"); 1287 1288 try 1289 { 1290 // insert record in webhook table 1291 $wpdb->insert( 1292 $wpdb->prefix . "rzp_webhook_requests", 1293 array( 1294 'integration' => self::RZP_INTEGRATION, 1295 'order_id' => $orderId, 1296 'rzp_order_id' => $razorpayOrderId, 1297 'rzp_webhook_data' => '[]', 1298 'rzp_update_order_cron_status' => self::RZP_ORDER_CREATED 1299 ) 1300 ); 1301 } 1302 catch (Exception $e) 1303 { 1304 rzpLogError("Failed to insert order in rzp_webhook_requests table: " . $e->getMessage()); 1305 } 1281 1306 1282 1307 return $razorpayOrderId; … … 1906 1931 $this->updateOrder($order, $success, $error, $razorpayPaymentId, null); 1907 1932 1933 try 1934 { 1935 // update order status in webhook table 1936 $sessionKey = $this->getOrderSessionKey($orderId); 1937 $razorpayOrderId = ''; 1938 1939 if(get_transient($sessionKey)) 1940 { 1941 $razorpayOrderId = get_transient($sessionKey); 1942 } 1943 else 1944 { 1945 $razorpayOrderId = $woocommerce->session->get($sessionKey); 1946 } 1947 1948 $wpdb->update( 1949 $wpdb->prefix . 'rzp_webhook_requests', 1950 array( 1951 'rzp_update_order_cron_status' => self::RZP_ORDER_PROCESSED_BY_CALLBACK 1952 ), 1953 array( 1954 'integration' => self::RZP_INTEGRATION, 1955 'order_id' => $orderId, 1956 'rzp_order_id' => $razorpayOrderId 1957 ) 1958 ); 1959 } 1960 catch (Exception $e) 1961 { 1962 rzpLogError("Failed to update order by callback in rzp_webhook_requests table: " . $e->getMessage()); 1963 } 1964 1908 1965 $this->redirectUser($order); 1909 1966 } … … 3017 3074 </div>'; 3018 3075 3076 } 3077 } 3078 3079 /** 3080 * Add Cron schedules/intervals 3081 **/ 3082 function rzpWooCronSchedules($schedules) 3083 { 3084 if (isset($schedules['rzp_webhook_cron_interval']) === false) 3085 { 3086 $schedules['rzp_webhook_cron_interval'] = array( 3087 'interval' => 5 * 60, 3088 'display' => __('Every 5 minutes')); 3089 } 3090 3091 return $schedules; 3092 } 3093 3094 add_filter('cron_schedules', 'rzpWooCronSchedules'); 3095 3096 /** 3097 * Webhook Cron to execute events 3098 **/ 3099 function execRzpWooWebhookEvents() 3100 { 3101 global $wpdb; 3102 rzpLogInfo("Running webhook cron."); 3103 3104 try 3105 { 3106 $rzpOrderProcessedByWebhook = 2; 3107 $integration = "woocommerce"; 3108 $tableName = $wpdb->prefix . "rzp_webhook_requests"; 3109 3110 $ordersData = $wpdb->get_results("SELECT order_id, rzp_order_id, rzp_webhook_data FROM $tableName WHERE integration='" . $integration . "' AND rzp_webhook_notified_at < " . (string)(time() - 300) ." AND rzp_update_order_cron_status=0;"); 3111 $rzpWebhookObj = new RZP_Webhook(); 3112 3113 foreach ($ordersData as $row) 3114 { 3115 rzpLogInfo("Webhook cron executing woocommerce order:" . $row->order_id); 3116 $events = json_decode($row->rzp_webhook_data); 3117 foreach ($events as $event) 3118 { 3119 $event = (array) $event; 3120 switch ($event['event']) 3121 { 3122 case 'payment.authorized': 3123 try 3124 { 3125 $rzpWebhookObj->paymentAuthorized($event); 3126 3127 $wpdb->update( 3128 $tableName, 3129 array( 3130 'rzp_update_order_cron_status' => $rzpOrderProcessedByWebhook 3131 ), 3132 array( 3133 'integration' => $integration, 3134 'order_id' => $row->order_id, 3135 'rzp_order_id' => $row->rzp_order_id 3136 ) 3137 ); 3138 break; 3139 } 3140 catch (Exception $e) 3141 { 3142 rzpLogError("paymentAuthorized event failed for orderID: " . $row->order_id); 3143 } 3144 default: 3145 break; 3146 } 3147 } 3148 } 3149 } 3150 catch (Exception $e) 3151 { 3152 rzpLogError("Webhook cron execution failed: " . $e->getMessage()); 3153 } 3154 rzpLogInfo("Webhook cron execution completed."); 3155 } 3156 3157 add_action('rzp_webhook_exec_cron', 'execRzpWooWebhookEvents'); 3158 3159 $rzpWebhookSetup = get_option('rzp_webhook_setup'); 3160 3161 if (empty($rzpWebhookSetup) === true) 3162 { 3163 try 3164 { 3165 // create table to save triggered webhook events 3166 global $wpdb; 3167 3168 $sql = "CREATE TABLE IF NOT EXISTS `{$wpdb->prefix}rzp_webhook_requests` ( 3169 `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, 3170 `integration` varchar(25) NOT NULL, 3171 `order_id` int(11) NOT NULL, 3172 `rzp_order_id` varchar(25) NOT NULL, 3173 `rzp_webhook_data` text, 3174 `rzp_webhook_notified_at` int(11), 3175 `rzp_update_order_cron_status` int(11) DEFAULT 0, 3176 PRIMARY KEY (`id`)) " . $wpdb->get_charset_collate() . ";"; 3177 3178 // create cron with 5 min interval 3179 if (wp_next_scheduled('rzp_webhook_exec_cron') === false) 3180 { 3181 wp_schedule_event(time(), 'rzp_webhook_cron_interval', 'rzp_webhook_exec_cron'); 3182 } 3183 3184 if ((empty(dbDelta($sql)) === false) and 3185 (empty(wp_next_scheduled('rzp_webhook_exec_cron')) === false)) 3186 { 3187 update_option('rzp_webhook_setup', true); 3188 } 3189 } 3190 catch (Exception $e) 3191 { 3192 rzpLogInfo("Webhook table/cron creation failed: ". $e->getMessage()); 3193 delete_option('rzp_webhook_setup'); 3019 3194 } 3020 3195 }
Note: See TracChangeset
for help on using the changeset viewer.