Establecer seguimiento del estado del pedido
Para conceder artículos al usuario, debe asegurarse de que el pago haya sido aceptado.
Elija un método para hacer un seguimiento del estado del pedido:
Seleccione el método que mejor se adapte a su proyecto para acceder a los datos de Xsolla:
Si no dispone de servidor o implementa la lógica para el procesamiento de compras en el lado del cliente, puede utilizar los siguientes métodos:
- WebSocket API.
- Short-polling (Sondeo corto).
Obtener el estado de un pedido en el lado del cliente usando la API de WebSocket
La solución usa websockets para obtener los estados del pedido sin recuperar información detallada sobre este. Este método es preferente: solo se crea una conexión entre el cliente (por ejemplo, su sitio web o aplicación móvil) y el servidor de Xsolla, por lo que no hay carga adicional ni en el cliente ni en el servidor.
Dé los siguientes pasos:
- Para permitir que el servidor de Websocket de Xsolla y su cliente identifiquen los mensajes de estado del pedido, cree una conexión:
- javascript
const client = new Centrifuge(
connectionURL,
{
data: {
user_external_id: user_external_id,
auth: auth,
project_id: project_id
}
}
)
connectionURL - wss://ws-store.xsolla.com/connection/websocket
auth - user JWT token
- Para recibir nuevos mensajes sobre el estado del pedido, suscríbase a los eventos mediante la función
client.on
:
- javascript
client.on('publication', (ctx) => {
//handle the status
});
- Desencadenar el establecimiento de una conexión real:
- javascript
client.connect()
- Para recibir el historial de cambios en los estados del pedido, conecte el método del historial de la API.
- javascript
client.on('subscribed', function (ctx) {
client.history(ctx.channel, { limit: -1, since: { offset: 0 }, reverse: false }).then(function (resp) {
resp.publications.forEach((ctx) => {
/handle the status
});
}, function (err) {
//handle the status
});
});
Ejemplo de cuerpo de mensaje:
- javascript
{
order_id: 59614241,
status: 'new'
}
Están disponibles los siguientes estados de pedido:
New
— pedido creado pero no pagadoPaid
— pedido pagadoDone
— pedido entregado (todos los recibos enviados, entregas realizadas por parte de Xsolla, plataformas externas, etc.)Canceled
— pedido cancelado y pago reembolsado a un usuario
Recomendaciones de uso de Websocket:
- El tiempo de espera máximo de una respuesta mediante websocket es de 5 minutos.
- La conexión debería establecerse al abrir la interfaz de pago.
- La conexión debería interrumpirse cuando se reciba el estado final del pedido, ya sea
Canceled
oDone
. - Si se agota la vida útil del websocket o si hay cualquier problema con la conexión, recurra al sondeo corto.
Sondeo corto
Para obtener información detallada sobre los artículos del pedido después de cambiar el estado, llame a la API Obtener pedido.
NotaSe utiliza un sondeo periódico del estado del pedido: una simple solicitud HTTP que recibe el estado del pedido e información sobre el mismo. El retardo recomendado entre solicitudes es de 3 segundos.
El método XsollaCatalog.Purchase
encapsula varios métodos de seguimiento del estado del pedido. El mecanismo de seguimiento se explica en la documentación de SDK de nivel empresarial para Unity.
Además, puede implementar el procesamiento del estado y del contenido de un pedido, que se transmiten a la función de devolución de llamada onSuccess
del método de compra.
Cuando utilice el SDK, puede hacer un seguimiento del estado del pedido de las siguientes maneras:
Suscribirse a los cambios de estado de los pedidos
Para suscribirse a los cambios de estado del pedido, use el método del SDK getOrderStatus
de la biblioteca de Store y transmita los siguientes parámetros al método:
listener
- objeto de agente de escucha del tipoOrderStatusListener
.orderId
- ID del pedido recibido de la compra mediante la cesta de la compra, compra con un solo clic o compra a cambio de moneda virtual como el parámetro.
Ejemplo de llamada al método XStore.getOrderStatus:
- kotlin
XStore.getOrderStatus(object : OrderStatusListener() {
override fun onStatusUpdate(status: OrderResponse.Status) {
if(status == OrderResponse.Status.DONE) {
Log.d("MainActivity", "Success")
}
}
override fun onFailure() {
Log.d("MainActivity", "Failure")
}
}, orderId)
Recomendamos invocar el método XStore.getOrderStatus
al abrir la interfaz de pago.
Estos métodos de compra encapsulan varios métodos de seguimiento del estado del pedido. El seguimiento se realiza conforme al siguiente algoritmo:
- Hay establecida una conexión de socket web.
- Si la conexión de socket web está establecida correctamente y el estado del pedido cambia a
done
ocancel
, se detiene el seguimiento. Si la conexión de socket web falla o la respuesta contiene datos incorrectos, el seguimiento del estado del pedido se realiza mediante sondeo corto. - El seguimiento del estado del pedido prosigue con sondeo corto. Una simple solicitud HTTP de estado del pedido se envía una vez cada 3 segundos. El seguimiento se detiene si el estado del pedido cambia a
done
ocancel
.
Solicitar el estado del pedido
Para solicitar el estado actual de la transacción de pago, invoque el método getOrder
de la biblioteca de Store, transmitiéndole los siguientes parámetros:
orderId
: el ID del pedido, que se recibió al adquirir el artículo.callback
: la devolución de llamada para recuperar la información del pedido correctamente. Cuando implemente una devolución de llamada, utilice la interfazGetStatusCallback
e implemente los métodosonSuccess
yonError
.callback
: la devolución de llamada para recuperar la información del pedido correctamente. Cuando implemente una devolución de llamada, utilice la interfazGetStatusCallback
e implemente los métodosonSuccess
yonError
.
La información sobre el estado del pedido se transmite al método onSuccess
en un objeto de tipo InvoicesDataResponse
. Este objeto contiene una matriz de objetos InvoiceData
. Cada objeto InvoiceData
corresponde a una etapa concreta del procesamiento del pedido y contiene el estado de dicha etapa.
Por ejemplo, si el usuario inicialmente introdujo datos no válidos al realizar el pedido, aparecerá un objeto con el estado InvoicesDataResponse.CANCELED
en la lista InvoiceData
. Si después el usuario corrige los datos y realiza correctamente el pago del pedido, aparecerá un nuevo objeto InvoiceData
en la matriz, ahora con el estado InvoicesDataResponse.Status.DONE
.
El seguimiento del estado se detiene si se recibe el estado de pago final (InvoicesDataResponse.Status.DONE
o InvoicesDataResponse.Status.ERROR
).
Ejemplo
- kotlin
XPayments.getStatus(<token>, <isSandbox>, object : GetStatusCallback {
override fun onSuccess(data: InvoicesDataResponse?) {
Log.d(TAG, "onSuccess is fired. Result data = $data")
}
override fun onError(throwable: Throwable?, errorMessage: String?) {
Log.d(TAG, "onError is fired. ErrorMessage = $errorMessage")
}
})
Puede hacer el seguimiento del estado del pedido usando el método AuthViaSocialNetwork
del SDK. Transmita los siguientes parámetros al método:
AccessToken
: el token de pago, el cual se recibió al adquirir el artículo.OrderId
: el ID del pedido, el cual se recibió al adquirir el artículo.SuccessCallback
: devolución de llamada de pago realizada correctamente.ErrorCallback
: devolución de llamada de error de la solicitud.bIsUserInvolvedToPayment
: si el usuario participa en el proceso de pago. Transmitatrue
para la compra con moneda real, yfalse
para la compra de artículos gratuitos y la compra con moneda virtual.
El mecanismo de seguimiento se explica en la documentación de SDK de nivel empresarial para Unreal Engine.
Para solicitar el estado y el contenido de un pedido, invoque el método CheckOrder
del SDK, transmitiéndole los siguientes parámetros:
AccessToken
: el token de pago, el cual se recibió al adquirir el artículo.OrderId
: el ID del pedido, el cual se recibió al adquirir el artículo.SuccessCallback
: la devolución de llamada para la comprobación satisfactoria del pedido. La respuesta contiene el estado del pedido.ErrorCallback
: devolución de llamada de error de la solicitud.
Para hacer un seguimiento del estado de los pedidos creados y validarlos, deberá configurar el procesamiento de webhooks en el lado del servidor de su aplicación.
Para que funcione plenamente una tienda en el juego, es necesario implementar el procesamiento de los principales webhooks:
Webhook | Tipo de notificación | Descripción |
---|---|---|
User validation (Validación del usuario) | user_validation | Se envían en distintas fases del proceso de pago para garantizar que el usuario esté registrado en el juego. |
Payment (Pago) | payment | Se envía cuando se paga un pedido y contiene los detalles de pago y los detalles de la transacción. |
Successful payment of the order (Pago del pedido realizado con éxito) | order_paid | Se envía cuando se ha procesado correctamente un webhook Payment y contiene información sobre los artículos comprados y el ID de la transacción. Utilice los datos del webhook para añadir artículos al usuario. |
Refund (Reembolso) | refund | Se envía cuando se cancela un pedido, y contiene los detalles de pago y los detalles de la transacción. |
Cancelación de pedidos | order_canceled | Se envía cuando se ha procesado correctamente un webhook de Refund y contiene información sobre los artículos comprados y el ID de la transacción cancelada. Utilice los datos del webhook para eliminar los artículos comprados. |
Para obtener la lista completa de webhooks e información general sobre cómo operar con ellos, consulte la documentación de webhooks.
Establecer el envío de webhooks
Para configurar webhooks en el lado de Xsolla:
- Abra su proyecto en Cuenta del editor.
- Haga clic en Project settings en el menú lateral y vaya a la sección Webhooks.
- En el campo Webhook URL, especifique la URL a la cual Xsolla enviará los webhooks.
- Haga clic en Enable webhooks.
Agregar un agente de escucha de webhooks
El agente de escucha de webhooks es un código de programa que permite recibir webhooks entrantes en una dirección URL especificada, generar una firma, y enviar una respuesta al servidor de webhooks de Xsolla.
Generación de firma
Cuando reciba un webhook, se debe garantizar la seguridad de la transmisión de datos. Para conseguirlo, se debe generar una firma a partir de los datos del webhook y verificar que coincide con la firma enviada en el encabezado de la solicitud HTTP.
Para generar una firma:
- Concatene el JSON del cuerpo de la solicitud y la clave secreta del proyecto.
- Aplique la función hash criptográfica SHA-1 a la cadena obtenida en el primer paso.
Enviar respuestas al webhook
Para confirmar la recepción del webhook, su servidor debe devolver:
- código HTTP
200
,201
o204
en el caso de una respuesta correcta. - Código HTTP
400
con descripción del problema si no se ha encontrado el usuario especificado o se ha transmitido una firma no válida.
Su controlador de webhook también puede devolver un código 5xx
en caso de problemas temporales en su servidor.
Si no se recibió una respuesta para los webhooks Successful payment of the order y Order cancellation o si se ha recibido una respuesta con un código 5xx
, los webhooks se reenvían con arreglo al siguiente esquema temporal:
- 2 intentos con un intervalo de 5 minutos
- 7 intentos con un intervalo de 15 minutos
- 10 intentos con un intervalo de 60 minutos
Se realizan un máximo de 20 intentos de envío de webhooks en un plazo de 12 horas desde el primer intento.
Si para el webhook Pago no se recibió una respuesta o si se recibió una respuesta con un código 5xx
, los webhooks también se reenvían con un intervalo mayor. Se realiza un máximo de 12 intentos en 12 horas.
Si no se recibió una respuesta para el webhook Validación del usuario o si se recibió una respuesta con un código 400
o 5xx
, el webhook Validación del usuario no se reenvía.
En este caso, se muestra un error al usuario y no se envían los webhooks Pago y Successful payment of the order.
¿Has encontrado una errata u otro error de texto? Selecciona el texto y pulsa Ctrl+Intro.