curl --request POST \
--url https://api.qbank.cl/platform/pay/{token}/collect \
--header 'Content-Type: application/json' \
--data '
{
"country": "VE",
"currency": "VES",
"method": "c2p",
"payer_document": "V12345678",
"payer_phone": "04141234567",
"payer_bank": "0102",
"otp": "123456"
}
'import requests
url = "https://api.qbank.cl/platform/pay/{token}/collect"
payload = {
"country": "VE",
"currency": "VES",
"method": "c2p",
"payer_document": "V12345678",
"payer_phone": "04141234567",
"payer_bank": "0102",
"otp": "123456"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
country: 'VE',
currency: 'VES',
method: 'c2p',
payer_document: 'V12345678',
payer_phone: '04141234567',
payer_bank: '0102',
otp: '123456'
})
};
fetch('https://api.qbank.cl/platform/pay/{token}/collect', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qbank.cl/platform/pay/{token}/collect",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'country' => 'VE',
'currency' => 'VES',
'method' => 'c2p',
'payer_document' => 'V12345678',
'payer_phone' => '04141234567',
'payer_bank' => '0102',
'otp' => '123456'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qbank.cl/platform/pay/{token}/collect"
payload := strings.NewReader("{\n \"country\": \"VE\",\n \"currency\": \"VES\",\n \"method\": \"c2p\",\n \"payer_document\": \"V12345678\",\n \"payer_phone\": \"04141234567\",\n \"payer_bank\": \"0102\",\n \"otp\": \"123456\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qbank.cl/platform/pay/{token}/collect")
.header("Content-Type", "application/json")
.body("{\n \"country\": \"VE\",\n \"currency\": \"VES\",\n \"method\": \"c2p\",\n \"payer_document\": \"V12345678\",\n \"payer_phone\": \"04141234567\",\n \"payer_bank\": \"0102\",\n \"otp\": \"123456\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qbank.cl/platform/pay/{token}/collect")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"country\": \"VE\",\n \"currency\": \"VES\",\n \"method\": \"c2p\",\n \"payer_document\": \"V12345678\",\n \"payer_phone\": \"04141234567\",\n \"payer_bank\": \"0102\",\n \"otp\": \"123456\"\n}"
response = http.request(request)
puts response.read_bodyEjecutar un cobro pull con los datos del pagador (público)
Ejecuta el cargo pull de una opción collect materializada con los datos que el pagador escribió en la página del checkout — banco, documento, teléfono o cuenta, y el OTP (generado en la app bancaria del pagador, o solicitado vía POST /pay/{token}/collect/otp devolviendo su otp_reference). El monto SIEMPRE es el congelado en la materialización — el pagador nunca lo envía. La plataforma screenea al pagador antes de llamar al core/proveedor. Un hold PEP o de firewall responde 202 in_review sin cobrar; el approve solo libera la review y el cliente reintenta el mismo request con el mismo contexto de idempotencia. Un timeout o 5xx deja el payin pending para reconciliación por webhook y nunca se reenvía automáticamente. Un pagador solo documental se screenea como document_value/idNumber, separado de name. Un rechazo NO mata el link — el pagador puede corregir los datos o elegir otro método. Rate limit estricto por IP.
curl --request POST \
--url https://api.qbank.cl/platform/pay/{token}/collect \
--header 'Content-Type: application/json' \
--data '
{
"country": "VE",
"currency": "VES",
"method": "c2p",
"payer_document": "V12345678",
"payer_phone": "04141234567",
"payer_bank": "0102",
"otp": "123456"
}
'import requests
url = "https://api.qbank.cl/platform/pay/{token}/collect"
payload = {
"country": "VE",
"currency": "VES",
"method": "c2p",
"payer_document": "V12345678",
"payer_phone": "04141234567",
"payer_bank": "0102",
"otp": "123456"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
country: 'VE',
currency: 'VES',
method: 'c2p',
payer_document: 'V12345678',
payer_phone: '04141234567',
payer_bank: '0102',
otp: '123456'
})
};
fetch('https://api.qbank.cl/platform/pay/{token}/collect', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qbank.cl/platform/pay/{token}/collect",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'country' => 'VE',
'currency' => 'VES',
'method' => 'c2p',
'payer_document' => 'V12345678',
'payer_phone' => '04141234567',
'payer_bank' => '0102',
'otp' => '123456'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qbank.cl/platform/pay/{token}/collect"
payload := strings.NewReader("{\n \"country\": \"VE\",\n \"currency\": \"VES\",\n \"method\": \"c2p\",\n \"payer_document\": \"V12345678\",\n \"payer_phone\": \"04141234567\",\n \"payer_bank\": \"0102\",\n \"otp\": \"123456\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qbank.cl/platform/pay/{token}/collect")
.header("Content-Type", "application/json")
.body("{\n \"country\": \"VE\",\n \"currency\": \"VES\",\n \"method\": \"c2p\",\n \"payer_document\": \"V12345678\",\n \"payer_phone\": \"04141234567\",\n \"payer_bank\": \"0102\",\n \"otp\": \"123456\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qbank.cl/platform/pay/{token}/collect")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"country\": \"VE\",\n \"currency\": \"VES\",\n \"method\": \"c2p\",\n \"payer_document\": \"V12345678\",\n \"payer_phone\": \"04141234567\",\n \"payer_bank\": \"0102\",\n \"otp\": \"123456\"\n}"
response = http.request(request)
puts response.read_bodyParámetros de ruta
Token opaco del checkout embebido en el checkout_url.
Respuesta
Resultado del intento de cobro.