Histórico de mensagens sobre js em pix

EXIBINDO CONVERSAS RECENTES:

Texto: js
Canal: pix
Avatar discord do usuario samucca9675

samucca9675

Ver Respostas

Boa tarde, posso tentar.

Estou utilizando nodejs

A mesma configuração eu usava com minha conta PF

Troquei para PJ

Alterei o certificado.p12 e a chave pix.

Tbm troquei o arquivo de mtls, mas nao funciona tbm

Avatar discord do usuario lucianoolegario_57079

lucianoolegario_57079

Ver Respostas

def gerar_pix():
# Receber os dados como string JSON codificada na URL
pix_details_json = request.args.get('pix_details')

if not pix_details_json:
return jsonify({'error': 'Dados insuficientes para renderizar o QR Code'}), 400

try:
# Decodificar JSON da URL
pix_details = json.loads(unquote(pix_details_json))

# Gerar QR Code
pix_copia_e_cola = pix_details.get("pixCopiaECola")
if not pix_copia_e_cola:
return jsonify({'error': 'Copia e cola do Pix está ausente nos dados'}), 400

# Criar QR Code como imagem PIL
qr = qrcode.make(pix_copia_e_cola)

# Salvar QR Code em memória
buffer = BytesIO()
qr.save(buffer, format="PNG")
buffer.seek(0)

# Renderizar o template com os dados
return render_template("pix.html", pix=pix_details, qr_code_url="/qr_code_image?pix_details=" + unquote(pix_details_json))
except Exception as e:
print(f"Erro ao processar pix_details: {e}")
return jsonify({'error': f'Erro ao processar pix_details: {e}'}), 500


@routes_pix_bp.route('/qr_code_image')
def qr_code_image():
# Receber os dados do QR Code como string JSON codificada na URL
pix_details_json = request.args.get('pix_details')

if not pix_details_json:
return jsonify({'error': 'Dados insuficientes para gerar o QR Code'}), 400

try:
# Decodificar JSON da URL
pix_details = json.loads(unquote(pix_details_json))
pix_copia_e_cola = pix_details.get("pixCopiaECola")
if not pix_copia_e_cola:
return jsonify({'error': 'Copia e cola do Pix está ausente nos dados'}), 400

# Gerar QR Code
qr = qrcode.make(pix_copia_e_cola)

# Salvar QR Code em memória
buffer = BytesIO()
qr.save(buffer, format="PNG")
buffer.seek(0)

Avatar discord do usuario feijonts_

feijonts_

Ver Respostas

estou tendo um problema ao cadastrar uma webhook, está dando: A URL informada respondeu com o código HTTP 401

Copiei o código

js
app.post('/webhook', (request, response) => {
if (request.socket.authorized) {
response.status(200).end();
}
else {
response.status(401).end();
}
});

Quando printo request.socket.authorized ele retorna undefined

Avatar discord do usuario rogerio_itu2044

rogerio_itu2044

Ver Respostas

Mas ainda nao encontrei a tipagem para paginacao, por favor pode me mostrar ?
https://github.com/efipay/sdk-node-apis-efi/blob/master/src/methods/pix.js#L802

Até tentei alterar para :

pixSendList(params: {
inicio: string;
fim: string;
status: string;
devolucaoPresente: boolean;
paginacao: {
paginaAtual: string;
itensPorPagina: string;
}
}): Promise
Mas recebo o erro:
type: 'https://pix.bcb.gov.br/api/v2/error/PixEnviadoConsultaInvalida',
title: 'Consulta Inválida',
status: 400,
detail: 'Os parâmetros de consulta não respeitam o schema ou não fazem sentido semanticamente.',
violacoes: [
{
razao: 'não são permitidas propriedades adicionais',
propriedade: 'pixEnviado.query'
}
]

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Bom dia, @rogerio_itu2044! Tudo bem?
Gostaria de registrar que, ao deixar o x-skip-mtls-checking como true, o Efí continuará enviando o certificado TLS na requisição, mas seu servidor irá ignorá-lo.

Nesse caso, você não precisa criar uma nova rota, pois a notificação será sempre enviada para /webhook, e o hmac será um query param. O parâmetro ignorar pode realmente ser desconsiderado. Nesse cenrário é importante verificar se o HMAC recebido na notificação em sua aplicação, é o mesmo que foi cadastrado no webhook no Efí. Além disso, recomendamos realizar uma validação por IP, já que nossa API utiliza exclusivamente o IP 34.193.116.226. Essas práticas garantem que é realmente o Efí quem está enviando a notificação. Sem o mTLS configurado, não ocorre o "handshake" de segurança.

Segue um exemplo em Node.js:

js
app.post('/webhook', (req, res) => {
const expectedHmac = "xyz"; // Valor esperado do HMAC que você usar no cadastro do webhook (cadastre um diferente deste)
const authorizedIp = "34.193.116.226"; // IP utilizado pelo API do Efí Bank

const requestIp = req.ip;
const requestHmac = req.query.hmac;

// Validação do IP
if (requestIp !== authorizedIp) {
res.status(401).json({ error: "Solicitação de webhook não autorizado" });
return;
}

// Validação do HMAC
if (!requestHmac || requestHmac !== expectedHmac) {
res.status(401).json({ error: "Solicitação de webhook não autorizado" });
return;
}

// Processar o webhook conforme sua regra de negócio
});

Avatar discord do usuario rogerio_itu2044

rogerio_itu2044

Ver Respostas

Boa noite!
Já se foram 3 longos dias tentando configurar meu webhook com Skip-mTLS em NodeJs Typescript, usando o sdk-node-apis-efi, por favor poderiam me ajudar, estou recebendo o seguinte erro:

{
nome: 'webhook_invalido',
mensagem: 'A URL informada respondeu com o código HTTP 403'
}

Sei que existem vários pedidos de ajuda relacionados a esse caso, mas nenhum é relacionado ao webhook do tipo Skip-mTLS, que é meu caso, porque estou usando servidor compartilhado.
A principio quero ressaltar um erro nos exemplos do github:
credentials.js
module.exports = {
// PRODUÇÃO = false
// HOMOLOGAÇÃO = true
sandbox: false,
client_id: 'seu_client_id',
client_secret: 'seu_client_secret',
certificate: 'caminho/ate/seu/certificado.p12',
}
sendo que no SDK mostra diferente:
{
sandbox: boolean;
client_id: string;
client_secret: string;
partner_token?: string | undefined;
certificate?: string | undefined;
cert_base64?: boolean | undefined;
pix_cert?: string | undefined;
pemKey?: string | undefined;
}
E também tem um erro no exemplo no git para configuração do webhook, de onde venho esse tal de options['validateMtls'], sendo que ele não existe nas credenciais do SDK:
const EfiPay = require('sdk-node-apis-efi')
let options = require('../../credentials')

options['validateMtls'] = false

let body = {
webhookUrl: 'https://exemplo-pix/webhook',
}

let params = {
chave: 'SUACHAVEPIX',
}

const efipay = new EfiPay(options)

efipay.pixConfigWebhook(params, body)
.then((resposta) => {
console.log(resposta)
})
.catch((error) => {
console.log(error)
})
O arquivo anexo contém meu exemplo de configuração de webhook, mas gostaria muito que vocês fornecessem um exemplo atualizado em typescript.
Muito obrigado!

Avatar discord do usuario dilanln.

dilanln.

Ver Respostas

boa tarde pessoal, estou tentando realizar a adição de webhooks da api pix no nestjs, porém estou com dificuldades para testes locais, tem algum exemplo de implementação em nodejs ?

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Bom dia, @bras6379_26227! Tudo certo?

Não necessariamente precisa de biblioteca para gerar o QR Code Pix.
Quando você cria uma cobrança Pix, recebe um JSON com as informações. Nesse JSON, tem o campo loc.id.

Depois, é só chamar o endpoint GET /v2/loc/:id/qrcode passando o loc.id da cobrança. O retorno traz os parâmetros qrcode, imagemQrcode e linkVisualizacao.

Agora é só usar o valor do parâmetro imagemQrcode para exibir o QR Code no HTML, assim:

html

Avatar discord do usuario a_murilolima_44093

a_murilolima_44093

Ver Respostas


public async generateQrCode(loc: number): Promise {
const agent = this.getAgent();
const accessToken = await this.getAccessToken();
const endpoint = ${this.baseUrl}/v2/loc/${loc}/qrcode;

const config = {
method: 'GET' as Method,
url: endpoint,
headers: {
Authorization: Bearer ${accessToken},
'Content-Type': 'application/json',
},
httpsAgent: agent,
};

const response = await axios(config);
return response.data;
}

Avatar discord do usuario vinikjkkj

vinikjkkj

Ver Respostas

aparentemente era uma virgula kkkk, apos remover obtive esse erro:

{\"nome\":\"json_invalido\",\"mensagem\":\"Valores ou tipos de campo inválidos\",\"erros\":[{\"chave\":\"additionalProperties\",\"caminho\":\".body.calendario\",\"mensagem\":\"não são permitidas propriedades adicionais\"}]}

body enviado:

{
"calendario": {
"criacao": "%s",
"expiracao": %d
},
"valor": {
"original": "%d.00"
},
"chave": "%s",
"infoAdicionais": [
{
"nome": "Descrição",
"valor": "%s"
}
]
}

é algo relacionado ao conteudo do calendario?

Avatar discord do usuario gmandre

gmandre

def obter_imagem_qrcode(url, cert_file_path, key_file_path, token):
try:
# Cabeçalho da requisição com o token de autorização
headers = {
"Authorization": f"Bearer {token}"
}

# Realizar a requisição GET na URL do QR Code com os certificados e cabeçalhos
response = requests.get(url, cert=(cert_file_path, key_file_path), headers=headers)

# Verificar se a resposta é bem-sucedida
if response.status_code == 200:
resposta_json = response.json() # Interpretar a resposta como JSON
imagem_qrcode = resposta_json.get("imagemQrcode", None) # Extrair o parâmetro imagemQrcode

if imagem_qrcode:
return imagem_qrcode # Retornar o valor de imagemQrcode
else:
return {"erro": "Parâmetro 'imagemQrcode' não encontrado na resposta."}
else:
return {"erro": f"Erro na requisição: {response.status_code}", "detalhes": response.text}

except Exception as e:
return {"erro": f"Falha na requisição GET: {e}"}

Avatar discord do usuario gmandre

gmandre

def obter_imagem_qrcode(url, cert_file_path, key_file_path):
try:
# Realizar a requisição GET na URL do QR Code
response = requests.get(url, cert=(cert_file_path, key_file_path))

# Verificar se a resposta é bem-sucedida
if response.status_code == 200:
resposta_json = response.json() # Interpretar a resposta como JSON
imagem_qrcode = resposta_json.get("imagemQrcode", None) # Extrair o parâmetro imagemQrcode

if imagem_qrcode:
return imagem_qrcode # Retornar o valor de imagemQrcode
else:
return {"erro": "Parâmetro 'imagemQrcode' não encontrado na resposta."}
else:
return {"erro": f"Erro na requisição: {response.status_code}", "detalhes": response.text}

except Exception as e:
return {"erro": f"Falha na requisição GET: {e}"}

Avatar discord do usuario gmandre

gmandre

Ver Respostas

get em json ?

Avatar discord do usuario gmandre

gmandre

python
response = requests.post("https://api.ef.com.br/v1/pix", json=data, headers=headers, cert=(cert_file_path, key_file_path))

Avatar discord do usuario lucio_66351

lucio_66351

Ver Respostas

From HTTP Request
Error code

ECONNRESET

Full message

socket hang up
Request

{ "body": { "calendario": { "expiracao": 360000 }, "devedor": { "cpf": "12786307759", "nome": "Fulano de Tal" }, "valor": { "original": "0.10" }, "chave": "058cca34-605e-4643-8f81-818cef7ba758", "solicitacaoPagador": "Descrição da cobrança" }, "headers": { "authorization": "hidden", "accept": "application/json,text/html,application/xhtml+xml,application/xml,text/;q=0.9, image/;q=0.8, /;q=0.7" }, "method": "POST", "uri": "https://pix.api.efipay.com.br/v2/cob/", "gzip": true, "rejectUnauthorized": true, "followRedirect": true, "resolveWithFullResponse": true, "followAllRedirects": true, "timeout": 300000, "encoding": null, "json": false, "useStream": true }

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Bom dia, @diullio. Feliz natal! 🎁 🎄
Tudo bem com você?
Quando você cria uma cobrança Pix, recebe um JSON com os detalhes. Entre eles, está o campo loc.id.

Depois, é só chamar o endpoint GET /v2/loc/:id/qrcode, passando o loc.id da cobrança. O retorno traz os parâmetros qrcode, imagemQrcode e linkVisualizacao.

Agora é só usar o valor do parâmetro imagemQrcode para exibir o QR Code no HTML, assim:

html

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Bom dia, @kvtwetfps! Como vai?
Como o Rubens mencionou, você pode usar o endpoint https://dev.efipay.com.br/docs/api-pix/endpoints-exclusivos-efi#criarmodificar-configurações-da-conta">PUT /v2/gn/config para habilitar a configuração webhook.notificacao.pagador=true que permite receber no webhook o nome e o CPF mascarado do pagador, conforme exemplo abaixo:

json
// webhook de Pix recebido com dados do pagador CPF
{
"pix": [
{
"endToEndId": "E1803615022211340s08793XPJ",
"txid": "fc9a43k6ff384ryP5f41719",
"chave": "2c3c7441-b91e-4982-3c25-6105581e18ae",
"valor": "0.01",
"horario": "2020-12-21T13:40:34.000Z",
"infoPagador": "pagando o pix",
"gnExtras": {
"pagador": {
"nome": "GORBADOCK OLDBUCK",
"cpf": ".123.456-",
"codigoBanco":"00416968"
}
}
}
]
}

Avatar discord do usuario rubenskuhl

rubenskuhl

Ver Respostas

Tem uma SDK específica de TS e vc está usando a de NodeJS... apesar da grande similaridade, pode ser o problema.
https://dev.efipay.com.br/docs/sdk/type-script

Avatar discord do usuario scriptumg

scriptumg

Estou usando discord.js e estou criando o codigo em .ts

Avatar discord do usuario sml3541

sml3541

Ver Respostas

js
const result = await efiPay.pixCreateImmediateCharge({}, {
calendario: {
expiracao: 3600
},
devedor: {
cpf,
nome: name
},
valor: {
original: totalCost.toFixed(2)
},
chave: process.env.PIX_KEY
});