Histórico de mensagens sobre ssl em pix

EXIBINDO CONVERSAS RECENTES:

Texto: ssl
Canal: pix
Avatar discord do usuario tellyscastro

tellyscastro

Ver Respostas

Consegui... 🙌

na vdd.. o nginx estava passando a url , mas sem os parâmetros.

Assim foi..

location /webhook/(.) {
if ($ssl_client_verify != SUCCESS) {
return 403;
}
# proxy_pass /webhook/index.php;
proxy_pass https://localhost:443/webhook/$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Avatar discord do usuario emiliocalvet

emiliocalvet

Ver Respostas

System.setProperty("javax.net.ssl.keyStore", credentials.getCertificate());

O certificado que coloquei foi de forma global, pra ir em todas as requisições independente de qual seja. Não sei se era conflito ou coisa do tipo mas essa implementação que mandei parou de dar erro quando removi o SDK. Pelo menos até agr.

Avatar discord do usuario emiliocalvet

emiliocalvet

java
@Getter
public class Credentials {
private final String clientId;
private final String clientSecret;
private final String certificate;
private final boolean sandbox;
private final boolean debug;

public Credentials() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream credentialsFile = classLoader.getResourceAsStream("credentials.json");
assert credentialsFile != null;
JSONTokener tokenizer = new JSONTokener(credentialsFile);
JSONObject credentials = new JSONObject(tokenizer);
try {
credentialsFile.close();
} catch (IOException e) {
System.out.println("Impossible to close file credentials.json");
}

this.clientId = credentials.getString("client_id");
this.clientSecret = credentials.getString("client_secret");
this.certificate = credentials.getString("certificate");
this.sandbox = credentials.getBoolean("sandbox");
this.debug = credentials.getBoolean("debug");
}

public HashMap getOptionsMap() {
HashMap options = new HashMap<>();
options.put("client_id", this.getClientId());
options.put("client_secret", this.getClientSecret());
options.put("certificate", this.getCertificate());
options.put("sandbox", this.isSandbox());
return options;
}

public JSONObject getOptionsJson() {
return new JSONObject(this.getOptionsMap());
}
}

Avatar discord do usuario alex_333902

alex_333902

é possivel subir o webhook com um tunel ngrok qndo ainda não tenho como gerar as chaves com meu dominio (ainda não tenho dominio ) para validar ssl pelo certbot ?

Avatar discord do usuario leandro_24465

leandro_24465

Ver Respostas

esse meu código deu o seguinte erro "Erro durante o processamento: HTTPSConnectionPool(host='pix-h.api.efipay.com.br', port=443): Max retries exceeded with url: /oauth/token (Caused by SSLError(SSLError(524297, '[SSL] PEM lib (_ssl.c:3845)')))" alguem como resolver isso?

import json
from efipay import EfiPay

# Carrega as credenciais do arquivo JSON
with open('C:\\Users\\LANAS\\OneDrive\\Documents\\Nova pasta\\venv\\Scripts\\credentials.json') as file:
options = json.load(file)

# Dados da cobrança
body = {
"calendario": {
"expiracao": 3600 # Tempo para expirar em segundos
},
"devedor": {
"cpf": "12345678909", # CPF do pagador
"nome": "Nome do Cliente"
},
"valor": {
"original": "0.01" # Valor do pagamento
},
"chave": "46aadfb3-50d6-4fa4-ae00-e6b8813b0dbe", # Chave Pix da conta Efí do recebedor
"infoAdicionais": [
{
"nome": "Produto/Serviço",
"valor": "Descrição do produto/serviço"
}
]
}

try:
# Instancia a API com as credenciais carregadas
api = EfiPay(options)

# Cria a cobrança Pix imediata
pix = api.pix_create_immediate_charge(params={}, body=body)

if 'txid' in pix:
# Se a cobrança foi criada com sucesso, gera o QR Code
params = {
'id': pix['loc']['id']
}
qrcode = api.pix_generate_qr_code(params)

# Exibe os dados do Pix e do QR Code no console
print("Cobrança Pix criada com sucesso!")
print("TXID:", pix['txid'])
print("QR Code gerado:", qrcode['imagemQrcode'])
print("Código Pix (copia e cola):", qrcode['qrcode'])

else:
print("Erro ao criar a cobrança Pix:", pix)

except Exception as e:
# Trata qualquer outro erro de forma genérica
print(f"Erro durante o processamento: {str(e)}")


Avatar discord do usuario afviriato

afviriato

Ver Respostas

@guilherme_efi , exatamente com esse comando, não consegui. Mas, o problema da conversão realmente é pq o certificado não tem senha, então ajustei os parâmetros do keytool e funcionou. Consegui autenticar na api PIX. Vou deixar os passos aqui, caso mais alguém precise:

openssl pkcs12 -in -out certificado_temporario.pem -nodes
Enter Import Password:

openssl pkcs12 -export -out -in certificado_temporario.pem
Enter Export Password:
Verifying - Enter Export Password:

E, para converter o .p12 em .jks:

keytool -importkeystore -srckeystore .p12 -srcstoretype pkcs12 -destkeystore .jks -deststoretype jks

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Tente então primeiro converter para .pem inserindo uma senha, e depois faça a conversão para .jks

bash
openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -password pass:NovaSenha

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Entendi. Primeiro, tente usar o comando openssl para adicionar uma senha ao seu certificado .p12:

bash
openssl pkcs12 -in certificado.p12 -out certificado_com_senha.p12 -export -password pass:NovaSenha
Depois, tente fazer essa conversão para .jks

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 guilherme_efi

guilherme_efi

Ver Respostas

Bom dia, @tellyscastro. Aparentemente esta falha está relacionada ao certificado SSL no domínio que está tentando configurar.
Você utiliza um certificado auto assinado?