| 
					
				 | 
			
			
				@@ -0,0 +1,225 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+'use strict'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import Request from "request"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 建筑短信发送相关接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @author CaiAoLin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @date 2018/1/25 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @version 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const crypto = require('crypto'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class SMS { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 构造函数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return {void} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    constructor() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.url = 'http://www.sendcloud.net/smsapi/send'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.smsUser = 'smartcost'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.smskey = 'kuGmqTt10n6vBXivhxXsAuG8aoCsQ1x6'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 发送信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param {String|Array} mobile - 发送的电话号码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param {String} code - 验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return {Boolean} - 发送结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    async send(mobile, code) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const formData = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                smsUser: this.smsUser, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                templateId: 25595, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msgType: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                phone: mobile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                vars: '{"%code%":'+ code +'}', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const signature = await this.getSignature(this.sortDict(formData), this.smskey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            formData.signature = signature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let postData = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                url: this.url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                form: formData, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                encoding: 'utf8' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new Promise(function (resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 请求接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Request.post(postData, function (err, postResponse, body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw '请求错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (postResponse.statusCode !== 200) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw '短信发送失败!'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        resolve(body); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    reject([]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    async sendLoginMsg(mobile, name, date, time, local, ip) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.log(mobile, name, time, local, ip); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const formData = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                smsUser: this.smsUser, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                templateId: 27561, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msgType: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                phone: mobile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                vars: '{"%name%": "' + name + '", "%date%": "' + date + '", "%time%": "' + time + '", "%local%": "' + local + '", "%IP%": "' + ip + '"}', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const signature = await this.getSignature(this.sortDict(formData), this.smskey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            formData.signature = signature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let postData = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                url: this.url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                form: formData, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                encoding: 'utf8' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new Promise(function (resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 请求接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Request.post(postData, function (err, postResponse, body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw '请求错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (postResponse.statusCode !== 200) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw '短信发送失败!'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        resolve(body); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    reject([]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    async sendProductMsg(mobile, status, name, product, deadline) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let templateId = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            switch (status) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 1: templateId = 746380;break;// 产品升级通知 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 2: templateId = 746381;break;// 产品降级通知 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 3: templateId = 746379;break;// 产品延期通知 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const formData = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                smsUser: this.smsUser, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                templateId: templateId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msgType: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                phone: mobile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            formData.vars = '{"%name%": "' + name + '", "%product%": "' + product + '"' + (status !== 2 ? ', "%deadline%": "' + deadline + '"' : '') +'}'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const signature = await this.getSignature(this.sortDict(formData), this.smskey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            formData.signature = signature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let postData = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                url: this.url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                form: formData, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                encoding: 'utf8' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new Promise(function (resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 请求接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Request.post(postData, function (err, postResponse, body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw '请求错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (postResponse.statusCode !== 200) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw '短信发送失败!'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        resolve(body); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    reject([]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    md5(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var str = data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return crypto.createHash("md5").update(str).digest("hex"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sortDict(dict){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var dict2={}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            keys = Object.keys(dict).sort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (var i = 0, n = keys.length, key; i < n; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            key = keys[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dict2[key] = dict[key]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return dict2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    async getSignature (sorted_param, smsKey) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var param_str = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(var key in sorted_param) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            param_str += (key + '=' + sorted_param[key] + '&') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var param_str = smsKey + '&' + param_str + smsKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var sign = this.md5(param_str); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return sign.toUpperCase(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 生成随机字符串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param {Number} length - 需要生成字符串的长度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param {Number} type - 1为数字和字符 2为纯数字 3为纯字母 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return {String} - 返回生成结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    generateRandomString(length, type = 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        length = parseInt(length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        length = isNaN(length) ? 1 : length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let randSeed = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let numberSeed = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let stringSeed = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        switch (type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            case 1: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                randSeed = stringSeed.concat(numberSeed); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                stringSeed = numberSeed = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            case 2: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                randSeed = numberSeed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            case 3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                randSeed = stringSeed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const seedLength = randSeed.length - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let result = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (let i = 0; i < length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const index = Math.ceil(Math.random() * seedLength); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result += randSeed[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+module.exports = SMS; 
			 |