sms.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. 'use strict';
  2. const Request = require("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. async sendProductMsg(mobile, status, name, product, deadline) {
  103. try {
  104. let templateId = 0;
  105. switch (status) {
  106. case 1: templateId = 746377;break;// 产品升级通知
  107. case 2: templateId = 746376;break;// 产品降级通知
  108. case 3: templateId = 746378;break;// 产品延期通知
  109. }
  110. const formData = {
  111. smsUser: this.smsUser,
  112. templateId: templateId,
  113. msgType: 0,
  114. phone: mobile,
  115. };
  116. formData.vars = '{"%name%": "' + name + '", "%product%": "' + product + '"' + (status !== 2 ? ', "%deadline%": "' + deadline + '"' : '') +'}';
  117. const signature = await this.getSignature(this.sortDict(formData), this.smskey);
  118. formData.signature = signature;
  119. let postData = {
  120. url: this.url,
  121. form: formData,
  122. encoding: 'utf8'
  123. };
  124. return new Promise(function (resolve, reject) {
  125. try {
  126. // 请求接口
  127. Request.post(postData, function (err, postResponse, body) {
  128. if (err) {
  129. throw '请求错误';
  130. }
  131. if (postResponse.statusCode !== 200) {
  132. throw '短信发送失败!';
  133. }
  134. resolve(body);
  135. });
  136. } catch (error) {
  137. reject([]);
  138. }
  139. });
  140. } catch (error) {
  141. console.log(error);
  142. }
  143. }
  144. md5(data) {
  145. var str = data;
  146. return crypto.createHash("md5").update(str).digest("hex");
  147. }
  148. sortDict(dict){
  149. var dict2={},
  150. keys = Object.keys(dict).sort();
  151. for (var i = 0, n = keys.length, key; i < n; ++i) {
  152. key = keys[i];
  153. dict2[key] = dict[key];
  154. }
  155. return dict2;
  156. }
  157. async getSignature (sorted_param, smsKey) {
  158. var param_str = "";
  159. for(var key in sorted_param)
  160. param_str += (key + '=' + sorted_param[key] + '&')
  161. var param_str = smsKey + '&' + param_str + smsKey;
  162. var sign = this.md5(param_str);
  163. return sign.toUpperCase();
  164. }
  165. /**
  166. * 生成随机字符串
  167. *
  168. * @param {Number} length - 需要生成字符串的长度
  169. * @param {Number} type - 1为数字和字符 2为纯数字 3为纯字母
  170. * @return {String} - 返回生成结果
  171. */
  172. generateRandomString(length, type = 1) {
  173. length = parseInt(length);
  174. length = isNaN(length) ? 1 : length;
  175. let randSeed = [];
  176. let numberSeed = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  177. let stringSeed = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
  178. 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
  179. 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
  180. switch (type) {
  181. case 1:
  182. randSeed = stringSeed.concat(numberSeed);
  183. stringSeed = numberSeed = null;
  184. break;
  185. case 2:
  186. randSeed = numberSeed;
  187. break;
  188. case 3:
  189. randSeed = stringSeed;
  190. break;
  191. default:
  192. break;
  193. }
  194. const seedLength = randSeed.length - 1;
  195. let result = '';
  196. for (let i = 0; i < length; i++) {
  197. const index = Math.ceil(Math.random() * seedLength);
  198. result += randSeed[index];
  199. }
  200. return result;
  201. }
  202. }
  203. module.exports = SMS;