whatsapp_sdk 0.13.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.cursorrules +53 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +9 -4
- data/README.md +115 -170
- data/example.rb +197 -113
- data/lib/whatsapp_sdk/api/business_profile.rb +12 -14
- data/lib/whatsapp_sdk/api/client.rb +26 -2
- data/lib/whatsapp_sdk/api/medias.rb +23 -31
- data/lib/whatsapp_sdk/api/messages.rb +24 -61
- data/lib/whatsapp_sdk/api/phone_numbers.rb +32 -22
- data/lib/whatsapp_sdk/api/request.rb +2 -0
- data/lib/whatsapp_sdk/api/responses/generic_error_response.rb +4 -4
- data/lib/whatsapp_sdk/api/responses/http_response_error.rb +18 -0
- data/lib/whatsapp_sdk/api/responses/{message_error_response.rb → id_response.rb} +6 -3
- data/lib/whatsapp_sdk/api/responses/message_data_response.rb +17 -20
- data/lib/whatsapp_sdk/api/responses/pagination_records.rb +17 -0
- data/lib/whatsapp_sdk/api/responses/success_response.rb +3 -16
- data/lib/whatsapp_sdk/api/templates.rb +27 -36
- data/lib/whatsapp_sdk/resource/business_profile.rb +28 -0
- data/lib/whatsapp_sdk/resource/errors.rb +2 -0
- data/lib/whatsapp_sdk/resource/media.rb +18 -68
- data/lib/whatsapp_sdk/resource/media_component.rb +89 -0
- data/lib/whatsapp_sdk/resource/message_template_namespace.rb +17 -0
- data/lib/whatsapp_sdk/resource/phone_number.rb +41 -11
- data/lib/whatsapp_sdk/resource/phone_number_component.rb +25 -0
- data/lib/whatsapp_sdk/resource/template.rb +20 -0
- data/lib/whatsapp_sdk/version.rb +1 -1
- data/whatsapp_sdk.gemspec +1 -1
- metadata +10 -15
- data/lib/whatsapp_sdk/api/response.rb +0 -32
- data/lib/whatsapp_sdk/api/responses/business_profile_data_response.rb +0 -33
- data/lib/whatsapp_sdk/api/responses/data_response.rb +0 -17
- data/lib/whatsapp_sdk/api/responses/error_response.rb +0 -25
- data/lib/whatsapp_sdk/api/responses/media_data_response.rb +0 -30
- data/lib/whatsapp_sdk/api/responses/message_template_namespace_data_response.rb +0 -27
- data/lib/whatsapp_sdk/api/responses/phone_number_data_response.rb +0 -42
- data/lib/whatsapp_sdk/api/responses/phone_numbers_data_response.rb +0 -32
- data/lib/whatsapp_sdk/api/responses/read_message_data_response.rb +0 -29
- data/lib/whatsapp_sdk/api/responses/template_data_response.rb +0 -46
- data/lib/whatsapp_sdk/api/responses/templates_data_response.rb +0 -32
data/example.rb
CHANGED
@@ -33,7 +33,7 @@ if ACCESS_TOKEN == "<TODO replace>"
|
|
33
33
|
exit
|
34
34
|
end
|
35
35
|
|
36
|
-
puts "\n\n\n\
|
36
|
+
puts "\n\n\n\ ------------------ Starting calling the Cloud API -------------------\n"
|
37
37
|
|
38
38
|
################# Initialize Client #################
|
39
39
|
WhatsappSdk.configure do |config|
|
@@ -41,38 +41,34 @@ WhatsappSdk.configure do |config|
|
|
41
41
|
end
|
42
42
|
|
43
43
|
################# HELPERS ########################
|
44
|
-
def print_message_sent(message_response)
|
45
|
-
|
46
|
-
puts "Message sent to: #{message_response.data.contacts.first.input}"
|
47
|
-
else
|
48
|
-
puts "Error: #{message_response.error&.to_s}"
|
49
|
-
end
|
44
|
+
def print_message_sent(message_response, type = "")
|
45
|
+
puts "Message #{type} sent to: #{message_response.contacts.first.input}"
|
50
46
|
end
|
51
47
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
48
|
+
def run_and_catch_error(message, &block)
|
49
|
+
begin
|
50
|
+
yield
|
51
|
+
rescue WhatsappSdk::Api::Responses::HttpResponseError => e
|
52
|
+
puts "Error: #{e}"
|
55
53
|
end
|
56
|
-
|
57
|
-
return identifier
|
58
54
|
end
|
59
55
|
##################################################
|
60
56
|
|
57
|
+
client = WhatsappSdk::Api::Client.new
|
58
|
+
|
61
59
|
|
62
|
-
medias_api = WhatsappSdk::Api::Medias.new
|
63
|
-
messages_api = WhatsappSdk::Api::Messages.new
|
64
|
-
phone_numbers_api = WhatsappSdk::Api::PhoneNumbers.new
|
65
|
-
business_profile_api = WhatsappSdk::Api::BusinessProfile.new
|
66
|
-
templates_api = WhatsappSdk::Api::Templates.new
|
67
60
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
61
|
+
|
62
|
+
# ############################## Templates API ##############################
|
63
|
+
puts "\n\n ------------------ Testing Templates API ------------------------"
|
64
|
+
|
65
|
+
# ## Get list of templates
|
66
|
+
templates = client.templates.list(business_id: BUSINESS_ID)
|
67
|
+
puts "GET Templates list : #{ templates.records.map(&:name) }"
|
72
68
|
|
73
69
|
## Get message templates namespace
|
74
|
-
template_namespace =
|
75
|
-
puts "GET template by namespace: #{
|
70
|
+
template_namespace = client.templates.get_message_template_namespace(business_id: BUSINESS_ID)
|
71
|
+
puts "GET template by namespace: #{template_namespace.id}"
|
76
72
|
|
77
73
|
# Create a template
|
78
74
|
components_json = [
|
@@ -104,11 +100,15 @@ components_json = [
|
|
104
100
|
}
|
105
101
|
]
|
106
102
|
|
107
|
-
new_template =
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
103
|
+
new_template = nil
|
104
|
+
|
105
|
+
run_and_catch_error("Create a template") do
|
106
|
+
new_template = client.templates.create(
|
107
|
+
business_id: BUSINESS_ID, name: "seasonal_promotion_2", language: "ka", category: "MARKETING",
|
108
|
+
components_json: components_json, allow_category_change: true
|
109
|
+
)
|
110
|
+
puts "GET template by namespace: #{template_namespace.id}"
|
111
|
+
end
|
112
112
|
|
113
113
|
# Update a template
|
114
114
|
components_json = [
|
@@ -124,150 +124,234 @@ components_json = [
|
|
124
124
|
]
|
125
125
|
}
|
126
126
|
]
|
127
|
-
|
128
|
-
|
127
|
+
|
128
|
+
if new_template
|
129
|
+
updated_template = client.templates.update(template_id: new_template.id, category: "UTILITY")
|
130
|
+
puts "UPDATE template by id: #{updated_template.id}"
|
131
|
+
end
|
129
132
|
|
130
133
|
## Delete a template
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
+
run_and_catch_error("Delete a template") do
|
135
|
+
delete_template = client.templates.delete(business_id: BUSINESS_ID, name: "seasonal_promotion") # delete by name
|
136
|
+
puts "Delete template by id: #{delete_template.id}"
|
137
|
+
end
|
138
|
+
|
139
|
+
# client.templates.delete(business_id: BUSINESS_ID, name: "name2", hsm_id: "243213188351928") # delete by name and id
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
# ############################## Business API ##############################
|
144
|
+
puts "\n\n\n ------------------ Testing Business API -----------------------"
|
145
|
+
|
146
|
+
business_profile = client.business_profiles.get(SENDER_ID)
|
147
|
+
puts "GET Business Profile by id: #{business_profile.about}"
|
148
|
+
|
149
|
+
updated_bp = client.business_profiles.update(phone_number_id: SENDER_ID, params: { websites: ["www.ignaciochiazzo.com"] } )
|
150
|
+
puts "UPDATE Business Profile by id: #{updated_bp} }"
|
151
|
+
|
152
|
+
run_and_catch_error("Update business profile") do
|
153
|
+
# about can't be set
|
154
|
+
updated_bp = client.business_profiles.update(phone_number_id: SENDER_ID, params: { about: "A cool business" } )
|
155
|
+
end
|
134
156
|
|
135
|
-
############################## Business API ##############################
|
136
|
-
business_profile = business_profile_api.details(SENDER_ID)
|
137
|
-
puts "DELETE Business Profile by id: #{print_data_or_error(delete_template, business_profile.data&.about) }"
|
138
157
|
|
139
|
-
updated_bp = business_profile_api.update(phone_number_id: SENDER_ID, params: { about: "A very cool business" } )
|
140
|
-
puts "UPDATE Business Profile by id: #{print_data_or_error(updated_bp, updated_bp.data&.success?) }"
|
141
158
|
|
142
159
|
############################## Phone Numbers API ##############################
|
143
|
-
|
144
|
-
|
160
|
+
puts "\n\n\n ------------------ Testing Phone Numbers API -----------------------"
|
161
|
+
|
162
|
+
# Get phone numbers
|
163
|
+
registered_number = client.phone_numbers.get(SENDER_ID)
|
164
|
+
puts "GET Registered number: #{registered_number.id}"
|
165
|
+
|
166
|
+
# Get phone number
|
167
|
+
registered_numbers = client.phone_numbers.list(BUSINESS_ID)
|
168
|
+
puts "GET Registered numbers: #{registered_numbers.records.map(&:id)}"
|
169
|
+
|
170
|
+
# Deregister a phone number - I skip registering so that the number can upload media
|
171
|
+
# run_and_catch_error("Deregister a phone number") do
|
172
|
+
# deregister_number_result = client.phone_numbers.deregister_number(SENDER_ID)
|
173
|
+
# puts "DEREGISTER number: #{deregister_number_result}"
|
174
|
+
# end
|
175
|
+
|
176
|
+
# Register a phone number
|
177
|
+
run_and_catch_error("Register a phone number") do
|
178
|
+
register_number_result = client.phone_numbers.register_number(SENDER_ID, 123456)
|
179
|
+
puts "REGISTER number: #{register_number_result}"
|
180
|
+
end
|
145
181
|
|
146
|
-
|
147
|
-
|
182
|
+
# Register a fake number
|
183
|
+
begin
|
184
|
+
fake_number = "1234567890"
|
185
|
+
client.phone_numbers.register_number(fake_number, 123456)
|
186
|
+
rescue WhatsappSdk::Api::Responses::HttpResponseError => e
|
187
|
+
puts "Error: #{e}"
|
188
|
+
end
|
148
189
|
|
149
|
-
############################## Media API ##############################
|
150
190
|
|
191
|
+
############################## Media API ##############################
|
192
|
+
puts "\n\n\n ------------------ Testing Media API"
|
151
193
|
##### Image #####
|
152
194
|
# upload a Image
|
153
|
-
|
154
|
-
|
195
|
+
run_and_catch_error("Upload a Image") do
|
196
|
+
uploaded_media = client.media.upload(sender_id: SENDER_ID, file_path: "test/fixtures/assets/whatsapp.png", type: "image/png")
|
197
|
+
puts "Uploaded image id: #{uploaded_media&.id}"
|
198
|
+
end
|
155
199
|
|
156
200
|
# get a media Image
|
157
|
-
if uploaded_media
|
158
|
-
|
159
|
-
puts "GET
|
201
|
+
if uploaded_media&.id
|
202
|
+
image = client.media.get(media_id: uploaded_media.id)
|
203
|
+
puts "GET image id: #{image.id}"
|
160
204
|
|
161
205
|
# download media Image
|
162
|
-
download_image =
|
163
|
-
puts "Downloaded: #{
|
206
|
+
download_image = client.media.download(url: image.url, file_path: 'test/fixtures/assets/downloaded_image.png', media_type: "image/png")
|
207
|
+
puts "Downloaded Image: #{download_image}"
|
164
208
|
|
209
|
+
uploaded_media = client.media.upload(sender_id: SENDER_ID, file_path: "test/fixtures/assets/whatsapp.png", type: "image/png")
|
165
210
|
# delete a media
|
166
|
-
deleted_media =
|
167
|
-
puts "
|
211
|
+
deleted_media = client.media.delete(media_id: uploaded_media.id)
|
212
|
+
puts "Delete image: #{deleted_media.success?}"
|
213
|
+
else
|
214
|
+
puts "No media to download and delete"
|
168
215
|
end
|
169
216
|
|
217
|
+
#### Video ####
|
218
|
+
# upload a video
|
219
|
+
uploaded_video = client.media.upload(sender_id: SENDER_ID, file_path: "test/fixtures/assets/riquelme.mp4", type: "video/mp4")
|
220
|
+
puts "Uploaded video: #{uploaded_video.id}"
|
221
|
+
|
222
|
+
video = client.media.get(media_id: uploaded_video.id)
|
223
|
+
|
224
|
+
# upload a video
|
225
|
+
uploaded_video = client.media.upload(sender_id: SENDER_ID, file_path: "test/fixtures/assets/riquelme.mp4", type: "video/mp4")
|
226
|
+
puts "Uploaded video id: #{uploaded_video.id}"
|
227
|
+
|
170
228
|
#### Audio ####
|
171
229
|
# upload an audio
|
172
|
-
|
173
|
-
puts "Uploaded
|
174
|
-
|
175
|
-
if uploaded_media.data&.id
|
176
|
-
media_id = uploaded_media.data&.id
|
177
|
-
media_id = uploaded_media.data&.id
|
178
|
-
puts "Uploaded media id: #{media_id}"
|
179
|
-
media_id = uploaded_media.data&.id
|
180
|
-
puts "Uploaded media id: #{media_id}"
|
230
|
+
audio_response = client.media.upload(sender_id: SENDER_ID, file_path: "test/fixtures/assets/downloaded_audio.ogg", type: "audio/ogg")
|
231
|
+
puts "Uploaded audio id: #{audio_response.id}"
|
181
232
|
|
233
|
+
if audio_response&.id
|
234
|
+
audio_id = audio_response&.id
|
182
235
|
# get a media audio
|
183
|
-
|
184
|
-
puts "GET
|
236
|
+
audio = client.media.get(media_id: audio_id)
|
237
|
+
puts "GET Audio id: #{audio.id}"
|
185
238
|
|
186
239
|
# get a media audio
|
187
|
-
audio_link =
|
188
|
-
download_image =
|
189
|
-
puts "Download
|
240
|
+
audio_link = audio.url
|
241
|
+
download_image = client.media.download(url: audio_link, file_path: 'test/fixtures/assets/downloaded_audio2.ogg', media_type: "audio/ogg")
|
242
|
+
puts "Download Audio: #{download_image}"
|
190
243
|
end
|
191
244
|
|
245
|
+
# upload a document
|
246
|
+
document_response = client.media.upload(sender_id: SENDER_ID, file_path: "test/fixtures/assets/document.pdf", type: "application/pdf")
|
247
|
+
puts "Uploaded document id: #{document_response.id}"
|
248
|
+
|
249
|
+
document = client.media.get(media_id: document_response.id)
|
250
|
+
puts "GET document id: #{document.id}"
|
251
|
+
|
252
|
+
# upload a sticker
|
253
|
+
sticker_response = client.media.upload(sender_id: SENDER_ID, file_path: "test/fixtures/assets/sticker.webp", type: "image/webp")
|
254
|
+
puts "Uploaded sticker id: #{sticker_response.id}"
|
255
|
+
|
256
|
+
sticker = client.media.get(media_id: sticker_response.id)
|
257
|
+
puts "GET Sticker id: #{sticker.id}"
|
258
|
+
|
259
|
+
|
260
|
+
|
192
261
|
############################## Messages API ##############################
|
262
|
+
puts "\n\n\n ------------------ Testing Messages API -----------------------"
|
193
263
|
|
194
264
|
######### SEND A TEXT MESSAGE
|
195
|
-
message_sent =
|
196
|
-
|
265
|
+
message_sent = client.messages.send_text(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER,
|
266
|
+
message: "Hey there! it's Whatsapp Ruby SDK")
|
267
|
+
print_message_sent(message_sent, "text")
|
197
268
|
|
198
269
|
######### React to a message
|
199
|
-
message_id = message_sent
|
200
|
-
reaction_1_sent =
|
201
|
-
|
202
|
-
|
203
|
-
|
270
|
+
message_id = message_sent&.messages.first.id
|
271
|
+
reaction_1_sent = client.messages.send_reaction(
|
272
|
+
sender_id: SENDER_ID,
|
273
|
+
recipient_number: RECIPIENT_NUMBER,
|
274
|
+
message_id: message_id,
|
275
|
+
emoji: "\u{1f550}"
|
276
|
+
) if message_id
|
277
|
+
|
278
|
+
reaction_2_sent = client.messages.send_reaction(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER,
|
279
|
+
message_id: message_id, emoji: "⛄️") if message_id
|
280
|
+
puts "Message Reaction 1: #{reaction_1_sent&.messages.first&.id}"
|
281
|
+
puts "Message Reaction 2: #{reaction_2_sent&.messages.first&.id}"
|
204
282
|
|
205
283
|
######### Reply to a message
|
206
|
-
message_to_reply_id = message_sent.
|
207
|
-
reply =
|
208
|
-
|
284
|
+
message_to_reply_id = message_sent.messages.first.id
|
285
|
+
reply = client.messages.send_text(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, message: "I'm a reply",
|
286
|
+
message_id: message_to_reply_id)
|
287
|
+
print_message_sent(reply, "reply")
|
209
288
|
|
210
289
|
######### Send location
|
211
|
-
|
290
|
+
|
291
|
+
location_sent = client.messages.send_location(
|
212
292
|
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER,
|
213
293
|
longitude: -75.6898604, latitude: 45.4192206, name: "Ignacio", address: "My house"
|
214
294
|
)
|
215
|
-
print_message_sent(location_sent)
|
295
|
+
print_message_sent(location_sent, "location")
|
216
296
|
|
217
297
|
######### READ A MESSAGE
|
218
|
-
#
|
298
|
+
# client.messages.read_message(sender_id: SENDER_ID, message_id: msg_id)
|
219
299
|
|
220
300
|
######### SEND AN IMAGE
|
221
301
|
# Send an image with a link
|
222
|
-
if
|
223
|
-
image_sent =
|
224
|
-
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link:
|
302
|
+
if image&.id
|
303
|
+
image_sent = client.messages.send_image(
|
304
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link: image.url, caption: "Ignacio Chiazzo Profile"
|
225
305
|
)
|
226
|
-
print_message_sent(image_sent)
|
306
|
+
print_message_sent(image_sent, "image via url")
|
227
307
|
|
228
308
|
# Send an image with an id
|
229
|
-
|
230
|
-
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, image_id:
|
309
|
+
client.messages.send_image(
|
310
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, image_id: image.id, caption: "Ignacio Chiazzo Profile"
|
231
311
|
)
|
232
|
-
print_message_sent(image_sent)
|
312
|
+
print_message_sent(image_sent, "image via id")
|
233
313
|
end
|
234
314
|
|
235
315
|
######### SEND AUDIOS
|
236
316
|
## with a link
|
237
|
-
audio_sent =
|
238
|
-
print_message_sent(audio_sent)
|
317
|
+
audio_sent = client.messages.send_audio(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link: audio.url)
|
318
|
+
print_message_sent(audio_sent, "audio via url")
|
239
319
|
|
240
320
|
## with an audio id
|
241
|
-
audio_sent =
|
242
|
-
print_message_sent(audio_sent)
|
321
|
+
audio_sent = client.messages.send_audio(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, audio_id: audio.id)
|
322
|
+
print_message_sent(audio_sent, "audio via id")
|
243
323
|
|
244
324
|
######### SEND DOCUMENTS
|
245
325
|
## with a link
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
326
|
+
if document&.id
|
327
|
+
document_sent = client.messages.send_document(
|
328
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link: document&.url, caption: "Ignacio Chiazzo"
|
329
|
+
)
|
330
|
+
print_message_sent(document_sent, "document via url")
|
250
331
|
|
251
|
-
## with a document id
|
252
|
-
document_sent =
|
253
|
-
|
254
|
-
)
|
255
|
-
print_message_sent(document_sent)
|
332
|
+
## with a document id
|
333
|
+
document_sent = client.messages.send_document(
|
334
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, document_id: document&.id, caption: "Ignacio Chiazzo"
|
335
|
+
) # modify
|
336
|
+
print_message_sent(document_sent, "document via id")
|
337
|
+
end
|
256
338
|
|
257
339
|
######### SEND STICKERS
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
340
|
+
if sticker&.id
|
341
|
+
## with a link
|
342
|
+
sticker_sent = client.messages.send_sticker(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link: sticker.url)
|
343
|
+
print_message_sent(sticker_sent, "sticker via url")
|
344
|
+
|
345
|
+
## with a sticker_id
|
346
|
+
sticker_sent = client.messages.send_sticker(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, sticker_id: sticker.id)
|
347
|
+
print_message_sent(sticker_sent, "sticker via id")
|
348
|
+
end
|
265
349
|
|
266
350
|
######### SEND A TEMPLATE
|
267
351
|
# Note: The template must have been created previously.
|
268
352
|
|
269
353
|
# Send a template with no component
|
270
|
-
response_with_object =
|
354
|
+
response_with_object = client.messages.send_template(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER,
|
271
355
|
name: "hello_world", language: "en_US", components: [])
|
272
356
|
puts response_with_object
|
273
357
|
|
@@ -275,9 +359,9 @@ puts response_with_object
|
|
275
359
|
header_component = WhatsappSdk::Resource::Component.new(
|
276
360
|
type: WhatsappSdk::Resource::Component::Type::HEADER
|
277
361
|
)
|
278
|
-
image = WhatsappSdk::Resource::
|
279
|
-
document = WhatsappSdk::Resource::
|
280
|
-
video = WhatsappSdk::Resource::
|
362
|
+
image = WhatsappSdk::Resource::MediaComponent.new(type: "image", link: "http(s)://URL", caption: "caption")
|
363
|
+
document = WhatsappSdk::Resource::MediaComponent.new(type: "document", link: "http(s)://URL", filename: "txt.rb")
|
364
|
+
video = WhatsappSdk::Resource::MediaComponent.new(type: "video", id: "123")
|
281
365
|
location = WhatsappSdk::Resource::Location.new(
|
282
366
|
latitude: 25.779510, longitude: -80.338631, name: "miami store", address: "820 nw 87th ave, miami, fl"
|
283
367
|
)
|
@@ -340,7 +424,7 @@ button_component_2 = WhatsappSdk::Resource::Component.new(
|
|
340
424
|
)
|
341
425
|
|
342
426
|
# Send a template with component_json
|
343
|
-
response_with_json =
|
427
|
+
response_with_json = client.messages.send_template(
|
344
428
|
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, name: "hello_world", language: "en_US",
|
345
429
|
components_json: [
|
346
430
|
{
|
@@ -374,7 +458,7 @@ interactive_footer = WhatsappSdk::Resource::InteractiveFooter.new(
|
|
374
458
|
)
|
375
459
|
|
376
460
|
interactive_action = WhatsappSdk::Resource::InteractiveAction.new(
|
377
|
-
type: WhatsappSdk::Resource::InteractiveAction::Type::REPLY_BUTTON
|
461
|
+
type: WhatsappSdk::Resource::InteractiveAction::Type::REPLY_BUTTON
|
378
462
|
)
|
379
463
|
|
380
464
|
interactive_reply_button_1 = WhatsappSdk::Resource::InteractiveActionReplyButton.new(
|
@@ -397,7 +481,7 @@ interactive_reply_buttons = WhatsappSdk::Resource::Interactive.new(
|
|
397
481
|
action: interactive_action
|
398
482
|
)
|
399
483
|
|
400
|
-
|
484
|
+
client.messages.send_interactive_reply_buttons(
|
401
485
|
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER,
|
402
486
|
interactive: interactive_reply_buttons
|
403
487
|
)
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "request"
|
4
|
-
require_relative "response"
|
5
4
|
require_relative "../resource/business_profile"
|
6
5
|
|
7
6
|
module WhatsappSdk
|
@@ -22,8 +21,8 @@ module WhatsappSdk
|
|
22
21
|
# Get the details of business profile.
|
23
22
|
#
|
24
23
|
# @param phone_number_id [Integer] Phone Number Id.
|
25
|
-
# @return [
|
26
|
-
def
|
24
|
+
# @return [Resource::BusinessProfile] Response object.
|
25
|
+
def get(phone_number_id, fields: nil)
|
27
26
|
fields = if fields
|
28
27
|
fields.join(',')
|
29
28
|
else
|
@@ -35,20 +34,22 @@ module WhatsappSdk
|
|
35
34
|
endpoint: "#{phone_number_id}/whatsapp_business_profile?fields=#{fields}"
|
36
35
|
)
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
# In the future it might have multiple business profiles.
|
38
|
+
Resource::BusinessProfile.from_hash(response["data"][0])
|
39
|
+
end
|
40
|
+
|
41
|
+
def details(phone_number_id, fields: nil)
|
42
|
+
warn "[DEPRECATION] `details` is deprecated. Please use `get` instead."
|
43
|
+
get(phone_number_id, fields: fields)
|
42
44
|
end
|
43
45
|
|
44
46
|
# Update the details of business profile.
|
45
47
|
#
|
46
48
|
# @param phone_number_id [Integer] Phone Number Id.
|
47
49
|
# @param params [Hash] Params to update.
|
48
|
-
# @return [
|
50
|
+
# @return [Boolean] Whether the update was successful.
|
49
51
|
def update(phone_number_id:, params:)
|
50
|
-
#
|
51
|
-
params[:messaging_product] = 'whatsapp'
|
52
|
+
params[:messaging_product] = 'whatsapp' # messaging_products is a required field
|
52
53
|
return raise InvalidVertical.new(vertical: params[:vertical]) unless valid_vertical?(params)
|
53
54
|
|
54
55
|
response = send_request(
|
@@ -57,10 +58,7 @@ module WhatsappSdk
|
|
57
58
|
params: params
|
58
59
|
)
|
59
60
|
|
60
|
-
Api::
|
61
|
-
response: response,
|
62
|
-
data_class_type: Api::Responses::SuccessResponse
|
63
|
-
)
|
61
|
+
Api::Responses::SuccessResponse.success_response?(response: response)
|
64
62
|
end
|
65
63
|
|
66
64
|
private
|
@@ -7,14 +7,14 @@ module WhatsappSdk
|
|
7
7
|
module Api
|
8
8
|
class Client
|
9
9
|
API_VERSIONS = [
|
10
|
-
'v19.0', 'v18.0', 'v17.0', 'v16.0', 'v15.0', 'v14.0', 'v13.0', 'v12.0',
|
10
|
+
'v21.0', 'v20.0', 'v19.0', 'v18.0', 'v17.0', 'v16.0', 'v15.0', 'v14.0', 'v13.0', 'v12.0',
|
11
11
|
'v11.0', 'v10.0', 'v9.0', 'v8.0', 'v7.0', 'v6.0', 'v5.0', 'v4.0', 'v3.3',
|
12
12
|
'v3.2', 'v3.1', 'v3.0', 'v2.12', 'v2.11', 'v2.10', 'v2.9', 'v2.8', 'v2.7',
|
13
13
|
'v2.6', 'v2.5', 'v2.4', 'v2.3', 'v2.2', 'v2.1'
|
14
14
|
].freeze
|
15
15
|
|
16
16
|
def initialize(
|
17
|
-
access_token,
|
17
|
+
access_token = WhatsappSdk.configuration.access_token,
|
18
18
|
api_version = ApiConfiguration::DEFAULT_API_VERSION,
|
19
19
|
logger = nil,
|
20
20
|
logger_options = {}
|
@@ -27,6 +27,26 @@ module WhatsappSdk
|
|
27
27
|
@api_version = api_version
|
28
28
|
end
|
29
29
|
|
30
|
+
def media
|
31
|
+
@media ||= WhatsappSdk::Api::Medias.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def messages
|
35
|
+
@messages ||= WhatsappSdk::Api::Messages.new
|
36
|
+
end
|
37
|
+
|
38
|
+
def phone_numbers
|
39
|
+
@phone_numbers ||= WhatsappSdk::Api::PhoneNumbers.new
|
40
|
+
end
|
41
|
+
|
42
|
+
def business_profiles
|
43
|
+
@business_profiles ||= WhatsappSdk::Api::BusinessProfile.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def templates
|
47
|
+
@templates ||= WhatsappSdk::Api::Templates.new
|
48
|
+
end
|
49
|
+
|
30
50
|
def send_request(endpoint: "", full_url: nil, http_method: "post", params: {}, headers: {}, multipart: false)
|
31
51
|
url = full_url || "#{ApiConfiguration::API_URL}/#{@api_version}/"
|
32
52
|
|
@@ -34,6 +54,10 @@ module WhatsappSdk
|
|
34
54
|
|
35
55
|
response = faraday_request.public_send(http_method, endpoint, request_params(params, headers), headers)
|
36
56
|
|
57
|
+
if response.status > 499 || Api::Responses::GenericErrorResponse.response_error?(response: response.body)
|
58
|
+
raise Api::Responses::HttpResponseError.new(http_status: response.status, body: JSON.parse(response.body))
|
59
|
+
end
|
60
|
+
|
37
61
|
return nil if response.body == ""
|
38
62
|
|
39
63
|
JSON.parse(response.body)
|