Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions docs/src/content/docs/es/guides/accept-otp-online-purchase.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -136,12 +136,12 @@ Esta llamada obtiene un token de acceso que permite a la aplicación cliente sol
access: [
{
type: 'incoming-payment',
actions: ['create'],
},
],
},
},
);
actions: ['create']
}
]
}
}
)
```
</TabItem>
<TabItem label='Rust' icon='seti:rust'>
Expand Down Expand Up @@ -228,7 +228,7 @@ Recuerde que el monto total de la compra del cliente es de MXN 1400.
<Tabs syncKey="lang">
<TabItem label='TypeScript/JavaScript' icon='seti:javascript'>
```ts wrap
const retailerIncomingPayment = await.client.incomingPayment.create(
const retailerIncomingPayment = await client.incomingPayment.create(
{
url: retailerWalletAddress.resourceServer,
accessToken: retailerIncomingPaymentGrant.access_token.value
Expand All @@ -239,8 +239,8 @@ Recuerde que el monto total de la compra del cliente es de MXN 1400.
value: '140000',
assetCode: 'MXN',
assetScale: 2
},
},
}
}
)
```
</TabItem>
Expand Down Expand Up @@ -546,7 +546,7 @@ Los pagos salientes requieren una concesión de autorización interactiva. Este
debitAmount: {
assetCode: 'MXN',
assetScale: 2,
value: '140000',
value: '140000'
}
}
}
Expand Down Expand Up @@ -864,3 +864,7 @@ El siguiente es un ejemplo de respuesta proveniente del proveedor de billetera d
}
```
</details>

:::note[Expiración del token de acceso]
Si el token de acceso de una concesión ha expirado, llame a la <Badge text="POST" variant="success" /> [Rotate Access Token API](/apis/auth-server/operations/post-token/), luego utilice el nuevo token en la solicitud correspondiente.
:::
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ if err != nil {
</TabItem>
</Tabs>
<details>
<summary>Respuestas de ejemplo</summary>
<summary>Ejemplo de respuesta</summary>
El siguiente ejemplo muestra una respuesta del proveedor de billetera del remitente.
```json wrap
{
Expand Down Expand Up @@ -154,19 +154,19 @@ Esta llamada obtiene un token de acceso que permite a su aplicación solicitar l
access: [
{
type: "incoming-payment",
actions: ["create"],
},
],
},
},
);
actions: ["create"]
}
]
}
}
)
````
</TabItem>
<TabItem label='Rust' icon='seti:rust'>
```rust wrap
use open_payments::types::{AccessTokenRequest, AccessItem, IncomingPaymentAction, GrantRequest};
let incoming_access = AccessTokenRequest {
access: vec![AccessItem::IncomingPayment { actions: vec![IncomingPaymentAction::Create, IncomingPaymentAction::Complete], identifier: None }],
access: vec![AccessItem::IncomingPayment { actions: vec![IncomingPaymentAction::Create, IncomingPaymentAction::Complete], identifier: None }]
};
let incoming_grant_request = GrantRequest::new(incoming_access, None);
let recipient_incoming_payment_grant = client
Expand Down Expand Up @@ -247,7 +247,7 @@ Esta llamada solicita la creación de un recurso de pago entrante en la cuenta d
},
{
walletAddress: recipientWalletAddress.id
},
}
)
```
</TabItem>
Expand Down Expand Up @@ -549,7 +549,7 @@ Los pagos salientes requieren una concesión de autorización interactiva. Este
debitAmount: {
assetCode: 'USD',
assetScale: 2,
value: '10000',
value: '10000'
}
}
}
Expand Down Expand Up @@ -873,3 +873,7 @@ El siguiente ejemplo muestra una respuesta cuando se crea un recurso de pago sal
```

</details>

:::note[Expiración del token de acceso]
Si el token de acceso de una concesión ha expirado, llame a la <Badge text="POST" variant="success" /> [Rotate Access Token API](/apis/auth-server/operations/post-token/), luego utilice el nuevo token en la solicitud correspondiente.
:::
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ Llame a la <Badge text="GET" variant="note" /> [Get Wallet Address API](/apis/wa
</Tabs>

<details>
<summary>Respuestas de ejemplo</summary>
<summary>Ejemplo de respuesta</summary>
El siguiente ejemplo muestra una respuesta del proveedor de billetera del remitente.

```json wrap
Expand Down Expand Up @@ -159,10 +159,10 @@ Esta llamada obtiene un token de acceso que permite a su aplicación solicitar l
{
type: 'incoming-payment',
actions: ['create']
},
],
},
},
}
]
}
}
);
```
</TabItem>
Expand Down Expand Up @@ -251,8 +251,8 @@ Esta llamada solicita la creación de un recurso de pago entrante en la cuenta d
accessToken: recipientIncomingPaymentGrant.access_token.value
},
{
walletAddress: recipientWalletAddress.id,
},
walletAddress: recipientWalletAddress.id
}
)
```
</TabItem>
Expand Down Expand Up @@ -464,14 +464,14 @@ method: QuoteMethod::Ilp,
wallet_address: Some(sender_wallet_address.id.clone()),
receiver: Some(recipient_incoming_payment.id.clone()),
debit_amount: None,
receive_amount: Some(Amount { value: "500000".into(), asset_code: "MXN".into(), asset_scale: 2 }),
receive_amount: Some(Amount { value: "500000".into(), asset_code: "MXN".into(), asset_scale: 2 })
};
let sender_quote = client
.quotes()
.create(
&sender_wallet_address.resource_server,
&quote_request,
Some(&sender_quote_grant.access_token.value),
Some(&sender_quote_grant.access_token.value)
)
.await?;

Expand All @@ -492,9 +492,9 @@ Some(&sender_quote_grant.access_token.value),
ReceiveAmount: rs.Amount{
Value: "500000",
AssetCode: "MXN",
AssetScale: 2,
},
},
AssetScale: 2
}
}
})
if err != nil {
log.Fatalf("Error creating quote: %v\n", err)
Expand Down Expand Up @@ -862,7 +862,7 @@ if err != nil {
</TabItem>
</Tabs>

Si la solicitud falla porque la cotización expiró, [solicite una nueva](#5-solicitar-la-creación-de-un-recurso-de-cotización) e intente otra vez. Si falla porque el token de acceso de la concesión de autorización ha expirado, llame a <Badge text="POST" variant="success" /> [Rotate Access Token API](/apis/auth-server/operations/post-token/) para obtener un nuevo token de acceso y, luego, vuelva a probar la solicitud con el nuevo token.
Si la solicitud falla porque la cotización expiró, [solicite una nueva](#5-solicitar-la-creación-de-un-recurso-de-cotización) e intente otra vez.

<details>
<summary>Ejemplo de respuesta</summary>
Expand Down Expand Up @@ -891,4 +891,7 @@ El siguiente ejemplo muestra una respuesta del proveedor de billetera del remite
}
```
</details>
````

:::note[Expiración del token de acceso]
Si el token de acceso de una concesión ha expirado, llame a la <Badge text="POST" variant="success" /> [Rotate Access Token API](/apis/auth-server/operations/post-token/), luego utilice el nuevo token en la solicitud correspondiente.
:::
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,19 @@ Supongamos que su usuario guardó su dirección de billetera en el perfil de su
</TabItem>
</Tabs>

<details>
<summary>Ejemplo de respuesta</summary>
```json wrap
{
"id": "https://cloudninebank.example.com/user",
"assetCode": "CAD",
"assetScale": 2,
"authServer": "https://auth.cloudninebank.example.com/",
"resourceServer": "https://cloudninebank.example.com/op"
}
```
</details>

### 2. Solicitar una concesión de autorización interactiva para un pago saliente

Utilice la información del servidor de autorización recibida en el paso anterior para llamar a la [Grant Request API](/es/apis/auth-server/operations/post-request). El propósito de esta llamada consiste en obtener un token que permita que el cliente solicite la creación de recursos de pago saliente en la cuenta de la billetera de su usuario.
Expand All @@ -89,7 +102,7 @@ El usuario indica que desea realizar pagos de hasta CAD 100 por mes durante tres
```ts
const grant = await client.grant.request(
{
url: userWalletAddress.authServer,
url: userWalletAddress.authServer
},
{
access_token: {
Expand All @@ -99,26 +112,26 @@ El usuario indica que desea realizar pagos de hasta CAD 100 por mes durante tres
type: 'outgoing-payment',
actions: ['read', 'create'],
limits: {
interval: 'R3/2025-05-20T13:00:00Z/P1M'
interval: 'R3/2025-05-20T13:00:00Z/P1M',
debitAmount: {
assetCode: 'CAD',
assetScale: 2,
value: '10000',
},
},
},
],
value: '10000'
}
}
}
]
},
client: userWalletAddress.id,
interact: {
start: ['redirect'],
finish: {
method: 'redirect',
uri: 'https://cloudninebank.example.com/finish/T8jw5Xy',
nonce: NONCE,
},
},
},
uri: 'https://paymentplatform.example/finish/{...}', // where to redirect the user to after they've completed the interaction
nonce: NONCE
}
}
}
);
```
</TabItem>
Expand Down Expand Up @@ -199,6 +212,25 @@ if err != nil {
</TabItem>
</Tabs>

<details>
<summary>Ejemplo de respuesta</summary>
```json wrap
{
"interact": {
"redirect": "https://auth.cloudninebank.example.com/{...}", // uri to redirect the user to, to begin interaction
"finish": "..." // unique key to secure the callback
},
"continue": {
"access_token": {
"value": "..." // access token for continuing the outgoing payment grant request
},
"uri": "https://auth.cloudninebank.example.com/continue/{...}", // uri for continuing the outgoing payment grant request
"wait": 30
}
}
```
</details>

#### Acerca del intervalo

El intervalo que se emplea en esta guía es `R3/2025-05-20T13:00:00Z/P1M`. Recuerde que el usuario desea enviar pagos de hasta CAD 100 por mes durante tres meses. El intervalo se desglosa del siguiente modo:
Expand Down Expand Up @@ -235,14 +267,14 @@ Agregue la `interact_ref` devuelta en los parámetros de consulta del URI de red
<Tabs syncKey='lang'>
<TabItem label='TypeScript/JavaScript' icon='seti:javascript'>
```ts wrap
const grant = await client.grant.continue(
const userOutgoingPaymentGrant = await client.grant.continue(
{
accessToken: CONTINUE_ACCESS_TOKEN,
url: CONTINUE_URI,
accessToken: pendingUserOutgoingPaymentGrant.continue.access_token.value,
url: pendingUserOutgoingPaymentGrant.continue.uri
},
{
interact_ref: INTERACT_REF,
},
interact_ref: interactRef
}
);
```
</TabItem>
Expand Down Expand Up @@ -282,3 +314,32 @@ Agregue la `interact_ref` devuelta en los parámetros de consulta del URI de red
</Tabs>

Una respuesta exitosa proporciona a su aplicación un token de acceso. Ahora su aplicación puede emitir solicitudes de pago saliente hacia destinatarios futuros en función de la concesión. Cada solicitud debe hacer referencia al token de acceso.

<details>
<summary>Ejemplo de respuesta</summary>
```json wrap
{
"access_token": {
"value": "...", // final access token required before creating outgoing payments
"manage": "https://auth.cloudninebank.example.com/token/{...}", // management uri for access token
"access": [
{
"type": "outgoing-payment",
"actions": ["create", "read"],
"identifier": "https://cloudninebank.example.com/user"
}
]
},
"continue": {
"access_token": {
"value": "..." // access token for continuing the request
},
"uri": "https://auth.cloudninebank.example.com/continue/{...}" // continuation request uri
}
}
```
</details>

:::note[Expiración del token de acceso]
Si una solicitud de pago saliente falla porque el token de acceso de la concesión ha expirado, puede llamar a la <Badge text="POST" variant="success" /> [Rotate Access Token API](/apis/auth-server/operations/post-token/), luego utilice el nuevo token en la solicitud de pago saliente.
:::
Loading