Aracılığıyla paylaş


API (HMAC) ile OptOut API istekleri gönderme

Önemli

Azure İletişim Hizmetleri'nin bu özelliği şu anda önizlemede. Önizlemedeki özellikler genel kullanıma açıktır ve tüm yeni ve mevcut Microsoft müşterileri tarafından kullanılabilir.

Önizleme API'ları ve SDK'lar, hizmet düzeyi anlaşması olmadan sunulmaktadır. Üretim iş yükleri için onları kullanmamanızı öneriyoruz. Bazı özellikler desteklenmeyebilir veya özellikler kısıtlanmış olabilir.

Daha fazla bilgi için bkz. Microsoft Azure Önizlemeleri için Ek Kullanım Koşulları.

Bu makalede, karma ileti kimlik doğrulama kodu (HMAC) tabanlı kimlik doğrulaması kullanarak Azure İletişim Hizmetleri kaynağınız için geri çevirme yönetimini etkinleştirme açıklanmaktadır.

Hızlı Başlangıç: API ile OptOut API istekleri gönderme (HMAC)

Geri Çevirme API'si isteği göndermek, Azure İletişim Hizmetleri Postman Öğreticisi'nde açıklandığı gibi, OptOut Actions (Ekle, Kaldır veya Denetle) ve gövdesi için uç nokta farkı olan SMS'e benzer. İstek gövdesi tüm eylemler için aynı yapıya sahipken yanıt içeriği biraz farklılık gösterir.

Uç Noktalar

Eylem Uç nokta
Ekle {{endpoint}}/sms/optouts:add?api-version=2024-12-10-preview
Kaldır {{endpoint}}/sms/optouts:remove?api-version=2024-12-10-preview
İşaretli {{endpoint}}/sms/optouts:check?api-version=2024-12-10-preview

Aşağıda farklı dillerde bazı örnekler verilmiştir.

Örnek isteği

İstek üst bilgileri

Üst bilgi Değer
İçerik Türü uygulama/json
x-ms-date Per, 10 Ağustos 2023 12:39:55 GMT
x-ms-içerik-sha256 JKUqoPANwVA55u/NOCsS0Awa4cYrKKNtBwUqoaqrob0=
Yetkilendirme HMAC-SHA256 SignedHeaders=x-ms-date; ev sahibi; x-ms-content-sha256&signature=IMbd3tE3nOgEkeUQGng6oQew5aEcrZJQqHkyq8qsbLg=

İstek içeriği

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

Örnek yanıt

Genel olarak, yanıt içeriği tüm eylemler için aynıdır ve alıcı başına başarıyı veya başarısızlığı HttpStatusCode içerir. Tek fark, bayrağını Check da döndüren eylemin olmasıdır isOptedOut .

Yanıt durumu

  • 200 Tamam

OptOut eylemi yanıt gövdesi ekleme

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

OptOut eylemi yanıt gövdesini kaldırma

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

OptOut eylemi yanıt gövdesini denetleme

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

Örnek kod

Aşağıdaki C# örnek kodunu uygulayarak Azure İletişim Hizmetleri SMS Geri Çevirme API'sini kullanmaya başlayın.

Önkoşullar

Geri Çevirme API'sini kullanmak için örnek kod

Bu örnek, program aracılığıyla geri çevirme girdileri eklemek, kaldırmak veya denetlemek için C# dilinde Geri Çevirme Yönetimi API'sinin nasıl kullanılacağını gösterir.

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);

Aşağıdaki JavaScript örnek kodunu kullanarak AZURE İLETIŞIM HIZMETLERI SMS Geri Çevirme API'sini kullanmaya başlayın.

Önkoşullar

  • Etkin aboneliği olan bir Azure hesabı. Ücretsiz hesap oluşturun.
  • Tarayıcı veya Node.js Etkin LTS ve Bakım LTS sürümleri (8.11.1 ve 10.14.1 önerilir).
  • Etkin bir İletişim Hizmetleri kaynağı ve bağlantı dizesi. Bkz. İletişim Hizmetleri kaynağı oluşturma.
  • SMS özellikli bir telefon numarası. Bkz . Telefon numarası alma.
  • CryptoJS , standart ve güvenli şifreleme algoritmalarının JavaScript uygulamalarıdır.

Geri Çevirme API'sini kullanmak için örnek kod

Bu örnek, program aracılığıyla geri çevirme girdileri eklemek, kaldırmak veya denetlemek için JavaScript'te Geri Çevirme Yönetimi API'sinin nasıl kullanılacağını gösterir.

<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);

Aşağıdaki Java örnek kodunu uygulayarak Azure İletişim Hizmetleri SMS Geri Çevirme API'sini kullanmaya başlayın.

Önkoşullar

Geri Çevirme API'sini kullanmak için örnek kod

Bu örnek, program aracılığıyla geri çevirme girdileri eklemek, kaldırmak veya denetlemek için Java'da Geri Çevirme Yönetimi API'sinin nasıl kullanılacağını gösterir.

// 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;
}

Sonraki adımlar

Bu hızlı başlangıçta, geri çevirme istekleri göndermeyi öğrendiniz.