Agregar servicios en línea (obsoleto)

Los servicios en línea se definen como servicios que se ofrecen en línea por completo a través de una plataforma alojada y que no requieren que un cliente asista al servicio de forma presencial. Algunos ejemplos de servicios en línea pueden incluir:

  • Clase de yoga en línea por Zoom
  • Clase magistral de maquillaje en línea mediante Google Meet
  • Estimación en línea de video sobre plomería mediante Skype

Requisitos de elegibilidad para los servicios en línea

Antes de comenzar la implementación, revisa las políticas y las prácticas recomendadas de los servicios en línea.

Implementación de servicios en línea

Una integración de servicios en línea es un complemento de la integración de extremo a extremo de Appointments existente y requiere algunos cambios en una implementación existente. A grandes rasgos, estos son algunos de los cambios:

  • Feeds: Agrega type, VirtualSession, DirectMerchantPayment y CancellationPolicy (si aún no se agregaron) a los feeds de servicios.
  • Servidor de reservas: Agrega VirtualSessionInfo al método CreateBooking y envía correos electrónicos con información de configuración virtual al usuario.
  • Actualizaciones en tiempo real (comportamiento existente): Controla los cambios en el inventario virtual a través de la RTU de InventoryUpdate, las modificaciones a la reserva mediante la RTU de BookingNotification y los cambios en el servicio a través de la RTU del servicio.

Feeds

Feed de servicios

Los siguientes campos se agregan al feed de servicios para admitir los servicios en línea.

Especificaciones del feed de servicios

 enum ServiceType {
     SERVICE_TYPE_UNSPECIFIED = 0;
    // Service that provides dining reservation.
    SERVICE_TYPE_DINING_RESERVATION = 1;
    // Service that provides food ordering in general, could be either takeout
    // or delivery or both.
    SERVICE_TYPE_FOOD_ORDERING = 2;
    // Service that only provides food delivery.
    SERVICE_TYPE_FOOD_DELIVERY = 6;
    // Service that only provides food takeout.
    SERVICE_TYPE_FOOD_TAKEOUT = 7;

    // Service that provides appointments or classes. Recommended for (1) health
    // and fitness, (2) spa and beauty, and (3) financial consults and
    // evaluations services. Please see the supported service types:
    // https://developers.google.com/actions-center/guides/end-to-end-integration/overview
    SERVICE_TYPE_APPOINTMENT = 5;
    // Service that provides appointment for an online class or session which
    // will be fully virtual. Must be set if enabling virtual service bookings.
    SERVICE_TYPE_ONLINE_APPOINTMENT = 8;
  }
// Information about virtual/online session. E.g. Online yoga class, virtual
// cooking class etc.
message VirtualSession {
  // Instructions on how this virtual class is set up. If the partner does not
  // include the video URL with the booking, then this text must include when
  // the video URL will be shared with the user. Eg. “Zoom url will be mailed
  // 30 minutes prior to the class”. (Recommended)
  // Only the folloiwng four tags are supported: <br>, <strong>, <em>, <i>.
  Text session_instructions = 1;

  // Requirements for the given virtual session. Eg. yoga mat,
  // cooking utensils etc. (Recommended)
  // Only the folloiwng four tags are supported: <br>, <strong>, <em>, <i>.
  Text session_requirements = 2;

  // Information about the virtual platform used in this session. (Required to
  // enable virtual services)
  message VirtualPlatformInfo {
    // Enum to indicate which virtual platform would be used by the merchant.
    enum Platform {
      PLATFORM_UNSPECIFIED = 0;
      // The merchant is flexible in which video platform they use.
      FLEXIBLE = 1;
      GOOGLE_HANGOUTS = 2;
      GOOGLE_MEET = 3;
      ZOOM = 4;
      SKYPE = 5;
      YOUTUBE = 6;
      // Should be set if the video platform used is different from the ones
      // mentioned here.
      OTHER = 7;
    }
    Platform platform = 1;
    // The name of the platform if the platform is set to OTHER. (Required if
    // platform is set to OTHER)
    Text other_platform_name = 2;
  }
  VirtualPlatformInfo virtual_platform_info = 3;

  // Set this as true if the virtual session is not live and is pre-recorded.
  // (Optional)
  bool is_session_prerecorded = 4;
}
// Information about how the user can pay directly to the merchant instead of
// pre-paying for the service via RwG.
message DirectMerchantPayment {
  // Users would be advised to pay only via the payment methods mentioned below.
  repeated Text payment_methods = 1;
}
// Cancellation policy for a service.
message CancellationPolicy {
  // Defines a single refund condition. Multiple refund conditions could be
  // used together to describe "refund steps" as various durations before the
  // service start time.
  message RefundCondition {
    // Duration in seconds before the start time, until when the customer can
    // receive a refund for part of the service's cost specified in
    // `refund_percent`.
    // When set to 0 (default), the service can be cancelled at any time.
    int64 min_duration_before_start_time_sec = 1;

    // The percent that can be refunded, as long as the service booking is
    // cancelled at least `min_duration_before_start_time` before the service
    // start time, in the range of [0, 100]. When set to 0 (default), the
    // service is not refundable. When set to 100 this service is fully
    // refundable.
    uint32 refund_percent = 2;
  }
  // Zero or more refund conditions applicable to the policy.
  repeated RefundCondition refund_condition = 1;
}

Ejemplo de feed de servicios

{
  "service": [
    {
      "merchant_id": "100",
      "service_id": "100-1",
      "type" : "SERVICE_TYPE_ONLINE_APPOINTMENT",
      "localized_service_name": {
        "value": "Makeup masterclass",
        "localized_value": [
          {
            "locale": "en",
            "value": "Makeup masterclass"
          }
        ]
      },
      "localized_description": {
        "value": "Learn how to do runway makeup from an award winning makeup artist.",
        "localized_value": [
          {
            "locale": "en",
            "value": "Learn how to do runway makeup from an award winning makeup artist."
          }
        ]
      },
      "virtual_session": {
        "session_instructions": {
          "value": "You must have access to a computer, and a solid internet connection. Class registration link will be sent to you 15 mins before the start of the class. The class link will be accessible 1 day after the class.  ",
          "localized_value": [
            {
              "locale": "en",
              "value": "You must have access to a computer, and a solid internet connection. Class registration link will be sent to you 15 mins before the start of the class. The class link will be accessible 1 day after the class.  "
            }
          ]
        },
        "session_requirements": {
          "value": "makeup brush, makeup palette, mirror",
          "localized_value": [
            {
              "locale": "en",
              "value": "makeup brush, makeup palette, mirror"
            }
          ]
        },
        "virtual_platform_info": {
          "platform": "OTHER",
          "other_platform_name": "Susan's hosted platform"
        }
      },
      "direct_merchant_payment": {
        "payment_methods": [
          {
            "value": "Venmo",
            "localized_value": [
              {
                "locale": "en",
                "value": "Venmo"
              }
            ]
          }
        ]
      },
      "price": {
        "price_micros": 75000000,
        "currency_code": "USD"
      },
      "rules": {
        "min_advance_booking": 0,
        "min_advance_online_canceling": 86400,
        "cancellation_policy": {
          "refund_condition": [
            {
              "min_duration_before_start_time_sec": 3600,
              "refund_percent": 100
            }
          ]
        }
      },
      "prepayment_type": "NOT_SUPPORTED",
      "tax_rate": {
        "micro_percent": 7750000
      }
    },
    {
      "merchant_id": "100",
      "service_id": "100-2",
      "type" : "SERVICE_TYPE_ONLINE_APPOINTMENT",
      "localized_service_name": {
        "value": "Advanced Vinyasa Yoga",
        "localized_value": [
          {
            "locale": "en",
            "value": "Advanced Vinyasa Yoga"
          }
        ]
      },
      "localized_description": {
        "value": "Learn the advanced techniques of vinyasa yoga taught by award winning yoga instructors.",
        "localized_value": [
          {
            "locale": "en",
            "value": "Learn the advanced techniques of vinyasa yoga taught by award winning yoga instructors."
          }
        ]
      },
      "virtual_session": {
        "session_instructions": {
          "value": "You must have access to a computer, and a solid internet connection. Class registration link will be included in an email from the merchant.",
          "localized_value": [
            {
              "locale": "en",
              "value": "You must have access to a computer, and a solid internet connection. Class registration link will be included in an email from the merchant."
            }
          ]
        },
        "session_requirements": {
          "value": "yoga mat, dumbbells",
          "localized_value": [
            {
              "locale": "en",
              "value": "yoga mat, dumbbells"
            }
          ]
        },
        "virtual_platform_info": {
          "platform": "ZOOM"
        }
      },
      "price": {
        "price_micros": 40000000,
        "currency_code": "USD"
      },
      "rules": {
        "min_advance_booking": 0,
        "min_advance_online_canceling": 86400,
        "cancellation_policy": {
          "refund_condition": [
            {
              "min_duration_before_start_time_sec": 86400,
              "refund_percent": 100
            },
            {
              "min_duration_before_start_time_sec": 3600,
              "refund_percent": 50
            }
          ]
        }
      },
      "prepayment_type": "REQUIRED",
      "tax_rate": {
        "micro_percent": 7750000
      },
      "require_credit_card": "REQUIRE_CREDIT_CARD_ALWAYS"
    }
  ]
}
  • Descripción localizada: La descripción debe expresar claramente de qué se trata el servicio. Consulta la guía de prácticas recomendadas sobre la mejor manera de estructurar el contenido de tus servicios.
  • Instrucciones de la sesión: Las instrucciones de la sesión deben describir toda la configuración necesaria y cumplir con la orientación que se detalla en la política.
    • Si la URL de video de la plataforma y el ID de reunión no se crean automáticamente como parte de CreateBooking (p.ej., los detalles no se envían a través de CreateBookingResponse), debes indicar claramente en session_instructions cuándo y de quién el usuario debe esperar que se le envíen los detalles de la plataforma.
  • Requisitos de la sesión: Los requisitos de la sesión deben describir todos los equipos o materiales necesarios que un usuario necesita para participar en la clase de manera efectiva. También puedes incluir materiales opcionales que el usuario podría necesitar, pero márcalos como opcionales.
  • Plataforma: La plataforma debe indicar la plataforma que usará el usuario para acceder al servicio en línea.
    • Si el comercio determinará la plataforma más adelante, establece platform en FLEXIBLE.
    • Si la plataforma que usa el comercio no está en la lista, establece platform en OTHER y especifica other_platform_name.
  • Política de cancelación: Es importante tener políticas de cancelación precisas. Establece CancellationPolicy si se permiten reembolsos y cancelaciones. Si no se establece, la suposición predeterminada es que no se permiten los reembolsos.

Feed de disponibilidad

  • Spots Total: Establece esto como la capacidad total de participantes permitidos para la plataforma (asegúrate de restar el personal).

Servidor de reservas

Opcional: Si tu sistema crea un ID y una URL de reunión en nombre de tu comercio, incluye VirtualSessionInfo como parte de tu CreateBookingResponse.

Especificación de CreateBooking

message Booking {
// Information related to the virtual session which was booked.
message VirtualSessionInfo {
  // URL which was created for the virtual session. (optional)
  string session_url = 1;
  // The meeting id which was created for the virtual session. (optional)
  string meeting_id = 2;
  // Password required to access the session. (optional)
  string password = 3;
}

 VirtualSessionInfo virtual_session_info = X;
}

CreateBookingRequest

{
  "idempotency_token": "10000000000",
  "payment_information": {
    "prepayment_status": "PREPAYMENT_NOT_PROVIDED"
  },
  "slot": {
    "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS",
    "duration_sec": "3600",
    "merchant_id": "10001",
    "service_id": "10001-1",
    "start_sec": "1586829600"
  },
  "user_information": {
    "email": "john.doe@gmail.com",
    "family_name": "John",
    "given_name": "Doe",
    "telephone": "+123 456 7890",
    "user_id": "110291237"
  }
}

CreateBookingResponse

{
  "booking": {
    "bookingId": "abcdefg-12345",
    "slot": {
      "merchantId": "10001",
      "serviceId": "10001-1",
      "startSec": "1586804400",
      "durationSec": "3600"
    },
    "userInformation": {
      "userId": "110291237",
      "givenName": "John",
      "familyName": "Doe",
      "telephone": "+123 456 7890",
      "email": "john.doe@gmail.com"
    },
    "status": "CONFIRMED",
    "virtual_session_info": {
      "video_url": "meet.google.com/abcd-efg",
      "meeting_id": "abcd-efg",
      "password" : "somepassword"
    }
  }
}

Actualizaciones en tiempo real

En el caso de las reservas virtuales, se debe mantener la lógica existente para actualizar el inventario o las reservas.

  • RTU de InventoryUpdate: Cualquier actualización de los cambios de ranuras en tu sistema o el sistema del Centro de acciones debe activar una RTU de InventoryUpdate para notificarnos sobre los cambios en las ranuras.
  • RTU de BookingNotification: Cualquier actualización de las reservas (p.ej., modificaciones de horarios o cancelaciones) en tu sistema o el sistema del Centro de Acciones debe activar una RTU de BookingNotification para notificarnos sobre los cambios en una reserva.
    • Si un usuario no envía el pago al comercio o socio, envíanos una RTU de cancelación. El Centro de acciones enviará un correo electrónico de cancelación.
  • RTU de servicio: Si actualmente actualizas servicios a través de una RTU de servicio, asegúrate de incluir los campos de servicio en línea correspondientes si actualizas para un servicio en línea.

Correos electrónicos

De forma predeterminada, el Centro de acciones enviará los correos electrónicos estándar de confirmación de la reserva, modificación y cancelación cuando un usuario realice una transacción en la plataforma del Centro de acciones.

Además, los socios deben enviar al usuario los detalles de la conferencia, los detalles del pago y la información de la política de cancelación en correos electrónicos separados. De forma opcional, puedes enviar correos electrónicos de recordatorio antes de la cita o la clase. Consulta el documento de políticas a fin de asegurarte de que cumples con las políticas de correo electrónico para las clases virtuales.