Posts under category Facebook WhatsApp Business API

I'm trying to generate the response for the WhatsApp flow using the WhatsApp business API with the following code

The decryption part is functioning correctly, but when I attempt to send the response, I'm receiving the error: "Could not decrypt the response received from the server."

I've referred to the documentation here, but I'm still struggling to find the correct approach for generating and validating the response.

Is there anyone who has experience with this API or can provide guidance on how to properly format and send the response? Any examples or links to relevant resources would be greatly appreciated.

def post(self, request, *args, **kwargs):         try:             dict_data = json.loads(request.body.decode('utf-8'))             encrypted_flow_data_b64 = dict_data['encrypted_flow_data']             encrypted_aes_key_b64 = dict_data['encrypted_aes_key']             initial_vector_b64 = dict_data['initial_vector']                          flipped_iv = self.flip_iv(initial_vector_b64.encode('utf-8'))                          encrypted_aes_key = b64decode(encrypted_aes_key_b64)             key_private = open('*******.pem', 'rb').read().decode('utf-8')             private_key = load_pem_private_key(key_private.encode('utf-8'), password="*************".encode('utf-8'))                          aes_key = private_key.decrypt(encrypted_aes_key, OAEP(mgf=MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None))             aes_key_b64 = b64encode(aes_key).decode('utf-8')                          flow_data  = b64decode(encrypted_flow_data_b64)             key = b64decode(aes_key_b64)             iv = b64decode(initial_vector_b64)                          encrypted_flow_data_body = flow_data[:-16]             encrypted_flow_data_tag = flow_data[-16:]             cipher = Cipher(algorithms.AES(key), modes.GCM(iv,encrypted_flow_data_tag))             decryptor = cipher.decryptor()             decrypted_data = decryptor.update(encrypted_flow_data_body) + decryptor.finalize()             flow_data_request_raw = decrypted_data.decode("utf-8")                          hello_world_text = "HELLO WORLD"                          response_data = {                 "version": "3.0",                 "screen": "MY_FIRST_SCREEN",                 "data": {                     "hello_world_text": hello_world_text                 }             }             response_json = json.dumps(response_data)                          # Obtendo a chave AES após descriptografar encrypted_aes_key             fb_aes_key = private_key.decrypt(encrypted_aes_key, OAEP(mgf=MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None))             # Usando a chave AES para criptografar a resposta             response_cipher = Cipher(algorithms.AES(fb_aes_key), modes.GCM(iv))             encryptor = response_cipher.encryptor()             encrypted_response = (                 encryptor.update(response_json.encode("utf-8")) +                 encryptor.finalize() +                 encryptor.tag             )             encrypted_response_b64 = b64encode(encrypted_response).decode("utf-8")                          # Construct the final response             final_response = {                 "encrypted_flow_data": encrypted_response_b64,                 "encrypted_aes_key": encrypted_aes_key_b64,                 "initial_vector": initial_vector_b64             }                          return JsonResponse(final_response, status=200)         except Exception as e:             print(e)             return HttpResponse(status=500, content='ok')          def flip_iv(self, iv):         flipped_bytes = []         for byte in iv:             flipped_byte = byte ^ 0xFF             flipped_bytes.append(flipped_byte)         return bytes(flipped_bytes) 

The entire decoding part is working normally but when returning the response I receive the error "Could not decrypt the response received from the server. "I can't find how to send the correct answer or how to validate it. The documentation can be found at https://developers.facebook.com/docs/whatsapp/flows/reference/implementingyourflowendpoint#data_exchange_request

Can anyone help me or show me a link I can test?

I am building WhatsApp Flow to retrieve orders. I am receiving the request and decrypting the message successfully. But I have trouble to encrypt response to WhatsApp. I got error: Invalid response from endpoint. I am using Python 3.9 and Pipedream. Some help?

See my encrypt code bellow:

from base64 import b64decode, b64encode from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes import json def handler(pd: "pipedream"):     # Getting the decrypted AES key and IV     aes_key_b64 = pd.steps["Decrypt_WhatsApp_Key"]["$return_value"]["decrypted_aes_key"]     iv_b64 = pd.steps["trigger"]["event"]["body"]["initial_vector"]     # Decoding AES key and base64 IV to bytes     aes_key = b64decode(aes_key_b64)     iv = b64decode(iv_b64)     # Preparing the inverted IV     iv_flipped = flip_iv(iv)     # Preparing response     response = {         "version": "3.0",         "screen": "SUCCESS",         "data": {             "extension_message_response": {                 "params": {                     "flow_token": pd.steps["Decrypt_WhatsApp_Message"]["$return_value"]["flow_token"],                     "status": pd.steps["shopify_developer_app"]["$return_value"]["orders"][0]["id"]                 }             }         }     }     response = json.dumps(response)     # Encrypting the response     cipher = Cipher(algorithms.AES(aes_key), modes.GCM(iv_flipped))     encryptor = cipher.encryptor()     encrypted = encryptor.update(response.encode("utf-8")) + encryptor.finalize() + encryptor.tag     encrypted_response = b64encode(encrypted).decode("utf-8")     # Response return     return {         "status": 200,         "body": encrypted_response,         "headers": {             "Content-Type": "application/json"         }     } def flip_iv(iv):     flipped_bytes = []     for byte in iv:         flipped_byte = byte ^ 0xFF         flipped_bytes.append(flipped_byte)     return bytes(flipped_bytes)``` 

  1. I am a quite sure that, the number used in Whatsapp business api can not be used directly in whatsapp app or whatsapp business app, still can anyone confirm that??

  2. If to receive and respond to the user Initiated message we need to form an UI interface, what are the possibilities and what is the best option to do so??

  • One, I thought was created our own chat UI, which I think will be time consuming and complicated.
  • Second, I am looking toward twilio's chat and conversation option. It is mentioned on twilio site that twilio-chats is depreciated. So I was looking forward to use twilio conversation.

But before going deep into twilio conversation apis and their documentation I would like to know if it will fit my use case.

Need - Can I use twilio conversation such that, I can connect my verified sender to 3-4 separate whatsapp numbers to respond form their individual whatsapp or whatsapp-business app, to all the user initiated conversation.

If possible can I get some specific documentation or guidance for it??

I'm trying to use the API to send to myself a custom message, I can already send a hello world template, but I been unable to send myself a custom only text message.

//API token given by Meta         $token = '*private*';         //Reciever number of msg         $telefono = '*private*';         //URL of msg given by Meta         $url = '*I think is private too*';         $mensaje = '{"messaging_product": "whatsapp", "to": "'.$telefono.'", "type": "text", "text": {"preview_url": false, "body": "MESSAGE_CONTENT" }}'; //header of msg $header = array("Authorization: Bearer " . $token, "Content-Type: application/json"); 

so that's what I use to make the Curl to send the message, which I do like this

//curl init         $curl = curl_init();         curl_setopt($curl, CURLOPT_URL, $url);         curl_setopt($curl, CURLOPT_POSTFIELDS, $mensaje);         curl_setopt($curl, CURLOPT_HTTPHEADER, $header);         curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);         //get response from information sent         $response = json_decode(curl_exec($curl),true);         //print response         print_r($response);         //get curl response code         $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);         print_r($status_code);         //close curl         curl_close($curl); 

I think is kind of working, because it shows on screen this result

Array ( [messaging_product] => whatsapp [contacts] => Array ( [0] => Array ( [input] => phone [wa_id] => 56994134989 ) ) [messages] => Array ( [0] => Array ( [id] => i think is private too ) ) ) 200

In the end I just need to test if its possible to send myself custom text messages, the thing is that this code isn't working as I want it to, as you should see, on the print of the result and the status_code, the code is 200 what makes me think that the request is going through at some point but maybe it need something else to finally be sent to my phone.