q-koa 8.0.0 → 8.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/core/app.js
CHANGED
|
@@ -1764,7 +1764,14 @@ APP.getAppByCtx = (ctx) => {
|
|
|
1764
1764
|
controller,
|
|
1765
1765
|
}
|
|
1766
1766
|
}
|
|
1767
|
-
|
|
1767
|
+
APP.getUserByCtx = (ctx) => {
|
|
1768
|
+
try {
|
|
1769
|
+
const appName = ctx.router.opts.prefix.substring(1)
|
|
1770
|
+
return ctx.request[`${appName}-user`].id
|
|
1771
|
+
} catch (e) {
|
|
1772
|
+
return 0
|
|
1773
|
+
}
|
|
1774
|
+
}
|
|
1768
1775
|
APP.getClientTypeByCtx = (ctx) => {
|
|
1769
1776
|
const typeEnum = {
|
|
1770
1777
|
1: 'admin',
|
|
@@ -80,7 +80,7 @@ exports.mp_getPhone = async (ctx) => {
|
|
|
80
80
|
(!exist.mp_user.appid || exist.mp_user.appid === app_id)
|
|
81
81
|
|
|
82
82
|
if (mobileExist) {
|
|
83
|
-
|
|
83
|
+
return ctx.ERROR('系统已存在该手机号')
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
const userResult = await app.model.mp_user.findOne({
|
|
@@ -90,7 +90,7 @@ exports.mp_getPhone = async (ctx) => {
|
|
|
90
90
|
})
|
|
91
91
|
|
|
92
92
|
if (!userResult || !userResult.user_id)
|
|
93
|
-
|
|
93
|
+
return ctx.ERROR('微信获取手机失败,请重试')
|
|
94
94
|
|
|
95
95
|
await app.model.user.upsert({
|
|
96
96
|
id: userResult.user_id,
|
|
@@ -149,10 +149,10 @@ exports.mp_getPhone = async (ctx) => {
|
|
|
149
149
|
exports.getPhone = async (ctx) => {
|
|
150
150
|
const { app } = getAppByCtx(ctx)
|
|
151
151
|
|
|
152
|
-
const { code, iv, encryptedData } = ctx.request.body
|
|
152
|
+
const { code, iv, encryptedData, config = 'weixin_mp' } = ctx.request.body
|
|
153
153
|
|
|
154
154
|
const appConfig = getConfig(app)
|
|
155
|
-
const { app_id, app_secrect } = await appConfig.getObject(
|
|
155
|
+
const { app_id, app_secrect } = await appConfig.getObject(config)
|
|
156
156
|
|
|
157
157
|
const weixinLoginUrl = `https://api.weixin.qq.com/sns/jscode2session?appid=${app_id}&secret=${app_secrect}&js_code=${code}&grant_type=authorization_code`
|
|
158
158
|
|
|
@@ -207,7 +207,7 @@ exports.mp_getPhoneNew = async (ctx) => {
|
|
|
207
207
|
(!exist.mp_user.appid || exist.mp_user.appid === app_id)
|
|
208
208
|
|
|
209
209
|
if (mobileExist) {
|
|
210
|
-
|
|
210
|
+
return ctx.ERROR('系统已存在该手机号')
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
await app.model.user.upsert({
|
|
@@ -918,15 +918,39 @@ exports.notify = async (ctx) => {
|
|
|
918
918
|
ctx.res.end(returnResult)
|
|
919
919
|
}
|
|
920
920
|
|
|
921
|
+
exports.urlScheme = async (ctx) => {
|
|
922
|
+
const { app } = getAppByCtx(ctx)
|
|
923
|
+
|
|
924
|
+
const { page, scene, config = 'weixin_mp' } = ctx.request.body
|
|
925
|
+
const appConfig = getConfig(app)
|
|
926
|
+
const { app_id, app_secrect } = await appConfig.getObject(config)
|
|
927
|
+
const weixinMp = new WeixinMp({
|
|
928
|
+
appid: app_id,
|
|
929
|
+
secrect: app_secrect,
|
|
930
|
+
})
|
|
931
|
+
weixinMp.init()
|
|
932
|
+
const result = await weixinMp.createUrlscheme({
|
|
933
|
+
page,
|
|
934
|
+
scene,
|
|
935
|
+
})
|
|
936
|
+
ctx.SUCCESS(result)
|
|
937
|
+
}
|
|
938
|
+
|
|
921
939
|
exports.qr_code = async (ctx) => {
|
|
922
940
|
const { app } = getAppByCtx(ctx)
|
|
923
941
|
|
|
924
|
-
const {
|
|
942
|
+
const {
|
|
943
|
+
page,
|
|
944
|
+
is_hyaline,
|
|
945
|
+
scene,
|
|
946
|
+
is_oss = false,
|
|
947
|
+
config = 'weixin_mp',
|
|
948
|
+
} = ctx.request.body
|
|
925
949
|
|
|
926
950
|
// if (!lodash.get(ctx.request, `${appName}-user.id`, null)) throw new Error('没有登录')
|
|
927
951
|
|
|
928
952
|
const appConfig = getConfig(app)
|
|
929
|
-
const { app_id, app_secrect } = await appConfig.getObject(
|
|
953
|
+
const { app_id, app_secrect } = await appConfig.getObject(config)
|
|
930
954
|
|
|
931
955
|
const { site_host } = await appConfig.getObject('base')
|
|
932
956
|
const weixinMp = new WeixinMp({
|
|
@@ -984,10 +1008,16 @@ exports.qr_code = async (ctx) => {
|
|
|
984
1008
|
exports.sendMessage = async (ctx) => {
|
|
985
1009
|
const { app } = getAppByCtx(ctx)
|
|
986
1010
|
|
|
987
|
-
const {
|
|
1011
|
+
const {
|
|
1012
|
+
openid,
|
|
1013
|
+
template_id,
|
|
1014
|
+
data,
|
|
1015
|
+
page,
|
|
1016
|
+
config = 'weixin_mp',
|
|
1017
|
+
} = ctx.request.body
|
|
988
1018
|
|
|
989
1019
|
const appConfig = getConfig(app)
|
|
990
|
-
const { app_id, app_secrect } = await appConfig.getObject(
|
|
1020
|
+
const { app_id, app_secrect } = await appConfig.getObject(config)
|
|
991
1021
|
|
|
992
1022
|
const weixinMp = new WeixinMp({
|
|
993
1023
|
appid: app_id,
|
|
@@ -1,37 +1,40 @@
|
|
|
1
1
|
const Core = require('@alicloud/pop-core')
|
|
2
2
|
const { lodash } = require('q-koa')
|
|
3
|
-
module.exports = class
|
|
4
|
-
constructor(
|
|
5
|
-
this.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
module.exports = class Singleton {
|
|
4
|
+
constructor(key) {
|
|
5
|
+
this.key = key
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 单例模式
|
|
9
|
+
*/
|
|
10
|
+
if (!Singleton.instance) {
|
|
11
|
+
Singleton.instance = this
|
|
12
|
+
}
|
|
13
|
+
const previous = Singleton.instance.getConfig()
|
|
14
|
+
if (!lodash.isEqual(previous, key)) {
|
|
15
|
+
Singleton.instance = this
|
|
15
16
|
}
|
|
17
|
+
return Singleton.instance
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
init() {
|
|
16
21
|
this.client = new Core({
|
|
17
|
-
accessKeyId: this.
|
|
18
|
-
accessKeySecret: this.
|
|
22
|
+
accessKeyId: this.key.accessKeyId,
|
|
23
|
+
accessKeySecret: this.key.accessKeySecret,
|
|
19
24
|
endpoint: 'https://dysmsapi.aliyuncs.com',
|
|
20
25
|
apiVersion: '2017-05-25',
|
|
21
26
|
})
|
|
22
27
|
}
|
|
23
28
|
|
|
24
29
|
async send({ mobile, TemplateCode, TemplateParam }) {
|
|
25
|
-
|
|
30
|
+
console.log('JSON.stringify(TemplateParam)')
|
|
26
31
|
const result = await this.client.request(
|
|
27
32
|
'SendSms',
|
|
28
33
|
{
|
|
29
34
|
PhoneNumbers: mobile,
|
|
30
|
-
SignName: this.
|
|
35
|
+
SignName: this.key.SignName,
|
|
31
36
|
TemplateCode,
|
|
32
|
-
TemplateParam: JSON.stringify(
|
|
33
|
-
code: this.config.param,
|
|
34
|
-
}),
|
|
37
|
+
TemplateParam: JSON.stringify(TemplateParam),
|
|
35
38
|
},
|
|
36
39
|
{
|
|
37
40
|
method: 'POST',
|
|
@@ -40,7 +43,7 @@ module.exports = class Sms {
|
|
|
40
43
|
return result
|
|
41
44
|
}
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
return this.
|
|
46
|
+
getConfig() {
|
|
47
|
+
return this.key
|
|
45
48
|
}
|
|
46
49
|
}
|
|
@@ -8,6 +8,8 @@ const getPhoneNumberUrl =
|
|
|
8
8
|
'https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s'
|
|
9
9
|
const createQRCodeUrl =
|
|
10
10
|
'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s'
|
|
11
|
+
const createUrlschemeUrl =
|
|
12
|
+
'https://api.weixin.qq.com/wxa/generatescheme?access_token=%s'
|
|
11
13
|
const sendMessageUrl =
|
|
12
14
|
'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s'
|
|
13
15
|
const handleMessageUrl =
|
|
@@ -41,6 +43,7 @@ const cache = new LRU({
|
|
|
41
43
|
maxAge: 1000 * 60 * 60,
|
|
42
44
|
})
|
|
43
45
|
const uuid = require('node-uuid')
|
|
46
|
+
const { rest } = require('lodash')
|
|
44
47
|
|
|
45
48
|
const uploadPromise = (options) => {
|
|
46
49
|
return new Promise((resolve, reject) => {
|
|
@@ -296,6 +299,34 @@ module.exports = class Singleton {
|
|
|
296
299
|
return result.phone_info
|
|
297
300
|
}
|
|
298
301
|
|
|
302
|
+
async createUrlscheme(options) {
|
|
303
|
+
const { page, scene, ...rest } = options
|
|
304
|
+
const access_token = await this.getAccessToken()
|
|
305
|
+
const url = util.format(createUrlschemeUrl, access_token)
|
|
306
|
+
const payLoad = {
|
|
307
|
+
...rest,
|
|
308
|
+
jump_wxa: {
|
|
309
|
+
query: options.scene
|
|
310
|
+
? Object.keys(options.scene)
|
|
311
|
+
.map((item) => `${item}=${options.scene[item]}`)
|
|
312
|
+
.join('&')
|
|
313
|
+
: '',
|
|
314
|
+
path: options.page,
|
|
315
|
+
},
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const result = await axios.post(url, payLoad).then((res) => res.data)
|
|
319
|
+
|
|
320
|
+
if (result.errcode) {
|
|
321
|
+
if (result.errcode === 40001) {
|
|
322
|
+
cache.reset()
|
|
323
|
+
return await this.getPhoneNumber(code)
|
|
324
|
+
}
|
|
325
|
+
throw new Error(`${result.errcode};${result.errmsg}`)
|
|
326
|
+
}
|
|
327
|
+
return result.openlink
|
|
328
|
+
}
|
|
329
|
+
|
|
299
330
|
async createQR(options) {
|
|
300
331
|
if (!this.config.targetPath) throw new Error('没有配置文件夹')
|
|
301
332
|
const access_token = await this.getAccessToken()
|