Skip to content

Commit d0ef5f8

Browse files
committed
add pix paymment to text message
1 parent 4d74e26 commit d0ef5f8

File tree

5 files changed

+103
-3
lines changed

5 files changed

+103
-3
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,7 @@ Mail to sales@unoapi.cloud
817817
- Add /health endpoint with test connection with redis, s3 and rabbitmq
818818
- https://developers.facebook.com/docs/whatsapp/cloud-api/webhooks/reference/smb_message_echoes?locale=pt_BR format message sending by app\
819819
- https://developers.facebook.com/docs/whatsapp/cloud-api/webhooks/reference/history?locale=pt_BR format for sync history
820+
- https://developers.facebook.com/documentation/business-messaging/whatsapp/payments/payments-br/offsite-pix?locale=pt_BR
820821

821822
## Ready
822823
- Connect with pairing code: https://github.com/WhiskeySockets/Baileys#starting-socket-with-pairing-code

__tests__/services/transformer.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,77 @@ describe('service transformer', () => {
530530
expect(fromBaileysMessageContent(phoneNumer, input)[0]).toEqual(output)
531531
})
532532

533+
test('fromBaileysMessageContent with pix key', async () => {
534+
const phoneNumer = '5549998360838'
535+
const remotePhoneNumer = '554988290955'
536+
const remoteJid = `${remotePhoneNumer}@s.whatsapp.net`
537+
const key = `${new Date().getTime()}`
538+
const keyType = `key.${new Date().getTime()}`
539+
const id = `wa.${new Date().getTime()}`
540+
const merchantName = `Mary ${new Date().getTime()}`
541+
const messageTimestamp = Math.floor(new Date().getTime() / 1000).toString()
542+
const body = `*${merchantName}*\nChave PIX tipo *${keyType}*: ${key}`
543+
const input = {
544+
key: {
545+
remoteJid, fromMe: false, id
546+
},
547+
message: {
548+
interactiveMessage: {
549+
nativeFlowMessage: {
550+
buttons: [
551+
{
552+
buttonParamsJson: JSON.stringify({
553+
payment_settings: [
554+
{
555+
type:'pix_static_code',
556+
pix_static_code: {
557+
merchant_name: merchantName,
558+
key,
559+
key_type: keyType
560+
}
561+
}
562+
]
563+
})
564+
}
565+
]
566+
}
567+
}
568+
},
569+
pushName: merchantName,
570+
messageTimestamp,
571+
}
572+
const output = {
573+
object: 'whatsapp_business_account',
574+
entry: [
575+
{
576+
id: remoteJid,
577+
changes: [
578+
{
579+
value: {
580+
messaging_product: 'whatsapp',
581+
metadata: { display_phone_number: phoneNumer, phone_number_id: phoneNumer },
582+
messages: [
583+
{
584+
from: '5549988290955',
585+
id,
586+
timestamp: messageTimestamp,
587+
text: { body },
588+
type: 'text',
589+
},
590+
],
591+
contacts: [{ profile: { name: merchantName, picture: undefined }, wa_id: '5549988290955' }],
592+
statuses: [],
593+
errors: [],
594+
},
595+
field: 'messages',
596+
},
597+
],
598+
},
599+
],
600+
}
601+
expect(fromBaileysMessageContent(phoneNumer, input)[0]).toEqual(output)
602+
})
603+
533604
test('fromBaileysMessageContent with text', async () => {
534605
const phoneNumer = '5549998360838'
535606
const remotePhoneNumer = '554988290955'

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "unoapi-cloud",
3-
"version": "2.8.0-dev-10",
3+
"version": "2.8.0",
44
"description": "Unoapi Cloud",
55
"exports": "./dist/index.js",
66
"types": "./dist/index.d.ts",

src/services/config.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@ import { getStoreFile } from './store_file'
33
import { WAMessageKey, WAVersion } from 'baileys'
44
import { Level } from 'pino'
55

6+
// customUploadHosts: [
7+
// { hostname: 'media.fcgh28-1.fna.whatsapp.net', maxContentLengthBytes: NaN },
8+
// { hostname: 'media.fgru11-1.fna.whatsapp.net', maxContentLengthBytes: NaN },
9+
// { hostname: 'media.fsdu2-1.fna.whatsapp.net', maxContentLengthBytes: NaN },
10+
// { hostname: 'media.frao1-1.fna.whatsapp.net', maxContentLengthBytes: NaN },
11+
// { hostname: 'media.fcgh20-1.fna.whatsapp.net', maxContentLengthBytes: NaN },
12+
// { hostname: 'media.fpoa33-1.fna.whatsapp.net', maxContentLengthBytes: NaN },
13+
// { hostname: 'media.fbel2-1.fna.whatsapp.net', maxContentLengthBytes: NaN },
14+
// { hostname: 'mmg.whatsapp.net', maxContentLengthBytes: NaN } 
15+
// ]
16+
617
export const configs: Map<string, Config> = new Map()
718

819
export type connectionType = 'qrcode' | 'pairing_code' | 'forward'

src/services/transformer.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ export const TYPE_MESSAGES_TO_READ = [
8484
'templateButtonReplyMessage',
8585
'listMessage',
8686
'buttonsMessage',
87-
'buttonsResponseMessage'
87+
'buttonsResponseMessage',
88+
'interactiveMessage',
89+
'nativeFlowMessage',
8890
// 'templateMessage'
8991
]
9092

@@ -961,9 +963,10 @@ export const fromBaileysMessageContent = (phone: string, payload: any, config?:
961963
// {"key":{"remoteJid":"554988290955@s.whatsapp.net","fromMe":false,"id":"3A3BD07D3529A482876A"},"messageTimestamp":1726448401,"pushName":"Clairton Rodrigo Heinzen","broadcast":false,"message":{"messageContextInfo":{"deviceListMetadata":{"senderKeyHash":"FxWbzja6L9qr6A==","senderTimestamp":"1725477022","recipientKeyHash":"HDhq+OTRdd9hhg==","recipientTimestamp":"1725986929"},"deviceListMetadataVersion":2},"viewOnceMessageV2Extension":{"message":{"audioMessage":{"url":"https://mmg.whatsapp.net/v/t62.7117-24/26550443_409309922183140_5545513783776136395_n.enc?ccb=11-4&oh=01_Q5AaIFdNmgUqP86I5VM6WLnt4i1h6wxOoPGY2kvj7wQlhE4c&oe=670EF9DE&_nc_sid=5e03e0&mms3=true","mimetype":"audio/ogg; codecs=opus","fileSha256":"kIFwwAF/PlmPp/Lxy2lVKgt8aq+fzSe+XmRwT5/Cn5A=","fileLength":"11339","seconds":8,"ptt":true,"mediaKey":"MEOnPR/10pkdQhNjjoB1yJXOZ/x9XAJk0m1XI1g7tdM=","fileEncSha256":"ZS1J1Zkjd93jz8TVg9rlNSotMCVbbZyBR/lOIwQhkSI=","directPath":"/v/t62.7117-24/26550443_409309922183140_5545513783776136395_n.enc?ccb=11-4&oh=01_Q5AaIFdNmgUqP86I5VM6WLnt4i1h6wxOoPGY2kvj7wQlhE4c&oe=670EF9DE&_nc_sid=5e03e0","mediaKeyTimestamp":"1726448391","streamingSidecar":"hRM//de8KSrVng==","waveform":"AAYEAgEBAQMGFxscHBQkJBscIyMcHBUPCQQCAQEAAAEPIRwkHhgXGBQJBAIBAAAAAAAAAAAAAAAAAAAAAAAAAA==","viewOnce":true}}}}}
962964
case 'viewOnceMessageV2Extension':
963965
case 'lottieStickerMessage':
966+
case 'interactiveMessage':
964967
const changedPayload = {
965968
...payload,
966-
message: binMessage.message,
969+
message: binMessage.message || binMessage,
967970
}
968971
return fromBaileysMessageContent(phone, changedPayload, config)
969972

@@ -975,6 +978,20 @@ export const fromBaileysMessageContent = (phone: string, payload: any, config?:
975978
message.type = 'text'
976979
break
977980

981+
case 'nativeFlowMessage':
982+
// {"key":{"remoteJid":"x@s.whatsapp.net","fromMe":false,"id":"wjdgujkk","senderLid":"X@lid","senderPn":"X@s.whatsapp.net"},"messageTimestamp":1770817659,"pushName":"Refrigeração S","message":{"interactiveMessage":{"nativeFlowMessage":{"buttons":[{"name":"payment_info","buttonParamsJson":"{\"currency\":\"BRL\",\"total_amount\":{\"value\":0,\"offset\":100},\"reference_id\":\"XYZ\",\"type\":\"physical-goods\",\"order\":{\"status\":\"pending\",\"subtotal\":{\"value\":0,\"offset\":100},\"order_type\":\"ORDER\",\"items\":[{\"name\":\"\",\"amount\":{\"value\":0,\"offset\":100},\"quantity\":0,\"sale_amount\":{\"value\":0,\"offset\":100}}]},\"payment_settings\":[{\"type\":\"pix_static_code\",\"pix_static_code\":{\"merchant_name\":\"Refrigeração S LTDA\",\"key\":\"XXXX\",\"key_type\":\"CNPJ\"}}],\"share_payment_status\":false,\"referral\":\"chat_attachment\"}"}]}}},"verifiedBizName":"Refrigeração S"}
983+
const button = (binMessage?.buttons || [])[0] || {}
984+
const jsonParams: any = JSON.parse(button.buttonParamsJson || '{}')
985+
const settings = (jsonParams?.payment_settings || [])[0] || {}
986+
if (['pix_dynamic_code', 'pix_static_code'].includes(settings.type)) {
987+
const { merchant_name, key_type, key } = settings[settings.type] || {}
988+
message.text = {
989+
body: `*${merchant_name}*\nChave PIX tipo *${key_type}*: ${key}`
990+
}
991+
message.type = 'text'
992+
}
993+
break
994+
978995
case 'reactionMessage':
979996
// {"key":{"remoteJid":"554988290955@s.whatsapp.net","fromMe":false,"id":"3ABBD003E80C199C7BF6"},"messageTimestamp":1676631873,"pushName":"Clairton Rodrigo Heinzen","message":{"messageContextInfo":{"deviceListMetadata":{"senderKeyHash":"31S8mj42p3wLiQ==","senderTimestamp":"1676571145","recipientKeyHash":"tz8qTGvqyPjOUw==","recipientTimestamp":"1675040504"},"deviceListMetadataVersion":2},"reactionMessage":{"key":{"remoteJid":"554988290955@s.whatsapp.net","fromMe":false,"id":"3A51A48E269AFFF123FB"},"text":"👍","senderTimestampMs":"1676631872443"}}
980997
const reactionId = binMessage.key.id

0 commit comments

Comments
 (0)