curl --request POST \
--url https://api.usevext.com/v1/cards \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer": {
"name": "Ana P Souza",
"email": "ana@exemplo.com.br",
"document": "11144477735",
"phone_ddd": "11",
"phone_number": "987654321"
},
"card": {
"token": "token_ORP978GFOUoQD58x",
"holder_name": "ANA P SOUZA",
"billing_address": {
"zip_code": "01310100",
"street": "Avenida Paulista",
"number": "1000",
"neighborhood": "Bela Vista",
"city": "São Paulo",
"state": "SP"
}
}
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.usevext.com/v1/cards",
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([
'customer' => [
'name' => 'Ana P Souza',
'email' => 'ana@exemplo.com.br',
'document' => '11144477735',
'phone_ddd' => '11',
'phone_number' => '987654321'
],
'card' => [
'token' => 'token_ORP978GFOUoQD58x',
'holder_name' => 'ANA P SOUZA',
'billing_address' => [
'zip_code' => '01310100',
'street' => 'Avenida Paulista',
'number' => '1000',
'neighborhood' => 'Bela Vista',
'city' => 'São Paulo',
'state' => 'SP'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer: {
name: 'Ana P Souza',
email: 'ana@exemplo.com.br',
document: '11144477735',
phone_ddd: '11',
phone_number: '987654321'
},
card: {
token: 'token_ORP978GFOUoQD58x',
holder_name: 'ANA P SOUZA',
billing_address: {
zip_code: '01310100',
street: 'Avenida Paulista',
number: '1000',
neighborhood: 'Bela Vista',
city: 'São Paulo',
state: 'SP'
}
}
})
};
fetch('https://api.usevext.com/v1/cards', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.usevext.com/v1/cards"
payload = {
"customer": {
"name": "Ana P Souza",
"email": "ana@exemplo.com.br",
"document": "11144477735",
"phone_ddd": "11",
"phone_number": "987654321"
},
"card": {
"token": "token_ORP978GFOUoQD58x",
"holder_name": "ANA P SOUZA",
"billing_address": {
"zip_code": "01310100",
"street": "Avenida Paulista",
"number": "1000",
"neighborhood": "Bela Vista",
"city": "São Paulo",
"state": "SP"
}
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"object": "card",
"id": "<string>",
"brand": "visa",
"last_four": "<string>",
"exp_month": 6,
"exp_year": 123,
"holder_name": "<string>",
"expired": true,
"created_at": "2023-11-07T05:31:56Z",
"last_used_at": "2023-11-07T05:31:56Z"
}Guardar cartão
Guarda um cartão no cofre sem cobrar nada, e devolve o pm_ das cobranças seguintes.
curl --request POST \
--url https://api.usevext.com/v1/cards \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer": {
"name": "Ana P Souza",
"email": "ana@exemplo.com.br",
"document": "11144477735",
"phone_ddd": "11",
"phone_number": "987654321"
},
"card": {
"token": "token_ORP978GFOUoQD58x",
"holder_name": "ANA P SOUZA",
"billing_address": {
"zip_code": "01310100",
"street": "Avenida Paulista",
"number": "1000",
"neighborhood": "Bela Vista",
"city": "São Paulo",
"state": "SP"
}
}
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.usevext.com/v1/cards",
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([
'customer' => [
'name' => 'Ana P Souza',
'email' => 'ana@exemplo.com.br',
'document' => '11144477735',
'phone_ddd' => '11',
'phone_number' => '987654321'
],
'card' => [
'token' => 'token_ORP978GFOUoQD58x',
'holder_name' => 'ANA P SOUZA',
'billing_address' => [
'zip_code' => '01310100',
'street' => 'Avenida Paulista',
'number' => '1000',
'neighborhood' => 'Bela Vista',
'city' => 'São Paulo',
'state' => 'SP'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer: {
name: 'Ana P Souza',
email: 'ana@exemplo.com.br',
document: '11144477735',
phone_ddd: '11',
phone_number: '987654321'
},
card: {
token: 'token_ORP978GFOUoQD58x',
holder_name: 'ANA P SOUZA',
billing_address: {
zip_code: '01310100',
street: 'Avenida Paulista',
number: '1000',
neighborhood: 'Bela Vista',
city: 'São Paulo',
state: 'SP'
}
}
})
};
fetch('https://api.usevext.com/v1/cards', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.usevext.com/v1/cards"
payload = {
"customer": {
"name": "Ana P Souza",
"email": "ana@exemplo.com.br",
"document": "11144477735",
"phone_ddd": "11",
"phone_number": "987654321"
},
"card": {
"token": "token_ORP978GFOUoQD58x",
"holder_name": "ANA P SOUZA",
"billing_address": {
"zip_code": "01310100",
"street": "Avenida Paulista",
"number": "1000",
"neighborhood": "Bela Vista",
"city": "São Paulo",
"state": "SP"
}
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"object": "card",
"id": "<string>",
"brand": "visa",
"last_four": "<string>",
"exp_month": 6,
"exp_year": 123,
"holder_name": "<string>",
"expired": true,
"created_at": "2023-11-07T05:31:56Z",
"last_used_at": "2023-11-07T05:31:56Z"
}save_card: true nela: é uma chamada a menos, e o
cartão entra no cofre com uma autorização real no histórico. Esta rota é para os casos em que
não há primeira venda ainda — assinatura com teste grátis, cobrança adiada, upsell combinado antes
de qualquer cobrança.token de uso único que o
vext.js criou no navegador — o mesmo token de uma cobrança. Ele
vale cerca de um minuto.
pm_, e não cria um segundo. Ver
Cofre de cartões.Authorizations
Chave secreta do vendedor, criada no painel em Desenvolvedores.
O valor em claro existe uma única vez, na criação. Guardamos só o hash SHA-256 - nem o suporte consegue recuperá-lo, o que é o ponto: um dump do nosso banco não permite cobrar em nome de ninguém.
A chave vai no servidor. Colocá-la no navegador do comprador a entrega a qualquer pessoa que abra a página.
Headers
Identificador único da SUA tentativa. Use o mesmo valor ao repetir a requisição depois de um erro de rede.
Opcional, mas recomendado em toda criação de cobrança e estorno. Sem ele, uma repetição cria uma segunda cobrança.
255Body
O corpo de POST /v1/cards. Mesmo vocabulário de POST /v1/charges
de propósito: quem já integra a cobrança no cartão não tem um
segundo formato para aprender.
O que não existe aqui: amount, items e installments - não há
venda -, e card.id - esta rota cria a referência do cofre, e
receber uma já existente seria pedir para guardar o que já está
guardado. Mandar qualquer um deles devolve 422.
Response
Cartão guardado. O mesmo plástico guardado de novo devolve o
mesmo pm_ - não cria um segundo.
Um cartão guardado. Todo campo está sempre presente.
O que NÃO está aqui, e não vai estar: as referências da Pagar.me que de fato cobram, e os seis primeiros dígitos. As primeiras são o equivalente ao cartão para quem as tem; o BIN somado aos quatro últimos é material de correlação que você não precisa.
"card"^pm_[0-9a-z]{26}$visa, mastercard, elo, hipercard, amex, diners, discover, aura, null 1 <= x <= 12Vencido é ESTADO, e não ausência: o cartão continua na lista para você entender por que a cobrança de um clique parou de funcionar para aquele comprador.