Be CMS · Docs
← Toda la documentación

API pública de Aportes

Recibe donaciones y pagos (únicos o recurrentes) desde tu propio sitio. Cada workspace se identifica por su pageId. El dinero se cobra de forma segura y va a la cuenta de pagos del workspace.

Hay dos formas de integrarlo:

  1. Widget embebible (recomendado) — un <script> que abre un modal con el formulario de pago (Stripe Payment Element), sin sacar al visitante de tu sitio.
  2. Enlace público — una página de donación alojada que puedes compartir por enlace.

1) Widget embebible

html
<!-- Botón generado por nosotros -->
<script src="https://cms.begraffic.com/embed/aporte.js"
  data-page="PAGE_ID" data-button="BUTTON_ID"></script>

El loader pide la config del botón y, al pulsarlo, abre un modal (iframe) o redirige al pago según data-mode.

Modos de uso

  • Botón generado: como arriba. Toma etiqueta/color/concepto/monto/recurrencia guardados en el botón.
  • Tu propio botón: añade data-render="false" y marca cualquier elemento con [data-becms-pay]. También puedes dispararlo desde tu JS con BeCMS.openPayment({ page, button, amount }).
  • Inline (sin botón guardado): fija data-amount, data-concept, data-type, data-recurring en el <script>.

Atributos data-* (en el <script> o en cada [data-becms-pay])

  • data-page (obligatorio) — id del workspace.
  • data-button — id de un botón guardado (color/concepto/modo/monto).
  • data-modemodal (por defecto) o redirect.
  • data-amount — monto fijo (si se omite y el botón es abierto/sugerido, el visitante lo elige).
  • data-recurringtrue | false | optional | required.
  • data-type, data-concept, data-color, data-render="false".
  • Precio elegido por el visitante: data-amount-from="#selector" lee el valor en vivo de otro input/radio/elemento (igual data-recurring-from, data-type-from).
  • Donante ya conocido (salta el paso de contacto): data-name, data-email, data-phone (teléfono en formato internacional, p. ej. +18095551234). Si van completos (nombre + correo o teléfono), el modal no pide el contacto y pasa directo al pago. Admiten variante en vivo data-name-from/data-email-from/data-phone-from y también BeCMS.openPayment({ name, email, phone }).

Ejemplos

Que el visitante escriba su monto:

html
<input type="number" id="monto" placeholder="Tu monto">
<button data-becms-pay data-amount-from="#monto">Donar</button>

Varios precios para elegir (toma el seleccionado):

html
<label><input type="radio" name="monto" value="10"> $10</label>
<label><input type="radio" name="monto" value="25"> $25</label>
<label><input type="radio" name="monto" value="50"> $50</label>
<button data-becms-pay data-amount-from="input[name=monto]:checked">Donar</button>

Monto y recurrencia mensual ya listos (el modal abre con todo puesto):

html
<button data-becms-pay data-amount="25" data-recurring="true">Donar $25/mes</button>

Si tu plataforma ya conoce al donante (salta el paso de contacto):

html
<button data-becms-pay data-amount="50"
  data-name="Juan Pérez" data-email="juan@correo.com">Aportar</button>

Desde tu propio JavaScript:

html
<script>
  BeCMS.openPayment({ page: 'PAGE_ID', amount: 50, name: 'Juan Pérez', email: 'juan@correo.com' })
</script>

El monto y la recurrencia personalizados solo aplican si el botón es inline (sin data-button) o si el botón guardado está en modo "monto abierto" / con recurrencia permitida. Un botón de monto fijo siempre cobra su monto; uno de pago único no se puede forzar a recurrente.

GET /api/aportes/button

Config pública de un botón (CORS abierto; la consume el loader). No expone nada secreto.

?page=PAGE_ID&id=BUTTON_ID

json
{ "label": "Aportar", "color": "#1E4876", "mode": "modal", "css": "",
  "amountMode": "open", "amount": 0, "concept": "Ofrenda", "type": "donacion",
  "recurring": true, "recurringRequired": false }

POST /api/aportes/embed-session

Crea el cobro y devuelve el client_secret para confirmarlo con el Payment Element (sin redirigir a Stripe).

Body: { pageId, buttonId?, amount, recurring?, concept?, type?, donorName, donorEmail?, donorPhone?, currency? }

  • Con buttonId, las reglas de monto/recurrencia/concepto las manda el botón (autoritativo en servidor).
  • Pide nombre y, al menos, correo o teléfono.

Respuesta:

json
{ "clientSecret": "pi_..._secret_...", "accountId": "acct_...", "test": false,
  "recurring": false, "currency": "usd" }
  • Confirma el clientSecret en el navegador con el Payment Element de Stripe (inicializa Stripe.js con la cuenta accountId). Tras confirmarlo, el pago queda registrado automáticamente; no necesitas más pasos.
  • Único → un cobro. Recurrente → suscripción mensual.

2) Enlace público — POST /api/aportes/checkout

Lo usa la página de donación alojada que compartes por enlace. Crea la sesión de cobro a partir del enlace (slug); el workspace se deriva del enlace y nunca se envía en la solicitud.

Body: { pageId, slug, donorName, donorEmail?, donorPhone?, amount?, recurring?, returnUrl? } → devuelve el client_secret (mismo formato que embed-session).