請求簽名
更新時間 2024-10-10 15:36:37
最近更新時間: 2024-10-10 15:36:37
分享文章
對于每一次HTTP或HTTPS協議請求,我們會根據訪問中的簽名信息驗證訪問請求者身份。具體由使用AccessKey和SecurityKey加密驗證實現。其中AccessKey是訪問者身份,SecurityKey是加密簽名字符串和服務器端驗證簽名字符串的密鑰,必須嚴格保密謹防泄露。
步驟一:獲取AccessKey和SecurityKey
步驟二:構造時間戳
- 構造一個eop-date的時間戳,格式為yyyymmddTHHMMSSZ,簡單來說就是“年月日T時分秒Z”。
步驟三:構造請求流水號
- 構造一個ctyun-eop-request-id的流水號,最好為每次請求不同,可以簡單的使用UUID。
步驟四:構造待簽名字符串
- 構造進行簽名的Header:以 header_name:header_value來一個一個通過"\n"拼接起來,強制要求ctyun-eop-request-id和eop-date這個頭作為Header中的一部分。將待簽名算法的Header需要進行排序(header_name以英文字母的順序來排序),將排序后得到的列表進行遍歷組裝成待簽名的header。
- 構造待簽名的Query: query以&作為拼接,key和value以"="連接,排序規則使用26個英文字母的順序來排序,Query參數全部都需要進行簽名。
- 構造待簽名的Body: 傳待發送的body參數進行sha256摘要,對摘要出來的結果轉十六進制。
- 將待簽名的Header、Query、Body通過"\n"進行連接。
步驟五:構造簽名
- 先將SecurityKey作為密鑰,eop-date作為數據,根據hmacsha256加密算法算出ktime。
- 將ktime作為密鑰,AccessKey作為數據,根據hmacsha256加密算法算出kAk。
- 將kAk作為密鑰,eop-date的年月日值(前8位)作為數據,根據hmacsha256加密算法算出kdate。
- 將kdate作為密鑰,步驟二的待簽名字符串作為數據,根據hmacsha256加密算法算法簽名并轉化為BASE64編碼算出signature。
步驟六:構造請求頭
- 將eop-date作為Key,步驟二的結果作為Value加入http請求頭中。
- 將ctyun-eop-request-id作為Key,步驟三的結果作為Value加入http請求頭中。
- 將Eop-Authorization作為Key,通過字符串拼接的方式將AK、Header、Signature通過空格進行拼接,并將結果作為Value加入http請求頭中。
注意
當您通過接口發送短信之后,接口服務會及時響應并返回成功的標識,但這僅僅代表平臺已經成功接收到您的發送請求了。
接下來平臺會將請求轉發給電信運營商,因為發送短信是異步進行的,還需要電信運營商的網絡以及接收消息的手機終端支持。
如果您想第一時間知道消息的最終發送狀態,故需要您在控制臺的消息配置———事件回調配置中增加狀態報告通知的URL,以便平臺在接收到運營商的反饋消息時通知您消息的最終發送結果。
JAVA示例
完整的Java簽名Demo代碼:
package com.example;
/**
* Hello world!
*
*/
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.alibaba.fastjson.*;
public class App {
public static void main(String[] args) throws Exception {
//請參考幫助文檔填寫以下內容
Map<String, Object> params = new HashMap<>();
//固定參數
params.put("action", "SendSms");
//請填寫您在控制臺上申請并通過的短信簽名。
params.put("signName", "");
//請填寫接收短信的目標手機號,多個手機號使用英文逗號分開
params.put("phoneNumber", "");
//請填寫您在控制臺上申請并通過的短信模板,此模板為測試專用模板,可直接進行測試
params.put("templateCode", "SMS64124870510");
//請填寫短信模板對應的模板參數和值。此值為測試模板的變量及參數,可直接使用
params.put("templateParam", "{\"code\":\"123456\"}");
params.put("extendCode", "");// 選填
params.put("sessionId",""); // 選填
String body = JSONObject.toJSONString(params);
// SETUP1:獲取AccessKey和SecurityKey
String accessKey = ""; // 填寫控制臺->個人中心->安全設置->查看->AccessKey
String securityKey = "";// 填寫控制臺->個人中心->安全設置->查看->SecurityKey
// SETUP2:構造時間戳
SimpleDateFormat TIME_FORMATTER = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyyMMdd");
Date nowdate = new Date();
String singerDate = TIME_FORMATTER.format(nowdate);
String singerDd = DATE_FORMATTER.format(nowdate);
System.out.println("singerDate:" + singerDate);
System.out.println("singerDd:" + singerDd);
// SETUP3:構造請求流水號
String uuId = UUID.randomUUID().toString();
System.out.println("uuId:" + uuId);
// SETUP4:構造待簽名字符串
String CampmocalHeader = String.format("ctyun-eop-request-id:%s\neop-date:%s\n", uuId, singerDate);// uuid去掉this
// header的key按照26字母進行排序, 以&作為連接符連起來
URL url = new URL("//sms-global.ctapi.daliqc.cn/sms/api/v1");
String query = url.getQuery();
String afterQuery = "";
if (query != null) {
String param[] = query.split("&");
Arrays.sort(param);
for (String str : param) {
if (afterQuery.length() < 1)
afterQuery = afterQuery + str;
else
afterQuery = afterQuery + "&" + str;
}
}
// String body ="";
String calculateContentHash = getSHA256(body); // 報文原封不動進行sha256摘要
String sigtureStr = CampmocalHeader + "\n" + afterQuery + "\n" + calculateContentHash;
System.out.println("calculateContentHash:" + calculateContentHash);
System.out.println("sigtureStr:" + sigtureStr);
// SETUP5:構造簽名
byte[] ktime = HmacSHA256(singerDate.getBytes(), securityKey.getBytes());
byte[] kAk = HmacSHA256(accessKey.getBytes(), ktime);
byte[] kdate = HmacSHA256(singerDd.getBytes(), kAk);
String Signature = Base64.getEncoder().encodeToString(HmacSHA256(sigtureStr.getBytes("UTF-8"), kdate));
// SETUP6:構造請求頭
HttpPost httpPost = new HttpPost(String.valueOf(url));
httpPost.setHeader("Content-Type", "application/json;charset=UTF-8");
httpPost.setHeader("ctyun-eop-request-id", uuId);
httpPost.setHeader("Eop-date", singerDate);
String signHeader = String.format("%s Headers=ctyun-eop-request-id;eop-date Signature=%s", accessKey,
Signature);
httpPost.setHeader("Eop-Authorization", signHeader);
System.out.println("Signature" + Signature);
System.out.println("signHeader" + signHeader);
httpPost.setEntity(new StringEntity(body, ContentType.create("application/json", "utf-8")));
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(httpPost)) {
String string = EntityUtils.toString(response.getEntity(), "utf-8");
System.out.println("返回結果:" + string);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private static String toHex(byte[] data) {
StringBuilder sb = new StringBuilder(data.length * 2);
byte[] var2 = data;
int var3 = data.length;
for (int var4 = 0; var4 < var3; ++var4) {
byte b = var2[var4];
String hex = Integer.toHexString(b);
if (hex.length() == 1) {
sb.append("0");
} else if (hex.length() == 8) {
hex = hex.substring(6);
}
sb.append(hex);
}
return sb.toString().toLowerCase(Locale.getDefault());
}
private static String getSHA256(String text) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
// byte[] a = text.getBytes(StandardCharsets.UTF_8);
md.update(text.getBytes(StandardCharsets.UTF_8));
return toHex(md.digest());
} catch (NoSuchAlgorithmException var3) {
return null;
}
}
private static byte[] HmacSHA256(byte[] data, byte[] key) throws Exception {
try {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(key, "HmacSHA256"));
return mac.doFinal(data);
} catch (Exception e) {
return null;
}
}
}
Golang示例
完整的golang簽名Demo代碼:
package main
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"
"time"
"github.com/google/uuid"
"github.com/valyala/fasthttp"
)
const url = "//sms-global.ctapi.daliqc.cn/sms/api/v1"
func main() {
//填寫控制臺->個人中心->安全設置->查看->AccessKey->替代ak
//填寫控制臺->個人中心->安全設置->查看->SecurityKey->替代sk
c := NewClient("ak", "sk")
//請參考幫助文檔填寫以下內容
e := SendSmsPara{
Action: "SendSms", //固定參數
SignName: "", //請填寫您在控制臺上申請并通過的短信簽名。
PhoneNumber: "", //請填寫接收短信的目標手機號,多個手機號使用英文逗號分開
TemplateCode: "SMS64124870510", //請填寫您在控制臺上申請并通過的短信模板,此模板為測試專用模板,可直接進行測試
TemplateParam: "{\"code\":\"123456\"}", //請填寫短信模板對應的模板參數和值。此值為測試模板的變量及參數,可直接使用
ExtendCode: "", //擴展碼,選填
SessionId: "", //選填
}
for i := 0; i < 1; i++ {
c.SendSms(e) //發送短信接口
}
}
type SendSmsPara struct {
Action string `json:"action"`
PhoneNumber string `json:"phoneNumber"`
SignName string `json:"signName"`
TemplateCode string `json:"templateCode"`
TemplateParam string `json:"templateParam"`
ExtendCode string `json:"extendCode"`
SessionId string `json:"sessionId"`
}
type client struct {
ak, sk string
}
// 創建client對象
func NewClient(ak string, sk string) *client {
c := &client{
ak: ak,
sk: sk,
}
return c
}
// 發送短信
func (c *client) SendSms(e SendSmsPara) {
body, err := json.Marshal(e)
if err != nil {
fmt.Println("Entity convers to json failed!")
return
}
b, err := c.EopPost(body)
if err != nil {
fmt.Print("Request Error:", err.Error())
return
}
fmt.Println(string(b))
}
func (c *client) EopPost(body []byte) ([]byte, error) {
client := fasthttp.Client{}
req := fasthttp.AcquireRequest()
resp := fasthttp.AcquireResponse()
defer func() {
fasthttp.ReleaseResponse(resp)
fasthttp.ReleaseRequest(req)
}()
req.Header.SetContentType("application/json")
req.Header.SetMethod("POST")
// SETUP1:獲取AccessKey和SecurityKey
accessKey := c.ak
securityKey := c.sk
// SETUP2:構造時間戳
eop_date := time.Now().Format("20060102T150405Z")
// SETUP3:構造請求流水號
uuid := uuid.New().String()
// SETUP4:構造待簽名字符串
req.SetRequestURI(url)
args := req.URI().QueryArgs()
args.Sort(bytes.Compare)
headerStr := "ctyun-eop-request-id:" + uuid + "\n" + "eop-date:" + eop_date + "\n"
queryStr := args.String()
calculateContentHash := getSha256(body)
signStr := headerStr + "\n" + queryStr + "\n" + calculateContentHash
// SETUP5:構造簽名
Ktime := hmacSha256(eop_date, securityKey)
Kak := hmacSha256(accessKey, string(Ktime))
Kdate := hmacSha256(eop_date[:8], string(Kak))
signatureDate := hmacSha256(signStr, string(Kdate))
signature := base64.StdEncoding.EncodeToString(signatureDate)
// SETUP6:構造請求頭
req.Header.Add("Eop-date", eop_date)
req.Header.Add("ctyun-eop-request-id", uuid)
signatureHeader := accessKey + " Headers=ctyun-eop-request-id;eop-date Signature=" + signature
req.Header.Add("Eop-Authorization", signatureHeader)
req.SetBody(body)
if err := client.Do(req, resp); err != nil {
return nil, err
}
b := resp.Body()
return b, nil
}
func hmacSha256(data, secret string) []byte {
h := hmac.New(sha256.New, []byte(secret))
h.Write([]byte(data))
return h.Sum(nil)
}
func getSha256(data []byte) string {
hash := sha256.New()
hash.Write(data)
bytes := hash.Sum(nil)
return hex.EncodeToString(bytes)
}
nodejs示例
完整的nodejs簽名Demo代碼:
import axios from 'axios'
import dayjs from 'dayjs'
import * as crypto from 'crypto'
import * as querystring from 'querystring'
// shar256算法
const sha256 = data => crypto.createHash('SHA256').update(data).digest('hex')
// hmacsha256算法
const hmacsha256 = (data, key) => crypto.createHmac('sha256', key).update(data).digest('hex')
// SETUP1:獲取AccessKey和SecurityKey
const accessKey = ''
const securityKey = ''
const body = { foo: 'bar' }
// SETUP2:構造時間戳
const timestamp = dayjs().format('YYYYMMDDTHHmmss') + 'Z'
// SETUP3:構造請求流水號
const requestId = crypto.randomUUID()
// SETUP4:構造待簽名字符串
const headerStr = `ctyun-eop-request-id:${requestId}\neop-date:${timestamp}\n\n`
const calculateContentHash = sha256(JSON.stringify(body))
const rawString = `${headerStr}\n${calculateContentHash}`
// SETUP5:構造簽名
const signTime = hmacsha256(timestamp, securityKey)
const signAK = hmacsha256(accessKey, Buffer.from(signTime, 'hex'))
const signDate = hmacsha256(timestamp.slice(0, 8), Buffer.from(signAK, 'hex'))
const sign = hmacsha256(rawString, Buffer.from(signDate, 'hex'))
const signature = Buffer.from(sign, 'hex').toString('base64')
// SETUP:6 構造請求頭
const signatureHeader = `${accessKey} Headers=ctyun-eop-request-id;eop-date Signature=${signature}`
const headers = {
'Content-Type': 'application/json',
'eop-date': timestamp,
'Eop-Authorization': signatureHeader,
'ctyun-eop-request-id': requestId,
}
// SETUP:7 構造請求
axios
.post('//sms-global.ctapi.daliqc.cn/sms/api/v1', body, {
headers,
})
.then(res => {
console.log(res.data)
})
.catch(err => {
console.log(err)
})
C#示例
完整的C#簽名Demo代碼:
using Newtonsoft.Json;
using System;
using System.Security.Cryptography;
using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
public class Program
{
private static byte[] HmacSHA256(byte[] data, byte[] signKey)
{
string signRet = string.Empty;
using HMACSHA256 mac = new(signKey);
byte[] hash = mac.ComputeHash(data);
return hash;
}
private static string Sha256(string data)
{
byte[] bytes = Encoding.UTF8.GetBytes(data);
var hash = SHA256.HashData(bytes);
var strBuilder = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
strBuilder.Append(hash[i].ToString("x2"));
}
return strBuilder.ToString();
}
private const string sendMsgAPIUrl = "//sms-global.ctapi.daliqc.cn/sms/api/v2";
public static async Task Main()
{
string AccessKey = ""; //填寫控制臺->個人中心->安全設置->查看->AccessKey
string SecurityKey = ""; //填寫控制臺->個人中心->安全設置->查看->SecurityKey
var currentTime = DateTime.Now;
var eopDate = currentTime.ToString("yyyyMMddTHHmmssZ");
var ctyuneoprequestid = Guid.NewGuid().ToString();
#region 構造待簽名字符串
//請參考幫助文檔填寫以下內容
var sortDic = new SortedDictionary<string, string>
{
{ "action", "SendSms" }, //固定參數
{ "phoneNumber", "" }, //請填寫接收短信的目標手機號,多個手機號使用英文逗號分開
{ "signName", "天翼云測試" }, //請填寫您在控制臺上申請并通過的短信簽名。
{ "templateCode", "SMS64124870510" }, //請填寫您在控制臺上申請并通過的短信模板,此模板為測試專用模板,可直接進行測試
{ "templateParam", "{\"code\":\"123456\"}" }, //請填寫短信模板對應的模板參數和值。此值為測試模板的變量及參數,可直接使用
{ "extendCode", "" }, //可選,非必填
{ "sessionId", "" } //可選,非必填
};
var header = $"ctyun-eop-request-id:{ctyuneoprequestid}\neop-date:{eopDate}\n";
var bodyJson = JsonConvert.SerializeObject(sortDic);
var body = Sha256(bodyJson);
var strS = $"{header}\n\n{body}";
#endregion
#region 構造簽名
var ktime = HmacSHA256(Encoding.UTF8.GetBytes(eopDate), Encoding.UTF8.GetBytes(SecurityKey));
var kAk = HmacSHA256(Encoding.UTF8.GetBytes(AccessKey), ktime);
var kdate = HmacSHA256(Encoding.UTF8.GetBytes(currentTime.ToString("yyyyMMdd")), kAk);
var signature = Convert.ToBase64String(HmacSHA256(Encoding.UTF8.GetBytes(strS), kdate));
#endregion
#region 構造請求頭
var eopAuthorization = $"{AccessKey} Headers=ctyun-eop-request-id;eop-date Signature={signature}";
#endregion
// http post請求
try
{
var client = new HttpClient();
client.DefaultRequestHeaders.Add("eop-date", eopDate);
client.DefaultRequestHeaders.Add("eop-Authorization", eopAuthorization);
client.DefaultRequestHeaders.Add("ctyun-eop-request-id", ctyuneoprequestid);
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
var data = new StringContent(bodyJson, Encoding.UTF8, "application/json");
var response = await client.PostAsync(sendMsgAPIUrl, data);
string result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
php示例
完整的php簽名Demo代碼:
<?php
class Cty
{
public function com_create_guid() {
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
mt_rand( 0, 0xffff ),
mt_rand( 0, 0x0fff ) | 0x4000,
mt_rand( 0, 0x3fff ) | 0x8000,
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
);
}
public function ctyun($SecurityKey,$accessKey){
date_default_timezone_set('Asia/Shanghai');
$uuid=$this->com_create_guid();
$url='//sms-global.ctapi.daliqc.cn/sms/api/v1';
$time=date('Ymd', time()).'T'.date('His').'Z';
$timeDate=substr($time,0,8);
//****需要修改****
//請參考幫助文檔填寫以下內容
$body = json_encode(array(
'action'=>'SendSms', //固定參數
'phoneNumber'=>'',//請填寫接收短信的目標手機號,多個手機號使用英文逗號分開
'signName'=>'天翼云測試',//請填寫您在控制臺上申請并通過的短信簽名。
'templateCode'=>'SMS64124870510',//請填寫您在控制臺上申請并通過的短信模板,此模板為測試專用模板,可直接進行測試
'templateParam'=>'{"code":"1111"}'//請填寫短信模板對應的模板參數和值。此值為測試模板的變量及參數,可直接使用
));
$postFields = $body;
$body=bin2hex(hash("sha256", $body, true));
$query='';
$strsignature="ctyun-eop-request-id:".$uuid."\n"."eop-date:".$time."\n"."\n".$query."\n".$body;
$Ktime=$this->en($time,$SecurityKey);
$kAk=$this->en($accessKey,$Ktime);
$kdate=$this->en($timeDate,$kAk);
$signature=base64_encode(($this->en(utf8_encode($strsignature),$kdate)));
$header=array(
'Content-Type: application/json',
'ctyun-eop-request-id:'.$uuid,
'Eop-Authorization:'.$accessKey.' Headers=ctyun-eop-request-id;'.'eop-date Signature='.$signature,
'eop-date:'.$time,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳過證書檢查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 從證書中檢查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postFields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//header請求。如不需要可以去掉
$response = curl_exec($ch);
$response=json_decode($response,true);
// curl_close($ch);
return $response;
}
public function en($str,$pass){
$ret=(hash_hmac("sha256",($str) , ($pass), true));
return $ret;
}
}
$cty= new Cty();
//****需要修改****
//填寫控制臺->個人中心->安全設置->查看->AccessKey
//填寫控制臺->個人中心->安全設置->查看->SecurityKey
$res=$cty->ctyun('securityKey','accessKey');
print_r([$res]);
Python示例
完整的Python簽名Demo代碼:
# -*- coding: utf8 -*-
import requests
import json
import hashlib
import base64
import hmac
import datetime
import uuid
METHOD_GET = 'GET'
METHOD_POST = 'POST'
#1.請填寫您的AK,SK,請注意保密
AK = '' # 云通信控制臺-》個人中心-》安全設置-》用戶AccessKey,點擊查看將AccessKey填入AK,
SK = '' # 云通信控制臺-》個人中心-》安全設置-》用戶AccessKey,點擊查看將SecurityKey填入SK,
#2.第二步請看文檔末尾
def hmac_sha256(secret, data):
secret = bytearray(secret)
data = bytearray(data)
return hmac.new(secret, data, digestmod=hashlib.sha256).digest()
def base64_of_hmac(data):
return base64.b64encode(data)
def get_request_uuid():
return str(uuid.uuid1())
def get_sorted_str(data):
"""
鑒權用的參數整理
:param data: dict 需要整理的參數
:return: str
"""
sorted_data = sorted(data.items(), key=lambda item: item[0])
str_list = map(lambda x, y: '%s=%s' % (x, y), sorted_data)
return '&'.join(str_list)
def build_sign(query_params, body_params, eop_date, request_uuid):
"""
計算鑒權字段
:param query_params: dict get請求中的參數
:param body_params: dict post請求中的參數
:param eop_date: str 請求時間,格式為:'%Y%m%dT%H%M%SZ'
:return: str
"""
body_str = json.dumps(body_params) if body_params else ''
body_digest = hashlib.sha256(body_str.encode('utf-8')).hexdigest()
# 請求頭中必要的兩個參數
header_str = 'ctyun-eop-request-id:%s\neop-date:%s\n' % (
request_uuid, eop_date)
# url中的參數,或get參數
# query_str = get_sorted_str(query_params)
signature_str = '%s\n%s\n%s' % (header_str, "", body_digest)
print_log(repr('signature_str is: %s' % signature_str))
sign_date = eop_date.split('T')[0]
# 計算鑒權密鑰
k_time = hmac_sha256(SK.encode(), eop_date.encode())
k_ak = hmac_sha256(k_time, AK.encode())
k_date = hmac_sha256(k_ak, sign_date.encode())
signature_base64 = base64_of_hmac(
hmac_sha256(k_date, signature_str.encode())).decode()
# 構建請求頭的鑒權字段值
sign_header = '%s Headers=ctyun-eop-request-id;eop-date Signature=%s' % (
AK, signature_base64)
return sign_header
def get_sign_headers(query_params, body):
"""
獲取鑒權用的請求頭參數
:param query_params: dict get請求中的參數
:param body: dict post請求中的參數
:return:
"""
now = datetime.datetime.now()
eop_date = datetime.datetime.strftime(now, '%Y%m%dT%H%M%SZ')
request_uuid = get_request_uuid()
headers = { # 三個鑒權用的參數
'eop-date': eop_date,
'ctyun-eop-request-id': request_uuid,
'Eop-Authorization': build_sign(query_params="", body_params=body, eop_date=eop_date, request_uuid=request_uuid),
# 'Eop-Authorization': 'abc',
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82"
}
return headers
def get(url, params=None, header_params=None):
return execute(url, method=METHOD_GET, params=params, header_params=header_params)
def post(url, params=None, header_params=None):
return execute(url, method=METHOD_POST, params=params, header_params=header_params)
def execute(url, method, params=None, header_params=None):
params = params or {}
header_params = header_params or {}
query_params, body = (params, {}) if method == METHOD_GET else ({}, params)
headers = get_sign_headers(query_params, body)
headers.update(header_params)
print_log(u'url: %s' % url)
print_log(u'請求方式: %s' % method)
print_log(u'請求頭: %s' % headers)
print_log(u'請求參數: %s' % params)
if method == METHOD_GET:
res = requests.get(url, params=params, headers=headers, verify=False)
else:
if params:
res = requests.post(
url, json=params, headers=headers, verify=False)
else:
res = requests.post(
url, data=params, headers=headers, verify=False)
print_log(u'返回狀態碼: %s' % res.status_code)
print_log(u'返回: %s' % res.text)
return res
def print_log(log_info):
now = datetime.datetime.now()
log_info = u'[%s]: %s' % (str(now), log_info)
print(log_info)
#2.請參考幫助文檔,填入以下參數:
#//www.daliqc.cn/document/10020426/10021544
params = {
'action':"SendSms", #以發送短信為例
'signName':'',#請傳入您在控制臺已經申請并通過的 短信簽名 例如'云通信',該簽名只做示例不可用。
'phoneNumber':'',#請傳入用來接收短信的手機號,多個手機號請用 英文逗號 分隔
'templateCode':'SMS64124870510',#請傳入您在控制臺已經申請并通過的 短信模板,SMS64124870510為測試專用無需申請,可直接使用。
'templateParam':'{\"code\":\"123456\"}',#請傳入短信模板的參數,左側數據為冊數模板的參數,可直接使用
#'extendCode':
#'sessionId':
}
post('//sms-global.ctapi.daliqc.cn/sms/api/v1',params=params)