Histórico de mensagens sobre Secret id em pix

EXIBINDO CONVERSAS RECENTES:

Texto: Secret id
Canal: pix
Avatar discord do usuario logaaaa

logaaaa

Ver Respostas

Boa tarde, estou usando o código de exemplo em PHP para cobrança imediata do PIX...
Me atentei ao card que explica sobre a inserção do Client_id e Client_Secret, Sandbox e a pasta e a conversão do certificado, no entanto, quanto rodo esse exemplo nos seguintes cenários, tenho retornos inesperados:

Produção: Ocorreu um erro - Mensagem: 401invalid_client - Credenciais inválidas ou inativas
Homologação : Gerou o QRCode e Chave Copia e Cola normalmente.

Servidor: Apache
Linguagem: PHP
BD: MySQL
SDK Composer Instalado
imagem enviada na mensagem pelo usuario logaaaa

Avatar discord do usuario aleque0169

aleque0169

Ver Respostas

Boa noite, pessoal.

Ao realizar a seguinte requisição: https://pix-h.api.efipay.com.br/oauth/token, utilizando meu Client_Id, Client_Secret e o certificado p12 de homologação. Nesse ambiente, consigo obter o token corretamente.

No entanto, ao tentar realizar a requisição utilizando o domínio https://pix.api.efipay.com.br/oauth/token com o Client_Id, Client_Secret e certificado p12 de produção, recebo a seguinte resposta de erro: "socket hang up".

O que devo fazer para resolver esse problema?
imagem enviada na mensagem pelo usuario aleque0169

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Bom dia, @vinicio254! Tudo bem?

Você pode usar o exemplo abaixo para registrar o webhook. Sobre a configuração do mTLS, você pode conferir este vídeo que ensina a configuração em servidor Apache.

php

$homolog = true; // false para produção

$config = [
"certificado" => realpath(__DIR__ . "/certificado.pem"), // certificado em .pem de produção ou homologação
"client_id" => "Client_Id",
"client_secret" => "Client_Secret"
];

$chavePix = "suachavepix";

$webhookUrl = "https://seudominio.com.br/webhook/hash=hashdeseguranca&ignorar="

$autorizacao = base64_encode($config["client_id"] . ":" . $config["client_secret"]);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $homolog ? "https://pix-h.api.efipay.com.br/oauth/token" : "https://pix.api.efipay.com.br/oauth/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 8,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => '{"grant_type": "client_credentials"}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Basic $autorizacao",
"Content-Type: application/json"
),
));
var_dump(curl_exec($curl));
$returnAuth = json_decode(curl_exec($curl), true);
$access_token = $returnAuth['access_token'];
curl_close($curl);


//Criação da cobrança
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => $homolog ? "https://pix-h.api.efipay.com.br/v2/webhook/$chavePix" : "https://pix.api.efipay.com.br/v2/webhook/$chavePix"
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => '{
"webhookUrl": $webhookUrl
}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Bearer $access_token",
"x-skip-mtls-checking: true",
"Content-Type: application/json"
),
));
$responsePix = json_decode(curl_exec($curl), true);
curl_close($curl);

echo '
' . json_encode($responsePix, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '
';

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Bom dia, @roxzin! Como vai?
Aqui está um código que funciona:

php

$homolog = true; // false para produção

$config = [
"certificado" => realpath(__DIR__ . "/certificado.pem"), // certificado em .pem de produção ou homologação
"client_id" => "Client_Id",
"client_secret" => "Client_Secret"
];


$autorizacao = base64_encode($config["client_id"] . ":" . $config["client_secret"]);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $homolog ? "https://pix-h.api.efipay.com.br/oauth/token" : "https://pix.api.efipay.com.br/oauth/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 8,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => '{"grant_type": "client_credentials"}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Basic $autorizacao",
"Content-Type: application/json"
),
));
var_dump(curl_exec($curl));
$returnAuth = json_decode(curl_exec($curl), true);
$access_token = $returnAuth['access_token'];
curl_close($curl);


//Criação da cobrança
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => $homolog ? 'https://pix-h.api.efipay.com.br/v2/cob/' : 'https://pix.api.efipay.com.br/v2/cob/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{
"calendario": {
"expiracao": 3600
},
"devedor": {
"cpf": "12345678909",
"nome": "Francisco da Silva"
},
"valor": {
"original": "0.45"
},
"chave": "[email protected]"
}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Bearer $access_token",
"Content-Type: application/json"
),
));
$responsePix = json_decode(curl_exec($curl), true);
curl_close($curl);

echo '
' . json_encode($responsePix, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '
';

if ($responsePix['loc']['id']) {
$idlocationPix = $responsePix['loc']['id'];

// Obtêm o Pix Copia e Cola e QR Code
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => $homolog ? 'https://pix-h.api.efipay.com.br/v2/loc/' . $idlocationPix . '/qrcode' : 'https://pix.api.efipay.com.br/v2/loc/' . $idlocationPix . '/qrcode',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Bearer $access_token",
),
));

$response = json_decode(curl_exec($curl), true);

curl_close($curl);


$PixCopiaCola = $response['qrcode'];
$imagemQrcode = $response['imagemQrcode'];


echo 'QR Code:';
echo '
' . json_encode($PixCopiaCola, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '
';

echo 'Imagem:
';
echo '';
}
Também temos nossa SDK de PHP (https://github.com/efipay/sdk-php-apis-efi), que usa o Guzzle.

Avatar discord do usuario errorzadaa

errorzadaa

Ver Respostas

da esse erro pra mim quando o clientId ou clientSecret são invalidos

Avatar discord do usuario rodrigo_90439

rodrigo_90439

Ver Respostas

$config = [
"certificado" => "./certificados/homologacao-certificado_cert.pem",
"client_id" => "???",
"client_secret" => "???"
];

$autorizacao = base64_encode($config["client_id"] . ":" . $config["client_secret"]);

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => 'https://pix-h.api.efipay.com.br/oauth/token',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"grant_type": "client_credentials"
}',
CURLOPT_SSLCERT => $config["certificado"],
CURLOPT_HTTPHEADER => array(
"Authorization: Basic $autorizacao",
"Content-Type: application/json"
),
));

$response = curl_exec($curl);

curl_close($curl);

if(curl_errno($curl)) {
echo 'Erro no cURL: ' . curl_error($curl);
} else {
echo $response;
}

Avatar discord do usuario rodrigo_90439

rodrigo_90439

Ver Respostas

Tudo bem Guilherme.
Eu gostaria de utilizar o CURL mesmo, não quero utilizar o SDK em minha aplicação, tem como me ajudar?
$config = [
"certificado" => "certificado.pem",
"client_id" => "Client_Id???",
"client_secret" => "Client_Secret_???"
];

$autorizacao = base64_encode($config["client_id"] . ":" . $config["client_secret"]);

$curl = curl_init();

curl_setopt_array($curl, array(
//CURLOPT_URL => "https://pix-h.api.efipay.com.br/oauth/token",
CURLOPT_URL => "https://pagarcontas.api.efipay.com.br/v1/oauth/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => '{"grant_type": "client_credentials"}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Basic $autorizacao",
"Content-Type: application/json"
),
));

$response = curl_exec($curl);

curl_close($curl);

echo "

";
echo $response;
echo "
";

Avatar discord do usuario felipenunes0714

felipenunes0714

Ver Respostas

$config = [
"certificado" => "./producao.pem",
"client_id" => "",
"client_secret" => ""
];


$autorizacao = base64_encode($config["client_id"] . ":" . $config["client_secret"]);

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => "https://pix-h.api.efipay.com.br/oauth/token", // Rota base, homologação ou produção
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => '{"grant_type": "client_credentials"}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Basic $autorizacao",
"Content-Type: application/json"
),
));

$response = curl_exec($curl);

curl_close($curl);

echo "

";
echo $response;
echo "
";
?>

eu estou chamando essa chamada simples da documentação, e ela me retorna a pagina em branco ao invés de retornar o token

Avatar discord do usuario _acb09

_acb09

Ver Respostas

O meu código está assim:

$config = [];
$config["certificado"] = config("services.efipay.certificate_path");
$config["client_id"] = config("services.efipay.client_id");
$config["client_secret"] = config("services.efipay.client_secret");

$headers = [];
$headers['Authorization'] = "Basic " . base64_encode($config["client_id"] . ":" . $config["client_secret"]);
$headers['Content-Type'] = 'application/json';

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => "https://pix-h.api.efipay.com.br/oauth/token", // Rota base, homologação ou produção
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 60,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => '{"grant_type": "client_credentials"}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => $headers
));

$response = curl_exec($curl);

if (curl_errno($curl)) {
dd('Error:' . curl_error($curl));
}

curl_close($curl);

dd($response);

Avatar discord do usuario _acb09

_acb09

Ver Respostas

Bom dia!
Obtive sucesso ao criar a API de boleto no sistema da empresa onde trabalho. Agora, preciso implementar via PIX.
Considerando que estou implementando para a empresa e já possuo Client_secret, Client_id e chave pix aleatória (gerada no painel da Efi). Em todos os cenários via PIX, eu preciso de OAuth para apenas gerar o QR Code para o cliente efetuar o pagamento, assim como via boleto (que não necessita de OAuth)?

Avatar discord do usuario marilia_05972

marilia_05972

Ver Respostas

Olá, boa noite.
Eu estou fazendo uma integração usando o sdk (gn-api-sdk-typescript": "^2.0.1") , estou tomando um erro de Forbidden na chamada ao pixCreateImmediateCharge([], body) quando tento chamar em ambiente de produção (ou creds de prod). A única mensagem de retorno é essa, "forbidden".
Porém, quando uso credenciais de homologação, funciona perfeitamente, e quando mudo para as de produção, tomo essa exceção. Como a mensagem não está clara, eu não consegui decifrar o que pode ser.
Parâmetros corretos, sandbox=true quando homol, false quando prod, client_secret, client_id,
certificate corretos, chave pix informada corretamente.
Meu único vacilo, foi que não fiz o download do certificado de produção no ato em que ele foi gerado, então eu excluí e gerei outro. Poderia ser esse o problema? Caso positivo, o que eu tenho que fazer agora?
Também testei com o "sdk-typescript-apis-efi": "^1.0.2" e ocorre o mesmo cenário.

Avatar discord do usuario celsoalexandre

celsoalexandre

Ver Respostas

bom dia. Eu implementei o webhook pix e por ser um servidor que vai ter outras rotas além dos webhooks da efi, eu optei por desabilitar o mtls e validar um query param "secreto" ao invés disso. Existem mais medidas de segurança recomendadas que posso implementar pra esse webhook?

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Olá, @cesaroficial. Bom dia!
Você precisa criar uma aplicação em sua conta para obter as credenciais Client_Id e Client_Secret, que serão inseridas nos campos Username e Password.
Veja aqui em nossa documentação como criar a aplicação em sua conta.

Avatar discord do usuario diogojunior.

diogojunior.

# encoding: utf-8

from efipay import EfiPay
import sys

# Configurações de credenciais
credentials = {
'client_id': '',
'client_secret': '',
'sandbox': False, # Altere para True se estiver usando o ambiente de sandbox
'certificate': r''
}

def obter_dados_usuario():
try:
chave_pix = input("Informe a chave PIX do destinatário: ")
valor = input("Informe o valor da transferência: ")

# Verificando se os valores informados são válidos
if not chave_pix:
raise ValueError("A chave PIX não pode ser vazia.")

# Substituir vírgula por ponto e converter para float
valor_float = float(valor.replace(',', '.'))

if valor_float <= 0:
raise ValueError("O valor deve ser um número positivo.")

return chave_pix, "{:.2f}".format(valor_float)
except ValueError as ve:
print(f"Erro de validação: {ve}")
sys.exit(1)

Avatar discord do usuario relance_

relance_

Ver Respostas

Olá, estou utilizando o sdk da efipay e estou com uma duvida ao implementar no meu sistema. estou desenvolvendo um script que no cenario atual ele consegue gerar o pix qrcode somente com a client_id, secret_id, certificado e chave pix, a minha duvida é no ambiente de produção tem que fazer algum lógica de autenticação para gerar o qrcode de pix?

Avatar discord do usuario kaykyramos

kaykyramos

import as EfiPay from 'sdk-node-apis-efi'

import { Injectable } from '@nestjs/common'

import 'dotenv/config'

@Injectable()
export class PixService {
private efiPay = new EfiPay({
sandbox: false,
client_id: process.env.EFIPAY_CLIENT_ID,
client_secret: process.env.EFIPAY_CLIENT_SECRET,
certificate: './certs/producao-453290-LinkZap-v2.p12',
})

constructor() {
//
}

public async getBalance() {
const { saldo } = await this.efiPay.getAccountBalance()
return Number(saldo)
}

public async payPix(pixCode: string, amount: number) {
const balance = await this.getBalance()
if (balance < amount) {
throw new Error('Saldo insuficiente')
}

try {
const response = await this.efiPay.pixSend(
{ idEnvio: '01' },
{
valor: amount,
pagador: {
chave: 'a4c3dcd3-0005-454e-957f-df416a63c4ed',
},
favorecido: {
chave: pixCode,
},
},
)
return response
} catch (error) {
console.log(error)
}
}
}

Avatar discord do usuario joaolucas_efi

joaolucas_efi

Ver Respostas

Tanto o certificado quanto o par Client ID e Client Secret são diferentes à depender do ambiente, o parâmetro sandbox nas credenciais diz à qual ambiente você vai tentar fazer requisição.
Com sandbox = true você fará requisição para homologação, portanto suas credenciais (Client ID, Client Secrect e certificado) devem ser de homologação.

Avatar discord do usuario walysonpatric

walysonpatric

Ver Respostas

Coloquei assim mas só funciona no localhost a confirmação de PIX (http://localhost:8000/cob/a7689c1ff5b64eeca8695e2e58c30007), no site da vercel da página não encontrada.

Já coloquei as variáveis no site e estou usando o certificado p12, o pem da erro até no localhost.

Teria que colocar algum comando no arquivo next.config.js ou vercel.json?

// Rota para consultar cobrança por txid
router.get('/cob/:txid', async (req, res) => {
const txid = req.params.txid;

try {
const reqGN = await GNRequest({
clientID: process.env.GN_CLIENT_ID,
clientSecret: process.env.GN_CLIENT_SECRET
});

// Consultar a cobrança usando o txid
const response = await reqGN.get(https://pix.api.efipay.com.br/v2/cob/${txid});

// Verificar se há um objeto PIX na resposta
if (response.status === 200 && response.data.pix) {

// Enviar o código de ativação junto com a resposta
return res.status(200).json({ message: 'PIX confirmado com sucesso.' });
} else {
// O PIX não foi pago ou não encontrado
return res.status(400).json({ error: 'PIX não encontrado ou não foi pago.' });
}
} catch (error) {
console.error('Erro ao consultar a cobrança:', error.message);
return res.status(500).json({ error: 'Erro ao consultar a cobrança.' });
}
});

Avatar discord do usuario calebportodev

calebportodev

Olá. Como usar as chaves CLIENT_ID e CLIENT_SECRET_ID e o certificado .p12 para gerar um pagamento em PIX?
imagem enviada na mensagem pelo usuario calebportodev

Avatar discord do usuario luizinhodavila.

luizinhodavila.

Ver Respostas

{{rota_base_pix}}/oauth/token estou tentando fazer Send na Homologação (clientid, clientsecret e certificado) traz Could not send request....em Produção "error": "invalid_client",
"error_description": "Invalid or inactive credentials"