sms.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. 'use strict';
  2. import Request from "request";
  3. /**
  4. * 建筑短信发送相关接口
  5. *
  6. * @author CaiAoLin
  7. * @date 2018/1/25
  8. * @version
  9. */
  10. const crypto = require('crypto');
  11. class SMS {
  12. /**
  13. * 构造函数
  14. *
  15. * @return {void}
  16. */
  17. constructor() {
  18. this.url = 'http://www.sendcloud.net/smsapi/send';
  19. this.smsUser = 'smartcost';
  20. this.smskey = 'kuGmqTt10n6vBXivhxXsAuG8aoCsQ1x6';
  21. }
  22. /**
  23. * 发送信息
  24. *
  25. * @param {String|Array} mobile - 发送的电话号码
  26. * @param {String} code - 验证码
  27. * @return {Boolean} - 发送结果
  28. */
  29. async send(mobile, code) {
  30. try {
  31. const formData = {
  32. smsUser: this.smsUser,
  33. templateId: 25595,
  34. msgType: 0,
  35. phone: mobile,
  36. vars: '{"%code%":'+ code +'}',
  37. };
  38. const signature = await this.getSignature(this.sortDict(formData), this.smskey);
  39. formData.signature = signature;
  40. let postData = {
  41. url: this.url,
  42. form: formData,
  43. encoding: 'utf8'
  44. };
  45. return new Promise(function (resolve, reject) {
  46. try {
  47. // 请求接口
  48. Request.post(postData, function (err, postResponse, body) {
  49. if (err) {
  50. throw '请求错误';
  51. }
  52. if (postResponse.statusCode !== 200) {
  53. throw '短信发送失败!';
  54. }
  55. resolve(body);
  56. });
  57. } catch (error) {
  58. reject([]);
  59. }
  60. });
  61. } catch (error) {
  62. console.log(error);
  63. }
  64. }
  65. async sendLoginMsg(mobile, name, date, time, local, ip) {
  66. console.log(mobile, name, time, local, ip);
  67. try {
  68. const formData = {
  69. smsUser: this.smsUser,
  70. templateId: 27561,
  71. msgType: 0,
  72. phone: mobile,
  73. vars: '{"%name%": "' + name + '", "%date%": "' + date + '", "%time%": "' + time + '", "%local%": "' + local + '", "%IP%": "' + ip + '"}',
  74. };
  75. const signature = await this.getSignature(this.sortDict(formData), this.smskey);
  76. formData.signature = signature;
  77. let postData = {
  78. url: this.url,
  79. form: formData,
  80. encoding: 'utf8'
  81. };
  82. return new Promise(function (resolve, reject) {
  83. try {
  84. // 请求接口
  85. Request.post(postData, function (err, postResponse, body) {
  86. if (err) {
  87. throw '请求错误';
  88. }
  89. if (postResponse.statusCode !== 200) {
  90. throw '短信发送失败!';
  91. }
  92. resolve(body);
  93. });
  94. } catch (error) {
  95. reject([]);
  96. }
  97. });
  98. } catch (error) {
  99. console.log(error);
  100. }
  101. }
  102. md5(data) {
  103. var str = data;
  104. return crypto.createHash("md5").update(str).digest("hex");
  105. }
  106. sortDict(dict){
  107. var dict2={},
  108. keys = Object.keys(dict).sort();
  109. for (var i = 0, n = keys.length, key; i < n; ++i) {
  110. key = keys[i];
  111. dict2[key] = dict[key];
  112. }
  113. return dict2;
  114. }
  115. async getSignature (sorted_param, smsKey) {
  116. var param_str = "";
  117. for(var key in sorted_param)
  118. param_str += (key + '=' + sorted_param[key] + '&')
  119. var param_str = smsKey + '&' + param_str + smsKey;
  120. var sign = this.md5(param_str);
  121. return sign.toUpperCase();
  122. }
  123. /**
  124. * 生成随机字符串
  125. *
  126. * @param {Number} length - 需要生成字符串的长度
  127. * @param {Number} type - 1为数字和字符 2为纯数字 3为纯字母
  128. * @return {String} - 返回生成结果
  129. */
  130. generateRandomString(length, type = 1) {
  131. length = parseInt(length);
  132. length = isNaN(length) ? 1 : length;
  133. let randSeed = [];
  134. let numberSeed = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  135. let stringSeed = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
  136. 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
  137. 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
  138. switch (type) {
  139. case 1:
  140. randSeed = stringSeed.concat(numberSeed);
  141. stringSeed = numberSeed = null;
  142. break;
  143. case 2:
  144. randSeed = numberSeed;
  145. break;
  146. case 3:
  147. randSeed = stringSeed;
  148. break;
  149. default:
  150. break;
  151. }
  152. const seedLength = randSeed.length - 1;
  153. let result = '';
  154. for (let i = 0; i < length; i++) {
  155. const index = Math.ceil(Math.random() * seedLength);
  156. result += randSeed[index];
  157. }
  158. return result;
  159. }
  160. }
  161. module.exports = SMS;