'Stripe', 'paypal' => 'PayPal', 'razorpay' => 'Razorpay', 'sslcommerz' => 'SSLCommerz', 'bkash' => 'bKash', 'manual' => 'Manual Deposit' ]; /** * Process deposit request * * @param int $user_id * @param float $amount * @param string $currency * @param string $gateway * @return array|WP_Error */ public static function process_deposit($user_id, $amount, $currency, $gateway = 'manual') { // Validate amount if ($amount <= 0) { return new WP_Error('invalid_amount', __('Invalid deposit amount', 'najibul-balance')); } // Validate gateway if (!isset(self::$gateways[$gateway])) { return new WP_Error('invalid_gateway', __('Invalid payment gateway', 'najibul-balance')); } // Get exchange rate $rate = Najibul_Balance_Helper::get_exchange_rate($currency); if (!$rate) { return new WP_Error('invalid_currency', __('Invalid currency', 'najibul-balance')); } // Calculate USD amount $amount_usd = $amount / $rate; // Create payment log $transaction_id = self::generate_transaction_id($gateway); $log_id = Najibul_Balance_Helper::log_payment( $user_id, $gateway, $transaction_id, $amount, $currency, 'pending', [ 'amount_usd' => $amount_usd, 'rate' => $rate, 'timestamp' => current_time('mysql') ] ); if (!$log_id) { return new WP_Error('log_failed', __('Failed to create payment log', 'najibul-balance')); } // Get gateway-specific data $gateway_data = self::get_gateway_data($gateway, $transaction_id, $amount, $currency, $user_id); return [ 'success' => true, 'transaction_id' => $transaction_id, 'log_id' => $log_id, 'amount' => $amount, 'currency' => $currency, 'amount_usd' => $amount_usd, 'gateway' => $gateway, 'gateway_data' => $gateway_data, 'message' => sprintf(__('Deposit initiated via %s', 'najibul-balance'), self::$gateways[$gateway]) ]; } /** * Confirm payment and add funds to wallet * * @param string $gateway * @param string $transaction_id * @param string $status * @param array $payment_data * @return bool|WP_Error */ public static function confirm_payment($gateway, $transaction_id, $status = 'completed', $payment_data = []) { global $wpdb; $log_table = $wpdb->prefix . 'najibul_payment_logs'; // Get payment log $log = $wpdb->get_row($wpdb->prepare( "SELECT * FROM $log_table WHERE gateway = %s AND transaction_id = %s", $gateway, $transaction_id )); if (!$log) { return new WP_Error('not_found', __('Payment log not found', 'najibul-balance')); } if ($log->status === 'completed') { return new WP_Error('already_processed', __('Payment already processed', 'najibul-balance')); } if ($status === 'completed') { // Start transaction $wpdb->query('START TRANSACTION'); try { // Add funds to wallet $result = Najibul_Balance_Helper::add_funds( $log->user_id, $log->amount, $log->currency, 'deposit', $gateway . '-' . $transaction_id, [ 'payment_log_id' => $log->id, 'gateway' => $gateway, 'gateway_data' => $payment_data ] ); if (!$result) { throw new Exception('Failed to add funds to wallet'); } // Update log status $wpdb->update( $log_table, [ 'status' => 'completed', 'gateway_response' => json_encode($payment_data) ], ['id' => $log->id], ['%s', '%s'], ['%d'] ); $wpdb->query('COMMIT'); // Trigger action for notifications do_action('najibul_balance_deposit_completed', $log->user_id, $log->amount, $log->currency, $gateway); return true; } catch (Exception $e) { $wpdb->query('ROLLBACK'); return new WP_Error('processing_failed', $e->getMessage()); } } else { // Update log status for failed/cancelled payment $wpdb->update( $log_table, [ 'status' => $status, 'gateway_response' => json_encode($payment_data) ], ['id' => $log->id], ['%s', '%s'], ['%d'] ); return false; } } /** * Generate unique transaction ID * * @param string $gateway * @return string */ private static function generate_transaction_id($gateway) { return $gateway . '_' . uniqid() . '_' . time() . '_' . wp_rand(1000, 9999); } /** * Get gateway-specific data for frontend * * @param string $gateway * @param string $transaction_id * @param float $amount * @param string $currency * @param int $user_id * @return array */ private static function get_gateway_data($gateway, $transaction_id, $amount, $currency, $user_id) { $data = [ 'transaction_id' => $transaction_id, 'amount' => $amount, 'currency' => $currency, 'user_id' => $user_id ]; switch ($gateway) { case 'stripe': $data['publishable_key'] = get_option('najibul_stripe_publishable_key', ''); $data['secret_key'] = ''; // Never send secret key to frontend break; case 'paypal': $data['client_id'] = get_option('najibul_paypal_client_id', ''); $data['mode'] = get_option('najibul_paypal_mode', 'sandbox'); break; case 'razorpay': $data['key_id'] = get_option('najibul_razorpay_key_id', ''); $data['company_name'] = get_bloginfo('name'); break; case 'sslcommerz': $data['store_id'] = get_option('najibul_sslcommerz_store_id', ''); $data['mode'] = get_option('najibul_sslcommerz_mode', 'sandbox'); break; case 'bkash': $data['merchant_number'] = get_option('najibul_bkash_merchant_number', ''); break; } return $data; } /** * Get available gateways * * @return array */ public static function get_available_gateways() { $available = []; foreach (self::$gateways as $key => $name) { // Check if gateway is configured (you can add more checks) $available[$key] = [ 'id' => $key, 'name' => $name, 'enabled' => get_option('najibul_gateway_' . $key . '_enabled', $key === 'manual') ]; } return $available; } /** * Get transaction by ID * * @param string $transaction_id * @return object|null */ public static function get_transaction($transaction_id) { global $wpdb; return $wpdb->get_row($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}najibul_payment_logs WHERE transaction_id = %s", $transaction_id )); } /** * Get user transactions * * @param int $user_id * @param int $limit * @return array */ public static function get_user_transactions($user_id, $limit = 10) { global $wpdb; return $wpdb->get_results($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}najibul_payment_logs WHERE user_id = %d ORDER BY created_at DESC LIMIT %d", $user_id, $limit )); }}