store: el concepto del cobro incluye también la IP

Tienda · BNet inna@inna.cl · Cuenta 15#1 · Innadin · IP 213.94.48.99 · Grito de la sirena (45327) x2

La IP ya se capturaba, pero solo se guardaba en home_stripelog.acore_ip. OJO:
meterla en el concepto SÍ se la manda a la pasarela, cosa que antes no pasaba
(ni Stripe ni SumUp la recibían). Va a propósito, para identificar al pagador en
su panel si hay fraude o una devolución a mano.

Se omite si no se conoce y también el 0.0.0.0 de relleno, que no aporta nada.

Verificado contra checkouts reales de Stripe (test): IPv4 con 1 ítem = 100
chars; IPv6 (39 chars) con 1 ítem = 124; IPv6 con 30 ítems = 172, recortando los
ítems. Todos por debajo del límite de 200.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-15 11:41:27 +00:00
parent 18fe2489d0
commit d3461976cf
2 changed files with 10 additions and 2 deletions
+1
View File
@@ -62,6 +62,7 @@ export async function POST(request: Request) {
bnetEmail: session.bnetEmail,
account: session.username,
character,
ip,
})
const metadata = { service: 'store', order_ref: ref }
+9 -2
View File
@@ -208,7 +208,12 @@ export interface PricedCart {
* su panel, así que es lo único que tendrán Stripe/SumUp para identificar un
* pago si hay que reclamar o devolver algo a mano.
*
* Formato: `Tienda · BNet <email> · Cuenta <cuenta> · <personaje> · Nombre (id) x2, …`
* Formato: `Tienda · BNet <email> · Cuenta <cuenta> · <personaje> · IP <ip> · Nombre (id) x2, …`
*
* OJO: la IP va aquí a propósito (identificar al pagador si hay fraude o una
* devolución a mano), pero esto se la manda a la pasarela; hasta ahora solo se
* guardaba en `home_stripelog.acore_ip`. Se omite si no se conoce, y también el
* 0.0.0.0 de relleno, que no dice nada.
*
* Se recorta a `MAX_CONCEPT`: Stripe y SumUp limitan el campo (~250-255), y un
* carrito de 100 líneas se pasaría de largo. Se recortan solo los ÍTEMS, nunca
@@ -219,13 +224,15 @@ const MAX_CONCEPT = 200
export function storeConcept(
cart: PricedCart,
opts: { bnetEmail?: string; account?: string; character: string },
opts: { bnetEmail?: string; account?: string; character: string; ip?: string },
): string {
const ip = opts.ip && opts.ip !== '0.0.0.0' ? opts.ip : ''
const head = [
'Tienda',
opts.bnetEmail ? `BNet ${opts.bnetEmail}` : null,
opts.account ? `Cuenta ${opts.account}` : null,
opts.character,
ip ? `IP ${ip}` : null,
]
.filter(Boolean)
.join(' · ')