Decodifica um payload completo do BR Code Pix, validando seu CRC16.
Parameters:
| Name |
Type |
Description |
Default |
payload
|
str
|
A string completa do "Copia e Cola" do Pix.
|
required
|
Returns:
| Type |
Description |
Dict[str, Any]
|
Dict[str, Any]: Um dicionário com os dados do Pix decodificados de forma estruturada.
|
Raises:
Source code in src\pixcore\decipher.py
| def decode(payload: str) -> Dict[str, Any]:
"""
Decodifica um payload completo do BR Code Pix, validando seu CRC16.
Args:
payload (str): A string completa do "Copia e Cola" do Pix.
Returns:
Dict[str, Any]: Um dicionário com os dados do Pix decodificados de forma estruturada.
Raises:
exceptions.CRCInvalidoError: Se o checksum CRC16 do payload for inválido.
exceptions.DecodificacaoPayloadError: Se o payload for malformado.
"""
if len(payload) < 8 or payload[-8:-4] != f"{const.ID_CRC16}04":
raise exceptions.DecodificacaoPayloadError("Formato do campo CRC16 inválido ou ausente.")
payload_to_check = payload[:-8]
received_crc = payload[-4:]
expected_crc = utils.calculate_crc16(payload_to_check + f"{const.ID_CRC16}04")
if received_crc.upper() != expected_crc.upper():
raise exceptions.CRCInvalidoError(esperado=expected_crc, recebido=received_crc)
data_payload = payload_to_check
decoded_data: Dict[str, Any] = {}
for id_field, _, value in utils.parse_tlv(data_payload):
match id_field:
case const.ID_PAYLOAD_FORMAT_INDICATOR:
decoded_data['payload_format_indicator'] = value
case const.ID_POINT_OF_INITIATION_METHOD:
decoded_data['point_of_initiation_method'] = value
case const.ID_MERCHANT_CATEGORY_CODE:
decoded_data['merchant_category_code'] = value
case const.ID_TRANSACTION_CURRENCY:
decoded_data['transaction_currency'] = value
case const.ID_TRANSACTION_AMOUNT:
decoded_data['transaction_amount'] = float(value)
case const.ID_COUNTRY_CODE:
decoded_data['country_code'] = value
case const.ID_MERCHANT_NAME:
decoded_data['merchant_name'] = value
case const.ID_MERCHANT_CITY:
decoded_data['merchant_city'] = value
case const.ID_POSTAL_CODE:
decoded_data['postal_code'] = value
case const.ID_MERCHANT_ACCOUNT_INFORMATION:
decoded_data.update(_parse_merchant_account_info(value))
case const.ID_ADDITIONAL_DATA_FIELD_TEMPLATE:
decoded_data.update(_parse_additional_data_field(value))
case const.ID_MERCHANT_INFO_LANGUAGE_TEMPLATE:
decoded_data.update(_parse_language_template(value))
return decoded_data
|