SDK oficial de PHP 8.2+ para PlaceToPay Web Checkout.
Esta libreria te permite integrar pagos de forma simple: crear sesion, redirigir al comprador y confirmar el estado final de la transaccion desde tu aplicacion.
Terminología estándar del proyecto: ver ../docs/GLOSARIO.md.
Si vienes del SDK previo, revisa
MIGRATION.mdpara mapear metodos y modelos.
composer require placetopay/checkoutRequiere PHP 8.2+.
| Versión SDK | PHP | Estado | Parches de seguridad hasta |
|---|---|---|---|
1.x |
8.2, 8.3, 8.4 | Actual | Hasta el siguiente major |
0.x |
- | Pre-release | End-of-life |
Con este ejemplo puedes crear una sesion y obtener el processUrl para
enviar al comprador al checkout de PlaceToPay.
use PlaceToPay\Checkout\Checkout;
use PlaceToPay\Checkout\Country;
use PlaceToPay\Checkout\Environment;
use PlaceToPay\Checkout\Models\Common\Amount;
use PlaceToPay\Checkout\Models\Session\CreateSessionRequest;
use PlaceToPay\Checkout\Models\Session\Payment;
$checkout = Checkout::builder()
->login('YOUR_LOGIN')
->secretKey('YOUR_SECRET_KEY')
->environment(Environment::SANDBOX)
->country(Country::COLOMBIA)
->build();
$response = $checkout->createSession(
CreateSessionRequest::builder()
->ipAddress('127.0.0.1')
->userAgent('MyApp/1.0')
->returnUrl('https://example.com/return')
->payment(Payment::of('ORDER-0001', 'Demo purchase', new Amount('COP', 50000)))
->build()
);
echo $response->processUrl;
echo $response->requestId;Después del pago:
use PlaceToPay\Checkout\Models\Common\StatusCode;
$info = $checkout->querySession($response->requestId);
if ($info->status->status === StatusCode::APPROVED) {
// completar orden
}| Endpoint | Método | Notas |
|---|---|---|
POST /api/session |
createSession |
Soporta autopay, metadata, dispersion |
POST /api/session/{id} |
querySession |
|
POST /api/session/{id}/cancel |
cancelSession |
Nuevo vs SDK de referencia |
POST /api/collect |
collect |
Cobro con instrumento tokenizado |
POST /api/reverse |
reverse |
Por internalReference |
POST /api/instrument/invalidate |
invalidateToken |
Nuevo vs SDK de referencia |
| Verificación webhook SHA-256 | NotificationVerifier::verifySha256 |
Recomendado |
| Verificación webhook SHA-1 | NotificationVerifier::verifySha1Legacy |
Solo compatibilidad legacy |
Flujo de sesion (checkout web):
createSessionpara iniciar el checkout y obtenerrequestId+processUrl.querySessionpara confirmar estado despues del retorno del pagador.cancelSessionpara invalidar una sesion pendiente cuando aplica.
Flujo de tokenizacion y post-pago:
collectpara cobrar con instrumento tokenizado.reversepara reversar porinternalReference.invalidateTokenpara revocar el token.
- Soporte de
auth.additionalviaCheckoutConfig::builder()->authAdditional(...). - Soporte de
CollectRequest.providerpara override opcional de procesador. - Helpers de estado en
StatusyTransaction(isApproved,isRejected,isError,isSuccessful). - Helpers de sesion en
SessionInformation(lastTransaction,lastApprovedTransaction,lastAuthorization). - Compatibilidad con valores heterogeneos en
processorFields[].value. - Validacion local de documentos LatAm con
DocumentValidator.
- Checkout estandar en web con redireccion (
createSession+querySession). - Cobro con token guardado (
collect) para compras recurrentes. - Reversion de pagos (
reverse) y revocacion de token (invalidateToken).
- Ecuador: la funcionalidad
autopayno esta habilitada en WebCheckout para este pais. Si se envia encreateSession, puede ser rechazada por el gateway. - Ecuador: la recurrencia en pago unico no esta disponible actualmente.
- En respuestas de
querySession/collect,payment[].processorFields[].valuepuede llegar como string, numero, booleano u objeto JSON. - El SDK ya modela ese valor como
mixedpara soportar metadatos de procesador no-string.
CheckoutConfig::builder() / Checkout::builder():
| Metodo | Default | Uso |
|---|---|---|
login(string) |
requerido | Login de comercio |
secretKey(string) |
requerido | Secret de comercio |
environment(Environment) |
SANDBOX |
Sandbox/Producción |
country(?Country) |
null |
Defaults por pais |
baseUrl(?string) |
- | Override explícito (solo HTTPS) |
connectTimeout(int) |
10 |
Segundos |
readTimeout(int) |
30 |
Segundos |
retryMaxAttempts(int) |
3 |
Mínimo 1 |
retryInitialDelayMs(int) |
200 |
Backoff inicial |
retryMaxDelayMs(int) |
5000 |
Tope de backoff |
userAgentSuffix(?string) |
null |
Sufijo user-agent |
additionalHeaders(array) |
[] |
Headers extra |
authAdditional(?array) |
null |
Campo auth.additional |
logger(?LoggerInterface) |
null |
DEBUG con payload redactado |
httpClient(?ClientInterface) |
SDK-owned | Cliente inyectado |
Todas las excepciones extienden PlaceToPayException:
AuthenticationExceptionValidationExceptionNotFoundExceptionRateLimitExceptionNetworkExceptionServerException
use PlaceToPay\Checkout\Webhooks\NotificationPayload;
use PlaceToPay\Checkout\Webhooks\NotificationVerifier;
$payload = NotificationPayload::fromArray($request->all());
if (!NotificationVerifier::verifySha256($payload, $secretKey)) {
return response('Invalid signature', 403);
}Las notificaciones webhook de PlaceToPay están confirmadas sobre SHA-256.
$checkout->createSession($request, idempotencyKey: 'order-42-attempt-1');
$checkout->collect($collectRequest, idempotencyKey: 'collect-42-attempt-1');
$checkout->reverse('INT_REF_001', idempotencyKey: 'reverse-42-attempt-1');- Firma: SHA-256.
- Nonce: 16 bytes criptográficos via
random_bytes(). - TLS: HTTPS obligatorio.
- Logging: redacción automática de PAN, CVV,
tranKey,nonce, token, PIN, password ysecretKey. - Disclosure: ver SECURITY.md.
El directorio examples/portal/ contiene un portal liviano para validar flujos end-to-end. Ver examples/README.md.
php -S 127.0.0.1:8090 -t examples/portal examples/portal/router.php
# http://127.0.0.1:8090Ingresa login y secret_key desde el UI en la sección Connect antes de invocar acciones del API.
git clone https://github.com/placetopay/checkout-php.git
cd checkout-php
composer install
composer test
composer stan
composer cs:checkVer CONTRIBUTING.md.
MIT, ver LICENSE.