15, 'body' => $args, ) ); if ( is_wp_error( $res ) ) { return new WP_Error( 'network', __( 'Сервис SMS недоступен. Попробуйте позже.', 'propusk' ) ); } $data = json_decode( wp_remote_retrieve_body( $res ), true ); if ( ! is_array( $data ) ) { return new WP_Error( 'network', __( 'Сервис SMS вернул неожиданный ответ.', 'propusk' ) ); } return $data; } /** Отправить SMS. */ public static function send( $phone, $text ) { $args = array( 'to' => $phone, 'msg' => $text, 'ip' => PRPS_Phone::ip(), ); $from = trim( (string) PRPS_Settings::get( 'smsru_from' ) ); if ( '' !== $from ) { $args['from'] = $from; } $data = self::request( 'sms/send', $args ); if ( is_wp_error( $data ) ) { return $data; } $sms = $data['sms'][ $phone ] ?? array(); if ( 'OK' !== ( $data['status'] ?? '' ) || 'OK' !== ( $sms['status'] ?? '' ) ) { self::log_error( (string) ( $sms['status_text'] ?? $data['status_text'] ?? '' ) ); return new WP_Error( 'send', __( 'Не удалось отправить SMS. Проверьте номер или попробуйте позже.', 'propusk' ) ); } return true; } /** Начать проверку звонком: посетитель звонит на бесплатный номер. */ public static function call_start( $phone ) { $data = self::request( 'callcheck/add', array( 'phone' => $phone, 'ip' => PRPS_Phone::ip(), ) ); if ( is_wp_error( $data ) ) { return $data; } if ( 'OK' !== ( $data['status'] ?? '' ) || empty( $data['check_id'] ) ) { self::log_error( (string) ( $data['status_text'] ?? '' ) ); return new WP_Error( 'call', __( 'Не удалось начать проверку звонком. Попробуйте позже.', 'propusk' ) ); } return array( 'check_id' => (string) $data['check_id'], 'call_phone' => (string) ( $data['call_phone'] ?? '' ), 'call_phone_pretty' => (string) ( $data['call_phone_pretty'] ?? $data['call_phone'] ?? '' ), ); } /** * Звонок был? * * @return true|null|WP_Error */ public static function call_status( $check_id ) { $data = self::request( 'callcheck/status', array( 'check_id' => $check_id ) ); if ( is_wp_error( $data ) ) { return $data; } $status = (int) ( $data['check_status'] ?? 0 ); if ( 401 === $status ) { return true; } if ( 402 === $status ) { return new WP_Error( 'expired', __( 'Время ожидания звонка истекло. Начните заново.', 'propusk' ) ); } return null; } /** Ошибка сервиса — для администратора на странице настроек. */ private static function log_error( $text ) { update_option( 'prps_last_error', array( 'time' => time(), 'text' => sanitize_text_field( $text ) ), false ); } /** Баланс — для проверки ключа в настройках. */ public static function balance() { $data = self::request( 'my/balance', array() ); if ( is_wp_error( $data ) ) { return $data; } if ( 'OK' !== ( $data['status'] ?? '' ) ) { return new WP_Error( 'key', (string) ( $data['status_text'] ?? __( 'Ключ не подошёл', 'propusk' ) ) ); } return (float) ( $data['balance'] ?? 0 ); } }