Plugin Directory

Changeset 3269687


Ignore:
Timestamp:
04/09/2025 12:32:44 PM (11 months ago)
Author:
razorpay
Message:

Update: 4.7.2

Location:
woo-razorpay/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • woo-razorpay/trunk/includes/razorpay-webhook.php

    r3221997 r3269687  
    33require_once __DIR__ . '/../woo-razorpay.php';
    44require_once __DIR__ . '/../razorpay-sdk/Razorpay.php';
     5require_once ABSPATH . '/wp-admin/includes/upgrade.php';
    56
    67use Razorpay\Api\Api;
     
    151152                }
    152153
    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                     else
    161                     {
    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                         else
    173                         {
    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-header
    179                         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-header
    185                         return;
    186                     }
    187 
    188                     rzpLogInfo("ORDER NUMBER $orderId:webhook conflict over for razorpay order: $razorpayOrderId");
    189                 }
    190 
    191154                rzpLogInfo("Woocommerce orderId: $orderId webhook process intitiated for event: ". $data['event']);
    192155
    193156                switch ($data['event']) {
    194157                    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;
    196166
    197167                    case self::VIRTUAL_ACCOUNT_CREDITED:
     
    227197
    228198    /**
     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    /**
    229239     * Does nothing for the main payments flow currently
    230240     * @param array $data Webook Data
     
    276286     * @param array $data Webook Data
    277287     */
    278     protected function paymentAuthorized(array $data)
     288    public function paymentAuthorized(array $data)
    279289    {
    280290        // 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) {
    282292            return;
    283293        }
     
    286296        // Order entity should be sent as part of the webhook payload
    287297        //
    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");
    291301
    292302        if (!empty($orderId)) {
     
    310320        }
    311321
    312         $razorpayPaymentId = $data['payload']['payment']['entity']['id'];
     322        $razorpayPaymentId = $data['razorpay_payment_id'];
    313323
    314324        $payment = $this->getPaymentEntity($razorpayPaymentId, $data);
     
    356366
    357367        $this->razorpay->updateOrder($order, $success, $errorMessage, $razorpayPaymentId, null, true);
    358         rzpLogInfo("Woocommerce orderId: $orderId webhook process finished the update order function");
    359368
    360369        rzpLogInfo("Woocommerce orderId: $orderId webhook process finished the updateOrder function");
    361 
    362         // Graceful exit since payment is now processed.
    363         exit;
    364370    }
    365371
  • woo-razorpay/trunk/readme.txt

    r3260564 r3269687  
    33Tags: razorpay, payments, india, woocommerce, curlec, malaysia, ecommerce, international, cross border
    44Requires at least: 3.9.2
    5 Tested up to: 6.6
    6 Stable tag: 4.7.1
     5Tested up to: 6.7
     6Stable tag: 4.7.2
    77Requires PHP: 7.0
    88License: GPLv2 or later
     
    6969
    7070== Changelog ==
     71
     72= 4.7.2 =
     73* Added cron for webhook.
    7174
    7275= 4.7.1 =
  • woo-razorpay/trunk/woo-razorpay.php

    r3260564 r3269687  
    44 * Plugin URI: https://razorpay.com
    55 * 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.1
    7  * Stable tag: 4.7.1
     6 * Version: 4.7.2
     7 * Stable tag: 4.7.2
    88 * Author: Team Razorpay
    99 * WC tested up to: 9.1.2
     
    3434require_once __DIR__.'/includes/cron/cron.php';
    3535require_once __DIR__.'/includes/cron/plugin-fetch.php';
     36require_once ABSPATH . '/wp-admin/includes/upgrade.php';
    3637
    3738use Razorpay\Api\Api;
     
    147148        const PREPAY_COD_URL = '1cc/orders/cod/convert';
    148149        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';
    149154
    150155        protected $supportedWebhookEvents = array(
     
    12271232            // Calls the helper function to create order data
    12281233            global $woocommerce;
     1234            global $wpdb;
    12291235
    12301236            $api = $this->getRazorpayApiInstance();
     
    12791285
    12801286            $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            }
    12811306
    12821307            return $razorpayOrderId;
     
    19061931            $this->updateOrder($order, $success, $error, $razorpayPaymentId, null);
    19071932
     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
    19081965            $this->redirectUser($order);
    19091966        }
     
    30173074            </div>';
    30183075
     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');
    30193194        }
    30203195    }
Note: See TracChangeset for help on using the changeset viewer.