请求签名 步骤五:构造签名 1. 先将SecurityKey作为密钥,eopdate作为数据,根据hmacsha256加密算法算出ktime。 2. 将ktime作为密钥,AccessKey作为数据,根据hmacsha256加密算法算出kAk。 3. 将kAk作为密钥,eopdate的年月日值(前8位)作为数据,根据hmacsha256加密算法算出kdate。 4. 将kdate作为密钥,步骤二的待签名字符串作为数据,根据hmacsha256加密算法算法签名并转化为BASE64编码算出signature。 步骤六:构造请求头 1. 将eopdate作为Key,步骤二的结果作为Value加入http请求头中。 2. 将ctyuneoprequestid作为Key,步骤三的结果作为Value加入http请求头中。 3. 将EopAuthorization作为Key,通过字符串拼接的方式将AK、Header、Signature通过空格进行拼接,并将结果作为Value加入http请求头中。 注意 1. 当您通过接口发送短信之后,接口服务会及时响应并返回成功的标识,但这仅仅代表平台已经成功接收到您的发送请求了。 2. 接下来平台会将请求转发给电信运营商,因为发送短信是异步进行的,还需要电信运营商的网络以及接收消息的手机终端支持。 3. 如果您想第一时间知道消息的最终发送状态,故需要您在控制台的消息配置———事件回调配置中增加状态报告通知的URL,以便平台在接收到运营商的反馈消息时通知您消息的最终发送结果。 JAVA示例 完整的Java签名Demo代码: java 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 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 TIMEFORMATTER new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); SimpleDateFormat DATEFORMATTER new SimpleDateFormat("yyyyMMdd"); Date nowdate new Date(); String singerDate TIMEFORMATTER.format(nowdate); String singerDd DATEFORMATTER.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("ctyuneoprequestid:%sneopdate:%sn", uuId, singerDate);// uuid去掉this // header的key按照26字母进行排序, 以&作为连接符连起来 URL url new URL(" 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("UTF8"), kdate)); // SETUP6:构造请求头 HttpPost httpPost new HttpPost(String.valueOf(url)); httpPost.setHeader("ContentType", "application/json;charsetUTF8"); httpPost.setHeader("ctyuneoprequestid", uuId); httpPost.setHeader("Eopdate", singerDate); String signHeader String.format("%s Headersctyuneoprequestid;eopdate Signature%s", accessKey, Signature); httpPost.setHeader("EopAuthorization", signHeader); System.out.println("Signature" + Signature); System.out.println("signHeader" + signHeader); httpPost.setEntity(new StringEntity(body, ContentType.create("application/json", "utf8"))); try (CloseableHttpClient httpClient HttpClients.createDefault(); CloseableHttpResponse response httpClient.execute(httpPost)) { String string EntityUtils.toString(response.getEntity(), "utf8"); 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("SHA256"); // byte[] a text.getBytes(StandardCharsets.UTF8); md.update(text.getBytes(StandardCharsets.UTF8)); 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; } } }