Skip to content

Commit

Permalink
Added support for LTO Template message
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrieldwight committed Oct 4, 2023
1 parent 090b040 commit 272a7e7
Show file tree
Hide file tree
Showing 5 changed files with 222 additions and 0 deletions.
94 changes: 94 additions & 0 deletions Samples/WhatsAppBusinessCloudAPI.Web/Controllers/HomeController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,100 @@ public async Task<IActionResult> SendWhatsAppCouponCodeTemplateMessage(SendTempl
}
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> SendWhatsAppLimitedTimeOfferTemplateMessage(SendTemplateMessageViewModel sendTemplateMessageViewModel)
{
try
{
LimitedTimeOfferTemplateMessageRequest limitedTimeOfferTemplateMessageRequest = new LimitedTimeOfferTemplateMessageRequest();
limitedTimeOfferTemplateMessageRequest.To = sendTemplateMessageViewModel.RecipientPhoneNumber;
limitedTimeOfferTemplateMessageRequest.Template = new();
limitedTimeOfferTemplateMessageRequest.Template.Name = sendTemplateMessageViewModel.TemplateName;
limitedTimeOfferTemplateMessageRequest.Template.Language = new();
limitedTimeOfferTemplateMessageRequest.Template.Language.Code = LanguageCode.English_US;
limitedTimeOfferTemplateMessageRequest.Template.Components = new List<LimitedTimeOfferMessageComponent>()
{
new LimitedTimeOfferMessageComponent()
{
Type = "body",
Parameters = new List<LimitedTimeOfferMessageParameter>()
{
new LimitedTimeOfferMessageParameter()
{
Type = "text",
Text = "Pablo"
},
new LimitedTimeOfferMessageParameter()
{
Type = "text",
Text = "CARIBE25"
}
}
},
new LimitedTimeOfferMessageComponent()
{
Type = "limited_time_offer",
Parameters = new List<LimitedTimeOfferMessageParameter>()
{
new LimitedTimeOfferMessageParameter()
{
Type = "limited_time_offer",
LimitedTimeOffer = new LimitedTimeOffer()
{
ExpirationTimeMs = new DateTimeOffset(DateTime.UtcNow.AddHours(2)).ToUnixTimeMilliseconds()
}
}
}
},
new LimitedTimeOfferMessageComponent()
{
Type = "button",
SubType = "copy_code",
Index = 0,
Parameters = new List<LimitedTimeOfferMessageParameter>()
{
new LimitedTimeOfferMessageParameter()
{
Type = "coupon_code",
CouponCode = "CARIBE25"
}
}
},
new LimitedTimeOfferMessageComponent()
{
Type = "button",
SubType = "url",
Index = 1,
Parameters = new List<LimitedTimeOfferMessageParameter>()
{
new LimitedTimeOfferMessageParameter()
{
Type = "text",
Text = "https://www.google.com/maps"
}
}
}
};

var results = await _whatsAppBusinessClient.SendLimitedTimeOfferMessageTemplateAsync(limitedTimeOfferTemplateMessageRequest);

if (results != null)
{
return RedirectToAction(nameof(Index)).WithSuccess("Success", "Successfully sent limited time offer template message");
}
else
{
return RedirectToAction(nameof(SendWhatsAppTemplateMessage));
}
}
catch (WhatsappBusinessCloudAPIException ex)
{
_logger.LogError(ex, ex.Message);
return RedirectToAction(nameof(SendWhatsAppTemplateMessage)).WithDanger("Error", ex.Message);
}
}

public IActionResult SendWhatsAppContactMessage()
{
return View();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
<button asp-action="SendWhatsAppCatalogueTemplateMessage" asp-controller="Home" class="btn btn-primary">Send Catalogue Template Message</button>
<button asp-action="SendWhatsAppCarouselTemplateMessage" asp-controller="Home" class="btn btn-primary">Send Carousel Template Message</button>
<button asp-action="SendWhatsAppCouponCodeTemplateMessage" asp-controller="Home" class="btn btn-primary">Send Coupon Code Template Message</button>
<button asp_action="SendWhatsAppLimitedTimeOfferTemplateMessage" asp-controller="Home" class="btn btn-primary">Send Limited Time Offer Message</button>
</div>
</div>
</form>
Expand Down
18 changes: 18 additions & 0 deletions WhatsappBusiness.CloudApi/Interfaces/IWhatsAppBusinessClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -853,6 +853,24 @@ public interface IWhatsAppBusinessClient
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
WhatsAppResponse SendCouponCodeMessageTemplate(CouponCodeTemplateMessageRequest couponCodeTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default);

/// <summary>
/// Send Limited Time Offer Template Message
/// </summary>
/// <param name="limitedTimeOfferTemplateMessageRequest">LimitedTimeOfferTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
Task<WhatsAppResponse> SendLimitedTimeOfferMessageTemplateAsync(LimitedTimeOfferTemplateMessageRequest limitedTimeOfferTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default);

/// <summary>
/// Send Limited Time Offer Template Message
/// </summary>
/// <param name="limitedTimeOfferTemplateMessageRequest">LimitedTimeOfferTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
WhatsAppResponse SendLimitedTimeOfferMessageTemplate(LimitedTimeOfferTemplateMessageRequest limitedTimeOfferTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default);
#endregion

#region Two step verification code function
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
using Newtonsoft.Json;
using System.Collections.Generic;

namespace WhatsappBusiness.CloudApi.Messages.Requests
{
public class LimitedTimeOfferTemplateMessageRequest
{
[JsonProperty("messaging_product")]
public string MessagingProduct { get; private set; } = "whatsapp";

[JsonProperty("recipient_type")]
public string RecipientType { get; private set; } = "individual";

[JsonProperty("to")]
public string To { get; set; }

[JsonProperty("type")]
public string Type { get; private set; } = "template";

[JsonProperty("template")]
public LimitedTimeOfferMessageTemplate Template { get; set; }
}

public class LimitedTimeOfferMessageTemplate
{
[JsonProperty("name")]
public string Name { get; set; }

[JsonProperty("language")]
public LimitedTimeOfferMessageLanguage Language { get; set; }

[JsonProperty("components")]
public List<LimitedTimeOfferMessageComponent> Components { get; set; }
}

public class LimitedTimeOfferMessageComponent
{
[JsonProperty("type")]
public string Type { get; set; }

[JsonProperty("parameters")]
public List<LimitedTimeOfferMessageParameter> Parameters { get; set; }

[JsonProperty("sub_type", NullValueHandling = NullValueHandling.Ignore)]
public string SubType { get; set; }

[JsonProperty("index", NullValueHandling = NullValueHandling.Ignore)]
public long? Index { get; set; }
}

public class LimitedTimeOfferMessageParameter
{
[JsonProperty("type")]
public string Type { get; set; }

[JsonProperty("image", NullValueHandling = NullValueHandling.Ignore)]
public LimitedTimeOfferMessageImage Image { get; set; }

[JsonProperty("text", NullValueHandling = NullValueHandling.Ignore)]
public string Text { get; set; }

[JsonProperty("limited_time_offer", NullValueHandling = NullValueHandling.Ignore)]
public LimitedTimeOffer LimitedTimeOffer { get; set; }

[JsonProperty("coupon_code", NullValueHandling = NullValueHandling.Ignore)]
public string CouponCode { get; set; }
}

public class LimitedTimeOfferMessageImage
{
[JsonProperty("id")]
public string Id { get; set; }
}

public class LimitedTimeOffer
{
[JsonProperty("expiration_time_ms")]
public long ExpirationTimeMs { get; set; }
}

public class LimitedTimeOfferMessageLanguage
{
[JsonProperty("code")]
public string Code { get; set; }
}
}
23 changes: 23 additions & 0 deletions WhatsappBusiness.CloudApi/WhatsAppBusinessClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2002,6 +2002,29 @@ public WhatsAppResponse SendCouponCodeMessageTemplate(CouponCodeTemplateMessageR
return WhatsAppBusinessPostAsync<WhatsAppResponse>(couponCodeTemplateMessageRequest, formattedWhatsAppEndpoint, cancellationToken).GetAwaiter().GetResult();
}

public async Task<WhatsAppResponse> SendLimitedTimeOfferMessageTemplateAsync(LimitedTimeOfferTemplateMessageRequest limitedTimeOfferTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default)
{
if (cloudApiConfig is not null)
{
_whatsAppConfig = cloudApiConfig;
}

var formattedWhatsAppEndpoint = WhatsAppBusinessRequestEndpoint.SendMessage.Replace("{{Phone-Number-ID}}", _whatsAppConfig.WhatsAppBusinessPhoneNumberId);
return await WhatsAppBusinessPostAsync<WhatsAppResponse>(limitedTimeOfferTemplateMessageRequest, formattedWhatsAppEndpoint, cancellationToken);
}


public WhatsAppResponse SendLimitedTimeOfferMessageTemplate(LimitedTimeOfferTemplateMessageRequest limitedTimeOfferTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default)
{
if (cloudApiConfig is not null)
{
_whatsAppConfig = cloudApiConfig;
}

var formattedWhatsAppEndpoint = WhatsAppBusinessRequestEndpoint.SendMessage.Replace("{{Phone-Number-ID}}", _whatsAppConfig.WhatsAppBusinessPhoneNumberId);
return WhatsAppBusinessPostAsync<WhatsAppResponse>(limitedTimeOfferTemplateMessageRequest, formattedWhatsAppEndpoint, cancellationToken).GetAwaiter().GetResult();
}

/// <summary>
/// You can use this endpoint to change two-step verification code associated with your account. After you change the verification code, future requests like changing the name, must use the new code.
/// You set up two-factor verification and register a phone number in the same API call.
Expand Down

0 comments on commit 272a7e7

Please sign in to comment.