Skip to content

Commit

Permalink
Added implementation of authentication and MPM template message
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrieldwight committed Jun 22, 2023
1 parent 36b0e7a commit 4b01e2d
Show file tree
Hide file tree
Showing 5 changed files with 287 additions and 22 deletions.
56 changes: 46 additions & 10 deletions WhatsappBusiness.CloudApi/Interfaces/IWhatsAppBusinessClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -729,17 +729,53 @@ public interface IWhatsAppBusinessClient
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
WhatsAppResponse SendMultipleProductMessage(MultiProductMessageRequest multiProductMessage, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default);
#endregion

#region Two step verification code function
/// <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.
/// </summary>
/// <param name="twoStepVerificationRequest">TwoStepVerificationRequest object</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>BaseSuccessResponse</returns>
Task<BaseSuccessResponse> SetTwoStepVerificationAsync(TwoStepVerificationRequest twoStepVerificationRequest, CancellationToken cancellationToken = default);
/// <summary>
/// Send Authentication Template Message
/// </summary>
/// <param name="authenticationTemplateMessageRequest">AuthenticationTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
Task<WhatsAppResponse> SendAuthenticationMessageTemplateAsync(AuthenticationTemplateMessageRequest authenticationTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default);

/// <summary>
/// Send Authentication Template Message
/// </summary>
/// <param name="authenticationTemplateMessageRequest">AuthenticationTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
WhatsAppResponse SendAuthenticationMessageTemplate(AuthenticationTemplateMessageRequest authenticationTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default);

/// <summary>
/// Send MPM Template Message
/// </summary>
/// <param name="multiProductTemplateMessageRequest">MultiProductTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
Task<WhatsAppResponse> SendMPMTemplateAsync(MultiProductTemplateMessageRequest multiProductTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default);

/// <summary>
/// Send MPM Template Message
/// </summary>
/// <param name="multiProductTemplateMessageRequest">MultiProductTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
WhatsAppResponse SendMPMTemplate(MultiProductTemplateMessageRequest multiProductTemplateMessageRequest, WhatsAppBusinessCloudApiConfig? cloudApiConfig = null, CancellationToken cancellationToken = default);
#endregion

#region Two step verification code function
/// <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.
/// </summary>
/// <param name="twoStepVerificationRequest">TwoStepVerificationRequest object</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>BaseSuccessResponse</returns>
Task<BaseSuccessResponse> SetTwoStepVerificationAsync(TwoStepVerificationRequest twoStepVerificationRequest, CancellationToken cancellationToken = default);

/// <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.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using Newtonsoft.Json;
using System.Collections.Generic;

namespace WhatsappBusiness.CloudApi.Messages.Requests
{
public class AuthenticationTemplateMessageRequest
{
[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 AuthenticationMessageTemplate Template { get; set; }
}

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

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

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

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

[JsonProperty("parameters")]
public List<AuthenticationMessageParameter> 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 AuthenticationMessageParameter
{
[JsonProperty("type")]
public string Type { get; set; }

[JsonProperty("text")]
public string Text { get; set; }
}

public class AuthenticationMessageLanguage
{
[JsonProperty("code")]
public string Code { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using Newtonsoft.Json;
using System.Collections.Generic;

namespace WhatsappBusiness.CloudApi.Messages.Requests
{
public class MultiProductTemplateMessageRequest
{
[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 MPMTemplate Template { get; set; }
}

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

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

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

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

[JsonProperty("parameters")]
public List<MPMParameter> 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 MPMParameter
{
[JsonProperty("type")]
public string Type { get; set; }

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

[JsonProperty("action", NullValueHandling = NullValueHandling.Ignore)]
public MPMAction Action { get; set; }
}

public class MPMAction
{
[JsonProperty("thumbnail_product_retailer_id")]
public string ThumbnailProductRetailerId { get; set; }

[JsonProperty("sections")]
public List<MPMSection> Sections { get; set; }
}

public class MPMSection
{
[JsonProperty("title")]
public string Title { get; set; }

[JsonProperty("product_items")]
public List<MPMProductItem> ProductItems { get; set; }
}

public class MPMProductItem
{
[JsonProperty("product_retailer_id")]
public string ProductRetailerId { get; set; }
}

public class MPMLanguage
{
[JsonProperty("code")]
public string Code { get; set; }
}
}
90 changes: 81 additions & 9 deletions WhatsappBusiness.CloudApi/WhatsAppBusinessClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1760,14 +1760,86 @@ public WhatsAppResponse SendMultipleProductMessage(MultiProductMessageRequest mu
return WhatsAppBusinessPostAsync<WhatsAppResponse>(multiProductMessage, 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.
/// </summary>
/// <param name="twoStepVerificationRequest">TwoStepVerificationRequest object</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>BaseSuccessResponse</returns>
public BaseSuccessResponse SetTwoStepVerificatiion(TwoStepVerificationRequest twoStepVerificationRequest, CancellationToken cancellationToken = default)
/// <summary>
/// Send Authentication Template Message
/// </summary>
/// <param name="authenticationTemplateMessageRequest">AuthenticationTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
public async Task<WhatsAppResponse> SendAuthenticationMessageTemplateAsync(AuthenticationTemplateMessageRequest authenticationTemplateMessageRequest, 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>(authenticationTemplateMessageRequest, formattedWhatsAppEndpoint, cancellationToken);
}

/// <summary>
/// Send Authentication Template Message
/// </summary>
/// <param name="authenticationTemplateMessageRequest">AuthenticationTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
public WhatsAppResponse SendAuthenticationMessageTemplate(AuthenticationTemplateMessageRequest authenticationTemplateMessageRequest, 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>(authenticationTemplateMessageRequest, formattedWhatsAppEndpoint, cancellationToken).GetAwaiter().GetResult();
}

/// <summary>
/// Send MPM Template Message
/// </summary>
/// <param name="multiProductTemplateMessageRequest">MultiProductTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
public async Task<WhatsAppResponse> SendMPMTemplateAsync(MultiProductTemplateMessageRequest multiProductTemplateMessageRequest, 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>(multiProductTemplateMessageRequest, formattedWhatsAppEndpoint, cancellationToken);
}

/// <summary>
/// Send MPM Template Message
/// </summary>
/// <param name="multiProductTemplateMessageRequest">MultiProductTemplateMessageRequest object</param>
/// <param name="cloudApiConfig">Custom WhatsAppBusinessCloudApiConfig</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>WhatsAppResponse</returns>
public WhatsAppResponse SendMPMTemplate(MultiProductTemplateMessageRequest multiProductTemplateMessageRequest, 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>(multiProductTemplateMessageRequest, 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.
/// </summary>
/// <param name="twoStepVerificationRequest">TwoStepVerificationRequest object</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>BaseSuccessResponse</returns>
public BaseSuccessResponse SetTwoStepVerificatiion(TwoStepVerificationRequest twoStepVerificationRequest, CancellationToken cancellationToken = default)
{
var formattedWhatsAppEndpoint = WhatsAppBusinessRequestEndpoint.SetTwoFactor.Replace("{{Phone-Number-ID}}", _whatsAppConfig.WhatsAppBusinessPhoneNumberId);
return WhatsAppBusinessPostAsync<BaseSuccessResponse>(twoStepVerificationRequest, formattedWhatsAppEndpoint, cancellationToken).GetAwaiter().GetResult();
Expand Down Expand Up @@ -2379,5 +2451,5 @@ await response.Content.ReadAsStreamAsync().ContinueWith((Task<Stream> stream) =>
}
return result;
}
}
}
}
6 changes: 3 additions & 3 deletions WhatsappBusiness.CloudApi/WhatsappBusiness.CloudApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@
<RepositoryUrl>https://github.com/gabrieldwight/Whatsapp-Business-Cloud-Api-Net</RepositoryUrl>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
<Version>1.0.17</Version>
<Version>1.0.18</Version>
</PropertyGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' or '$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Http" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="6.0.16" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="6.0.18" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net7.0' or '$(TargetFramework)' == 'netstandard2.1'">
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="7.0.5" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="7.0.7" />
</ItemGroup>

<ItemGroup>
Expand Down

0 comments on commit 4b01e2d

Please sign in to comment.