helper.js
6.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/**
* Created by Tommy Huang on 18/03/21.
*/
const config = require('config-lite')({
config_basedir: __dirname,
config_dir: 'config'
})
const fs = require('fs')
const util = require('util')
const axios = require('axios')
const {URL} = require('url')
const crypto = require('crypto')
const FormData = require('form-data')
const md5 = require('md5')
const bcrypt = require('bcryptjs')
const jsSHA = require('jssha')
const querystring = require('querystring')
const sharp = require('sharp')
/**
* 获取用户微信 Token
* @param {string} code 微信返回的用户 code
*/
exports.getUserWxAccessTokenInfo = async function(code) {
const {data} = await axios.get(`https://api.weixin.qq.com/sns/oauth2/access_token?appid=${config.wx.appId}&secret=${config.wx.appSecret}&code=${code}&grant_type=authorization_code`)
if (data.access_token && data.refresh_token && data.openid) {
return data
} else {
return false
}
}
/**
* 刷新用户的 Token
* @param {string} refreshToken 微信返回的用户 refresh_token
*/
exports.refreshUserWxToken = async function(refreshToken) {
const {data} = await axios.get(`https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=${config.wx.appId}&grant_type=refresh_token&refresh_token=${refreshToken}`)
if (data.access_token && data.refresh_token && data.openid) {
return data
} else {
return false
}
}
/**
* 拉取用户信息
* @param {string} token 微信返回的用户 access_token
* @param {string} openId 微信返回的用户 openid
*/
exports.getUserWxInfo = async function(token, openId) {
const {data} = await axios.get(`https://api.weixin.qq.com/sns/userinfo?access_token=${token}&openid=${openId}&lang=zh_CN`)
if (data.openid && data.nickname && data.headimgurl) {
return data
} else {
return false
}
}
/**
* 发送验证码
* @param {string} phone 要发送验证码的手机号
*/
exports.sendVerificationCode = async function (phone) {
if (!phone) return {success: false, msg: '缺少参数'}
const code = randomNumberStr(false, 4, 4)
var url = `${config.sms.url}?account=${config.sms.account}&password=${config.sms.password}&mobile=${phone}&content=【七彩贷】验证码:${code},如非本人操作,请忽略本短信`
url = new URL(url).href
let { data } = await axios.get(url)
console.log(data)
if (data.status === 0) {
return {success: true, code: code}
} else {
return {success: false, msg: data.desc}
}
}
/**
* 产生任意长度随机数字组合
* @param {bool} randomFlag 是否任意长度
* @param {num} min 任意长度最小位[固定位数]
* @param {num} max 任意长度最大位
*/
function randomNumberStr (randomFlag, min, max) {
let str = ""
let range = min
let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
if (randomFlag) {
range = Math.round(Math.random() * (max - min)) + min
}
for (let i = 0 ; i < range; i++) {
let pos = Math.round(Math.random() * (arr.length-1))
str += arr[pos]
}
return str
}
/**
* 生成腾讯云接口鉴权签名
*/
exports.tencentCloudAuthorization = function () {
const current = Math.floor(Date.now() / 1000)
const rand = Math.floor(Math.random() * Math.pow(10, 10))
const expire = current + 30
const origin = `a=${config.idOCR.appid}&b=${config.idOCR.bucket}&k=${config.idOCR.SecretId}&e=${expire}&t=${current}&r=${rand}&u=0&f=`
var auth = crypto.createHmac('sha1', config.idOCR.SecretKey).update(origin).digest()
auth = Buffer.concat([auth, Buffer.from(origin, 'utf-8')])
return auth.toString('base64')
}
/**
* 获取腾讯云身份证识别接口结果
* @param {object File} file 身份证图片文件
* @param {integer} type 图片类型:正面:0, 反面:1
* @param {string} auth 接口鉴权签名
*/
exports.getIdORCResult = async function(file, type, auth) {
let form = new FormData()
form.append('appid', config.idOCR.appid)
form.append('bucket', config.idOCR.bucket)
form.append('card_type', type)
form.append('image', file)
let formHead = form.getHeaders()
formHead.authorization = auth
let {data} = await axios.post(config.idOCR.url, form, {headers: formHead})
return data.result_list[0]
}
/**
* 异步写文件 Promise 版
*/
exports.writeFile = util.promisify(fs.writeFile)
/**
* 原始密码加盐加密
* @param {string} raw 原始密码
*/
exports.buildPassword = async function (raw) {
const result = await bcrypt.hashSync(md5(`${raw}${config.bcrypt.salt}`), config.bcrypt.saltRounds)
return result
}
/**
* 密码验证
* @param {str} passwd 用户输入的密码
* @param {str} cryptedPasswd 保存的加密后的密码
*/
exports.passwdCheck = function(passwd, cryptedPasswd) {
let rawPasswd = md5(`${passwd}${config.bcrypt.salt}`)
return bcrypt.compareSync(rawPasswd, cryptedPasswd)
}
/**
* 生成微信分享地址
* @param {string} borrowListId 要分享的借条的id
*/
exports.buildShareUrl = function (borrowListId) {
const redirect = querystring.stringify({redirect_uri : `${config.baseURL}/borrowContent?id=${borrowListId}`})
// return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx52d72e78b0ecf0f0&${redirect}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`
return `${config.baseURL}/borrowContent?id=${borrowListId}`
}
/**
* 生成时间戳
*/
function timestamp () {
return parseInt(new Date().getTime() / 1000) + ''
}
/**
* 生成微信配置信息
* @param {string} jsapiTicket jsapiTicket
* @param {string} url 页面url
*/
exports.buildWeChatConfig = function (jsapiTicket, url) {
const time = timestamp()
const nonceStr = Math.random().toString(36).substr(2, 15)
const raw = `jsapi_ticket=${jsapiTicket}&noncestr=${nonceStr}×tamp=${time}&url=${url}`
console.log(raw)
let shaObj = new jsSHA('SHA-1', 'TEXT')
shaObj.update(raw)
const sign = shaObj.getHash('HEX')
return {
jsapi_ticket: jsapiTicket,
nonceStr: nonceStr,
timestamp: time,
url: url,
signature: sign
}
}
/**
* 压缩图片
* @param {Buffer} buffer 要压缩的图片
* @param {integer} width 压缩后的图片宽度
*/
exports.imageCompression = async function (buffer, width) {
const image = await sharp(buffer).resize(width).toBuffer()
return image
}