Wyślij żądania API OptOut za pomocą API (HMAC)

Warning

Azure Communication Services wprowadza nowatorskie zmiany, a niektóre usługi są wycofywane. Dowiedz się więcej w przewodniku po zmianach emerytalnych i przełamowych.

Ważne

Ta funkcja usługi Azure Communication Services jest obecnie dostępna w wersji próbnej. Funkcje w wersji zapoznawczej są publicznie dostępne i mogą być używane przez wszystkich nowych i istniejących klientów firmy Microsoft.

API i zestawy SDK w wersji zapoznawczej są dostarczane bez umowy na poziomie usług. Zalecamy, aby nie używać ich do obciążeń produkcyjnych. Niektóre funkcje mogą nie być obsługiwane lub mogą być ograniczone.

Aby uzyskać więcej informacji, zobacz Warunki dodatkowe korzystania z testowych wersji Microsoft Azure.

W tym artykule opisano, jak włączyć zarządzanie rezygnacją z subskrypcji dla zasobu usługi Azure Communication Services przy użyciu uwierzytelniania opartego na kodzie uwierzytelniania wiadomości opartym na funkcji skrótu (HMAC).

Szybki start: wysyłanie żądań do interfejsu API OptOut przy użyciu interfejsu API (HMAC)

Wysyłanie żądania interfejsu API rezygnacji jest podobne do wiadomości SMS zgodnie z opisem w samouczku dotyczącym usługi Azure Communication Services Postman z różnicą punktów końcowych dla akcji optout (Dodawanie, usuwanie lub sprawdzanie) i treści. Treść żądania ma tę samą strukturę dla wszystkich akcji, a zawartość odpowiedzi nieco się różni.

Punkty końcowe

Akcja Punkt końcowy
Dodaj {{endpoint}}/sms/optouts:add?api-version=2024-12-10-preview
Usuń {{endpoint}}/sms/optouts:remove?api-version=2024-12-10-preview
Sprawdź {{endpoint}}/sms/optouts:check?api-version=2024-12-10-preview

Oto kilka przykładów w różnych językach.

Przykładowe żądanie

Nagłówki żądań

Nagłówek Wartość
Typ zawartości aplikacja/json
x-ms-date Czw, 10 sie 2023 12:39:55 GMT
x-ms-content-sha256 (x-ms-zawartość-sha256) JKUqoPANwVA55u/NOCsS0Awa4cYrKKNtBwUqoaqrob0=
Autoryzacja HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=IMbd3tE3nOgEkeUQGng6oQew5aEcrZJQqHkyq8qsbLg=

Treść żądania

{
    "from": "+15551234567",
    "recipients": [
        {
            "to": "+15550112233"
        },
        {
            "to": "+15550112234"
        }
    ]
}

Przykładowa odpowiedź

Ogólnie rzecz biorąc, zawartość odpowiedzi jest taka sama dla wszystkich operacji i zawiera informację o powodzeniu lub niepowodzeniu HttpStatusCode dla każdego odbiorcy. Jedyna różnica polega na tym, że akcja Check, która również zwraca flagę isOptedOut.

Stan odpowiedzi

  • 200 OK

Dodaj treść odpowiedzi akcji OptOut

{
    "value": [
        {
            "to": "+15550112233",
            "httpStatusCode": 200
        },
        {
            "to": "+15550112234",
            "httpStatusCode": 200
        }
    ]
}

Usuń treść odpowiedzi akcji „OptOut”

{
    "value": [
        {
            "to": "+15550112233",
            "httpStatusCode": 200
        },
        {
            "to": "+15550112234",
            "httpStatusCode": 200
        }
    ]
}

Sprawdź treść odpowiedzi akcji OptOut

{
    "value": [
        {
            "to": "+15550112233",
            "httpStatusCode": 200,
            "isOptedOut": true
        },
        {
            "to": "+15550112234",
            "httpStatusCode": 200,
            "isOptedOut": false
        }
    ]
}

Przykładowy kod

Rozpocznij pracę z interfejsem API rezygnacji z programu SMS usług Azure Communication Services, stosując następujący przykładowy kod w języku C#.

Wymagania wstępne

  • Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
  • Wersja zestawu .NET Core SDK musi być wyższa niż wersja 6 dla systemu operacyjnego.
  • Aktywny zasób usług komunikacyjnych i parametry połączenia. Zobacz Tworzenie zasobu usług komunikacyjnych.
  • Numer telefonu z obsługą wiadomości SMS. Zobacz Uzyskiwanie numeru telefonu.

Przykładowy kod do korzystania z interfejsu API rezygnacji

W tym przykładzie pokazano, jak programowo dodawać, usuwać lub sprawdzać wpisy rezygnacji za pomocą interfejsu API zarządzania rezygnacjami w języku C#.

using System.Globalization;
using System.Security.Cryptography;
using System.Text;

// Sample for Add action. Replace with Check or Remove as necessary.
async Task SendOptOutAdd(string acsResourceConnectionString, string payload)
{
    const string ApiPrivatePreviewVersion = "2024-12-10-preview";

    const string dateHeader = "x-ms-date";

    string accesskey = GetConnectionStringPart(acsResourceConnectionString, "accesskey");
    var endpointUri = new Uri(GetConnectionStringPart(acsResourceConnectionString, "endpoint"));

    using var httpClient = new HttpClient();
    httpClient.BaseAddress = endpointUri;

    string method = "POST";
    string baseAddress = httpClient.BaseAddress.ToString().TrimEnd('/');
    var requestUri = new Uri($"{baseAddress}/sms/optouts:add?api-version={ApiPrivatePreviewVersion }", UriKind.RelativeOrAbsolute);
    string hashedBody = ComputeSha256Hash(payload);
    string utcNowString = DateTimeOffset.UtcNow.ToString("r", CultureInfo.InvariantCulture);
    string stringToSign = $"{method}\n{requestUri.PathAndQuery}\n{utcNowString};{requestUri.Host};{hashedBody}";
    string signature = ComputeHmacSha256Hash(accesskey, stringToSign);
    string authHeader = $"HMAC-SHA256 SignedHeaders={dateHeader};host;x-ms-content-sha256&Signature={signature}";

    using HttpRequestMessage request = new();
    request.Headers.TryAddWithoutValidation(dateHeader, utcNowString);
    request.Headers.TryAddWithoutValidation("x-ms-content-sha256", hashedBody);
    request.Headers.TryAddWithoutValidation("Authorization", authHeader);
    request.RequestUri = requestUri;
    request.Method = new HttpMethod(method);
    request.Content = new StringContent(payload, Encoding.UTF8, "application/json");

    HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

    Console.WriteLine(response.StatusCode);
    Console.WriteLine(await response.Content.ReadAsStringAsync());
    Console.WriteLine(response.Headers.ToString());
}

string ComputeSha256Hash(string rawData)
{
    using SHA256 sha256Hash = SHA256.Create();
    byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
    return Convert.ToBase64String(bytes);
}

string ComputeHmacSha256Hash(string key, string rawData)
{
    using HMACSHA256 hmacSha256 = new HMACSHA256(Convert.FromBase64String(key));
    byte[] bytes = hmacSha256.ComputeHash(Encoding.ASCII.GetBytes(rawData));
    return Convert.ToBase64String(bytes);
}

string GetConnectionStringPart(string acsResourceConnectionString, string key)
{
    return acsResourceConnectionString.Split($"{key}=").Last().Split(';').First();
}

// Usage

const string ConnectionString = "endpoint=https://[CONTOSO].communication.azure.com/;accesskey=******";
var payload = System.Text.Json.JsonSerializer.Serialize(new
{
    from = "+15551234567", //replace with your allowed sender number
    recipients = new[] {
        new { to = "+15550112233" } //replace with your recipient
    },
});

await SendOptOutAdd(ConnectionString, payload);

Rozpocznij pracę z interfejsem API rezygnacji z programu SMS usług Azure Communication Services, korzystając z następującego przykładowego kodu JavaScript.

Wymagania wstępne

  • Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
  • Zalecane są wersje Przeglądarki lub Node.js Active LTS i Maintenance LTS (zalecane są wersje 8.11.1 i 10.14.1).
  • Aktywny zasób usług komunikacyjnych i parametry połączenia. Zobacz Tworzenie zasobu usług komunikacyjnych.
  • Numer telefonu z obsługą wiadomości SMS. Zobacz Uzyskiwanie numeru telefonu.
  • CryptoJS to implementacje standardowych i bezpiecznych algorytmów kryptograficznych w języku JavaScript.

Przykładowy kod do korzystania z interfejsu API rezygnacji

W tym przykładzie pokazano, jak programowo dodawać, usuwać lub sprawdzać wpisy rezygnacji za pomocą interfejsu API zarządzania rezygnacjami w języku JavaScript.

<script src="Scripts/CryptoJS/sha256-min.js" type="text/javascript"></script>
<script src="Scripts/CryptoJS/hmac-sha256.js" type="text/javascript"></script>
<script src="Scripts/CryptoJS/enc-base64-min.js" type="text/javascript"></script>

const ConnectionString = "endpoint=https://[CONTOSO].communication.azure.com/;accesskey=******";

// Sample for Add action. Replace with Check or Remove as necessary.
function sendOptOutAdd(acsResourceConnectionString, payload, apiVersion = "2024-12-10-preview")
{
    try
    {
        var acsRCS = acsResourceConnectionString
            .split(";")
            .map(i =>
            {
                var p = i.indexOf("=");
                return [i.substr(0, p), i.substr(p + 1)];
            })
            .reduce((a, i) => ({ ...a, [i[0]]: i[1] }), {});
        var uri = `${trimEnd(acsRCS.endpoint, "/")}/sms/optouts:add?api-version=${apiVersion}`;
        var url = new URL(uri);
        var method = "POST";
        var utcNow = new Date().toUTCString();
        var bodyJson = JSON.stringify(payload);
        var hashedBody = CryptoJS.SHA256(bodyJson).toString(CryptoJS.enc.Base64);
        var stringToSign = `${method}\n${url.pathname}${url.search}\n${utcNow};${url.host};${hashedBody}`;
        var signature = CryptoJS.HmacSHA256(stringToSign, CryptoJS.enc.Base64.parse(acsRCS.accesskey)).toString(CryptoJS.enc.Base64);

        fetch(uri, {
            method: method,
            headers: {
                "content-type": "application/json",
                "x-ms-date": utcNow,
                "x-ms-content-sha256": hashedBody,
                Authorization: `HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=${signature}`
            },
            body: bodyJson
        })
        .then(response => response.json())
        .then(console.warn)
        .catch(console.error);
    }
    catch (ex)
    {
        console.error(ex);
    }
}

function trimEnd(s, c)
{
    while (s.slice(-1) == c)
        s = s.slice(0, -1);
    return s;
}

// Usage

var payload = {
    from: "+15551234567",
    recipients: [
        { to: "+15550112233" }
    ],
};

sendOptOutAdd(ConnectionString, payload);

Rozpocznij pracę z interfejsem API rezygnacji z programu SMS usług Azure Communication Services, stosując następujący przykładowy kod Java.

Wymagania wstępne

  • Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
  • Zestaw programistyczny Java (JDK) w wersji 8 lub nowszy.
  • Aktywny zasób usług komunikacyjnych i parametry połączenia. Zobacz Tworzenie zasobu usług komunikacyjnych.
  • Numer telefonu z obsługą wiadomości SMS. Zobacz Uzyskiwanie numeru telefonu.

Przykładowy kod do korzystania z interfejsu API rezygnacji

W tym przykładzie pokazano, jak programowo dodawać, usuwać lub sprawdzać wpisy rezygnacji za pomocą interfejsu API zarządzania rezygnacjami w języku Java.

// Sample for Add action. Replace with Check or Remove as necessary.
public class App
{
    public static void main(String[] args) throws Exception
    {
        String connectionString = "endpoint=https://[CONTOSO].communication.azure.com/;accesskey=******";

        OptOutRequest payload = new OptOutRequest();
        payload.from = "+15551234567";
        payload.recipients = new ArrayList<Recipient>();
        payload.recipients.add(new Recipient("+15550112233"));

        SendOptOut(connectionString, payload);
    }

    public static void SendOptOutAdd(String connectionString, OptOutRequest payload) throws Exception
    {
        String apiVersion = "2024-12-10-preview";

        String[] arrOfStr = connectionString.split(";");
        String endpoint = arrOfStr[0].split("=")[1];
        String accessKey = arrOfStr[1].split("=")[1];
        String body = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT).writeValueAsString(payload);
        String dateHeaderName = "x-ms-date";
        DateTimeFormatter headerDateFormat = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH).withZone(ZoneId.of("GMT"));
        String dateHeader = headerDateFormat.format(Instant.now());
        String verb = "POST";
        URI uri = URI.create(endpoint + "sms/optouts:add?api-version==" + apiVersion);
        String hostName = uri.getHost();
        String pathAndQuery = uri.getPath() + "?" + uri.getQuery();
        String encodedHash = Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-256").digest(body.getBytes(StandardCharsets.UTF_8)));
        String stringToSign = verb + '\n' + pathAndQuery + '\n' + dateHeader + ';' + hostName + ';' + encodedHash;
        Mac mac = Mac.getInstance("HmacSHA256");
        SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode(accessKey.getBytes()), "HmacSHA256"); 
        mac.init(secretKeySpec);
        String signature = Base64.getEncoder().encodeToString(mac.doFinal(stringToSign.getBytes()));
        String authHeader = "HMAC-SHA256 SignedHeaders=" + dateHeaderName + ";host;x-ms-content-sha256&Signature=" + signature;

        HttpClient client = HttpClients.custom().build();
        HttpUriRequest request = RequestBuilder
            .post(uri)
            .setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
            .setHeader(dateHeaderName, dateHeader)
            .setHeader("x-ms-content-sha256", encodedHash)
            .setHeader("Authorization", authHeader)
            .setEntity(new StringEntity(body, "UTF-8"))
            .build();
        HttpResponse r = client.execute(request);
        HttpEntity entity = r.getEntity();
    }
}

public class OptOutRequest
{
    public String from;
    public ArrayList<Recipient> recipients;
}

public class Recipient
{
    public String to;
}

Następne kroki

W tym przewodniku Szybki start dowiesz się, jak wysyłać żądania rezygnacji.