1
0

Compare commits

..

No commits in common. "4da1d1233c3963499cbc6982ff6e81db5f73650a" and "a59717a8db2f8f28254b09e0bb6fb1fea69e8227" have entirely different histories.

2 changed files with 23 additions and 51 deletions

View File

@ -71,29 +71,8 @@ curl http://localhost:5000/release/123
- `pixTimestamp`
- `signature`: assinatura ethereum compatível
# mTLS
##### `key.pem`: chave privada e certificado da empresa
Descriptografar o e-CNPJ em formato PKCS#12 e converter em formato PEM (☢️ contém chave privada):
```
umask 077; # tirar permissão de leitura global
openssl pkcs12 -in <arquivo>.p12 -legacy -clcerts -noenc -out key.pem
```
##### `bb.pem`: certificado do BB
Descarregar o certificado de https://apoio.developers.bb.com.br/referency/post/646799afa2e2b90012c5ede8 e converter em formato PEM:
```
openssl x509 -in raiz_v3.der -inform DER -outform PEM -out bb.pem
```
### Envio de certificado
Para criar a cadeia de certificados pra enviar pro BB usar:
```
openssl pkcs12 -in <arquivo>.p12 -nokeys -legacy -out cert.pem
```
enviar o `cert.pem` no formulário do portal developers como "cadeia completa".
# Observações
- O ambiente de produção requer autenticação mTLS
- Para ambiente de desenvolvimento use `DEBUG=true`
- Em produção, o servidor usa Waitress como servidor WSGI
- Para mais informações, consulte a documentação oficial: https://developers.bb.com.br/

View File

@ -20,13 +20,25 @@ app = Flask(__name__)
CORS(app)
api = Api(app)
class BBPay(Resource):
class BBPay(Resource):
def __init__(self):
super().__init__()
self.setup_oauth()
def setup_oauth(self):
client = BackendApplicationClient(client_id=getenv("CLIENT_ID"))
self.oauth = OAuth2Session(client=client)
self.cert = 'key.pem'
self.verify_ssl = 'bb.pem'
scope = ['checkout.solicitacoes-requisicao',
'checkout.participantes-requisicao',
'checkout.solicitacoes-info',
'checkout.participantes-info']
self.oauth.fetch_token(
token_url='https://oauth.hm.bb.com.br/oauth/token',
client_id=getenv("CLIENT_ID"),
client_secret=getenv("CLIENT_SECRET"), scope=scope,
cert='cert.pem')
# Url de homologação com autenticação mTLS.
self.baseUrl = "https://api-bbpay.hm.bb.com.br/checkout/v2"
@ -37,25 +49,13 @@ class BBPay(Resource):
# Url de produção com autenticação mTLS.
#self.baseUrl = "https://api-bbpay.bb.com.br/checkout/v2"
self.verify_ssl = False
self.params = {
'numeroConvenio': 701,
'gw-dev-app-key': getenv("DEV_APP_KEY")
}
self.scope = ['checkout.solicitacoes-requisicao',
'checkout.participantes-requisicao',
'checkout.solicitacoes-info',
'checkout.participantes-info']
self.oauth.fetch_token(
token_url='https://oauth.hm.bb.com.br/oauth/token',
client_id=getenv("CLIENT_ID"),
client_secret=getenv("CLIENT_SECRET"), scope=self.scope)
def __init__(self):
super().__init__()
self.setup_oauth()
class Register(BBPay):
def post(self):
data = request.get_json()
@ -74,7 +74,7 @@ class Register(BBPay):
params=self.params,
json=body,
verify=self.verify_ssl,
cert=self.cert)
cert='cert.pem')
return response.json()
class Request(BBPay):
@ -104,8 +104,7 @@ class Request(BBPay):
self.baseUrl+"/solicitacoes",
params=self.params,
json=body,
verify=self.verify_ssl,
cert=self.cert)
verify=self.verify_ssl)
return response.json()
class Release(BBPay):
@ -113,13 +112,10 @@ class Release(BBPay):
response = self.oauth.get(
self.baseUrl+f"/solicitacoes/{numeroSolicitacao}",
params=self.params,
verify=self.verify_ssl,
cert=self.cert)
if response.status_code != 200:
return 'Upstream error', response.status_code
verify=self.verify_ssl)
data = response.json()
numeroParticipante = data['repasse']['recebedores'][0]['identificadorRecebedor']
pixTimestamp = encode_packed(['bytes32'],[b85decode(data['informacoesPix']['txId'])])
pixTimestamp = b85decode(data['informacoesPix']['txId'])
valorSolicitacao = to_wei(data['valorSolicitacao'], 'ether')
codigoEstadoSolicitacao = data['codigoEstadoSolicitacao']
if codigoEstadoSolicitacao != 1:
@ -127,10 +123,7 @@ class Release(BBPay):
response = self.oauth.get(
self.baseUrl+f"/participantes/{numeroParticipante}",
params=self.params,
verify=self.verify_ssl,
cert=self.cert)
if response.status_code != 200:
return 'Upstream error', response.status_code
verify=self.verify_ssl)
chainID = response.json()['nomeParticipante']
packed = encode_packed(['bytes32','uint80','bytes32'],
(f"{chainID}-{numeroParticipante}".encode(), int(valorSolicitacao), pixTimestamp) )