title: 代码片段

通知类短信发送及查询短信发送状态 Demo(Java) :

  1. import java.io.IOException;
  2. import java.util.Comparator;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.TreeMap;
  6. import okhttp3.Dispatcher;
  7. import okhttp3.FormBody;
  8. import okhttp3.OkHttpClient;
  9. import okhttp3.Request;
  10. import okhttp3.RequestBody;
  11. import okhttp3.Response;
  12. import org.apache.commons.codec.digest.DigestUtils;
  13. public class Example {
  14. private static final String APPID = "XXXXX";
  15. private static final String APP_KEY = "<YOUR_SECRET>";
  16. private static final String BASE_URL = "https://sms.wilddog.com/api/v1/" + APPID;
  17. private static final String SENDCODE_URL = BASE_URL + "/code/send";
  18. private static final String SEND_URL = BASE_URL + "/notify/send";
  19. private static final String CHECKCODE_URL = BASE_URL + "/code/check";
  20. private static final String QUERY_URL = BASE_URL + "/status";
  21. private static OkHttpClient client = null;
  22. static{
  23. Dispatcher dispatcher = new Dispatcher();
  24. dispatcher.setMaxRequests(100);
  25. dispatcher.setMaxRequestsPerHost(100);
  26. OkHttpClient.Builder builder = new OkHttpClient.Builder();
  27. client = builder.dispatcher(dispatcher).build();
  28. }
  29. // 发送短信验证码
  30. public static void sendCode(String templateId, String mobile) {
  31. long timestamp = System.currentTimeMillis();
  32. Map<String, String> params = new HashMap<String, String>();
  33. // 设置请求参数
  34. params.put("templateId", templateId);
  35. params.put("mobile", mobile);
  36. params.put("timestamp", String.valueOf(timestamp));
  37. Map<String, Object> sortedMap = new TreeMap<String, Object>(new Comparator<String>() {
  38. public int compare(String arg0, String arg1) {
  39. // 忽略大小写
  40. return arg0.compareToIgnoreCase(arg1);
  41. }
  42. });
  43. // 请求参数排序
  44. sortedMap.putAll(params);
  45. // 计算数字签名
  46. StringBuilder sb = new StringBuilder();
  47. FormBody.Builder formBody = new FormBody.Builder();
  48. for (String s : sortedMap.keySet()) {
  49. System.out.println(s + " " + sortedMap.get(s));
  50. formBody.add(s, sortedMap.get(s) + "");
  51. sb.append(String.format("%s=%s&", s, sortedMap.get(s)));
  52. }
  53. sb.append(APP_KEY);
  54. String sig = DigestUtils.sha256Hex(sb.toString());
  55. // 追加数字签名参数
  56. RequestBody body = formBody.add("signature", sig).build();
  57. Request request = new Request.Builder().url(SENDCODE_URL).post(body).build();
  58. try {
  59. Response response = client.newCall(request).execute();
  60. System.out.println(response);
  61. System.out.println(response.body().string());
  62. System.out.println(response.body().toString());
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. // 发送短信通知
  68. public static void send(String templateId, String mobiles, String parameters) {
  69. long timestamp = System.currentTimeMillis();
  70. Map<String, String> params = new HashMap<String, String>();
  71. // 设置请求参数
  72. params.put("templateId", templateId);
  73. params.put("mobiles", mobiles);
  74. params.put("timestamp", String.valueOf(timestamp));
  75. params.put("params", parameters);
  76. Map<String, Object> sortedMap = new TreeMap<String, Object>(new Comparator<String>() {
  77. public int compare(String arg0, String arg1) {
  78. // 忽略大小写
  79. return arg0.compareToIgnoreCase(arg1);
  80. }
  81. });
  82. // 请求参数排序
  83. sortedMap.putAll(params);
  84. // 计算数字签名
  85. StringBuilder sb = new StringBuilder();
  86. FormBody.Builder formBody = new FormBody.Builder();
  87. for (String s : sortedMap.keySet()) {
  88. System.out.println(s + " " + sortedMap.get(s));
  89. formBody.add(s, sortedMap.get(s) + "");
  90. sb.append(String.format("%s=%s&", s, sortedMap.get(s)));
  91. }
  92. sb.append(APP_KEY);
  93. String sig = DigestUtils.sha256Hex(sb.toString());
  94. // 追加数字签名参数
  95. RequestBody body = formBody.add("signature", sig).build();
  96. Request request = new Request.Builder().url(SEND_URL).post(body).build();
  97. try {
  98. Response response = client.newCall(request).execute();
  99. System.out.println(response);
  100. System.out.println(response.body().string());
  101. System.out.println(response.body().toString());
  102. } catch (IOException e) {
  103. e.printStackTrace();
  104. }
  105. }
  106. // 校验验证码
  107. public static void checkCode(String code, String mobile) {
  108. long timestamp = System.currentTimeMillis();
  109. Map<String, String> params = new HashMap<String, String>();
  110. // 设置请求参数
  111. params.put("code", code);
  112. params.put("mobile", mobile);
  113. params.put("timestamp", String.valueOf(timestamp));
  114. Map<String, Object> sortedMap = new TreeMap<String, Object>(new Comparator<String>() {
  115. public int compare(String arg0, String arg1) {
  116. // 忽略大小写
  117. return arg0.compareToIgnoreCase(arg1);
  118. }
  119. });
  120. // 请求参数排序
  121. sortedMap.putAll(params);
  122. // 计算数字签名
  123. StringBuilder sb = new StringBuilder();
  124. FormBody.Builder formBody = new FormBody.Builder();
  125. for (String s : sortedMap.keySet()) {
  126. System.out.println(s + " " + sortedMap.get(s));
  127. formBody.add(s, sortedMap.get(s) + "");
  128. sb.append(String.format("%s=%s&", s, sortedMap.get(s)));
  129. }
  130. sb.append(APP_KEY);
  131. String sig = DigestUtils.sha256Hex(sb.toString());
  132. // 追加数字签名参数
  133. RequestBody body = formBody.add("signature", sig).build();
  134. Request request = new Request.Builder().url(CHECKCODE_URL).post(body).build();
  135. try {
  136. Response response = client.newCall(request).execute();
  137. System.out.println(response);
  138. System.out.println(response.body().string());
  139. System.out.println(response.body().toString());
  140. } catch (IOException e) {
  141. e.printStackTrace();
  142. }
  143. }
  144. // 短信发送状态查询
  145. public static void query(String rrid) {
  146. // 短信发送后批次号
  147. Map<String, String> params = new HashMap<String, String>();
  148. params.put("rrid", rrid);
  149. Map<String, Object> sortedMap = new TreeMap<String, Object>(new Comparator<String>() {
  150. public int compare(String arg0, String arg1) {
  151. // 忽略大小写
  152. return arg0.compareToIgnoreCase(arg1);
  153. }
  154. });
  155. sortedMap.putAll(params);
  156. // 计算数字签名
  157. StringBuilder sb = new StringBuilder();
  158. for (String s : sortedMap.keySet()) {
  159. sb.append(String.format("%s=%s&", s, sortedMap.get(s)));
  160. }
  161. sb.append(APP_KEY);
  162. String sig = DigestUtils.sha256Hex(sb.toString());
  163. Request request = new Request.Builder().url(QUERY_URL + "?rrid=" + rrid + "&signature=" + sig).get().build();
  164. try {
  165. Response response = client.newCall(request).execute();
  166. System.out.println(response);
  167. System.out.println(response.body().string());
  168. System.out.println(response.body().toString());
  169. } catch (IOException e) {
  170. e.printStackTrace();
  171. }
  172. }
  173. public static void main(String[] args) {
  174. //发送短信验证码
  175. String templateId = "100000";
  176. String mobile = "XXXXXXX";
  177. Example.sendCode(templateId, mobile);
  178. //发送通知类短信
  179. String templateId2 = "100002";
  180. String mobiles = "[XXXXXXX]";
  181. String params = "[zidane]";
  182. Example.send(templateId2, mobiles, params);
  183. //校验验证码
  184. String code = "100100";
  185. String mobile2 = "XXXXXXX";
  186. Example.checkCode(code, mobile2);
  187. //查询发送状态
  188. String rrid = "XXXXXXXX";
  189. Example.query(rrid);
  190. }
  191. }

验证码短信发送 Demo (Python):

  1. import urllib
  2. import urllib2
  3. import time
  4. import hashlib
  5. # appId
  6. appId = 'xxxxx';
  7. # init PATH
  8. baseURL = "https://sms.wilddog.com/api/v1/" + appId;
  9. sendURL = baseURL + "/code/send";
  10. # 短信秘钥
  11. APP_KEY = "xxxxxxxxxxxxxxxxx";
  12. #准备数据 发送短信验证码类包括下面这些信息:templateId mobile timestamp
  13. requestBody={"templateId":"100000", "mobile":"13031199447", "timestamp":"%d" %(time.time()*1000)}
  14. # 排序
  15. signParam = sorted(requestBody.items(), key=lambda d: d[0]);
  16. # 拼接排序后信息
  17. str = "";
  18. for i in signParam:
  19. str = str + i[0] + "=" + i[1] + "&";
  20. # 拼接短信秘钥
  21. str = str + APP_KEY;
  22. # 计算数字签名
  23. sign = hashlib.sha256(str).hexdigest();
  24. # 设置数字签名
  25. requestBody['signature'] = sign;
  26. # 发送请求
  27. test_data_urlencode = urllib.urlencode(requestBody)
  28. req = urllib2.Request(url = sendURL,data =test_data_urlencode)
  29. print req
  30. #
  31. res_data = urllib2.urlopen(req)
  32. res = res_data.read()
  33. print res

验证码短信发送 Demo (PHP):

  1. <?php
  2. function get_total_millisecond()
  3. {
  4. $time = microtime(true);
  5. return round($time * 1000);
  6. }
  7. $time = get_total_millisecond();
  8. $appId = '<YOUR_APPID>';
  9. $mobile = '<PHONE_NUM>';
  10. $templateId = 100000;
  11. $sign_key = '<YOUR_SMS_KEY>';
  12. $sign_data = array('mobile' => $mobile, 'templateId' => $templateId, 'timestamp' => $time);
  13. // 以字母升序(A-Z)排列
  14. ksort($sign_data);
  15. var_dump($sign_data);
  16. $sign_str = http_build_query($sign_data) . '&' . $sign_key;
  17. //DEBUG
  18. //生成数字签名的方法 https://docs.wilddog.com/sms/guide/signature.html#生成数字签名的方法
  19. $signature = hash("sha256", urldecode($sign_str));
  20. $url = "https://sms.wilddog.com/api/v1/${appId}/code/send";
  21. // 不同接口参数不同, 详细参数请参见 https://docs.wilddog.com
  22. $post_data = array('signature' => $signature, "mobile" => $mobile, "timestamp" => $time, "templateId" => $templateId);
  23. $form_string = http_build_query($post_data);
  24. // DEBUG
  25. echo "打印sign_str\n";
  26. var_dump($sign_str);
  27. echo "打印signature\n";
  28. var_dump($signature);
  29. echo "打印发送的数据\n";
  30. var_dump($form_string);
  31. $header = array(
  32. 'Content-Type: application/x-www-form-urlencoded',
  33. );
  34. $ch = curl_init();
  35. // DEBUG 打印curl请求和响应调试日志
  36. curl_setopt($ch, CURLOPT_VERBOSE, true);
  37. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  38. curl_setopt($ch, CURLOPT_URL, $url);
  39. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  40. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  41. // post数据
  42. curl_setopt($ch, CURLOPT_POST, 1);
  43. // post的变量
  44. curl_setopt($ch, CURLOPT_POSTFIELDS, $form_string);
  45. $output = curl_exec($ch);
  46. curl_close($ch);
  47. // DEBUG
  48. echo "打印获得的数据\n";
  49. var_dump($output);
  50. ?>