q-koa 8.0.1 → 8.0.4
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.
|
@@ -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
|
|
|
@@ -918,15 +918,57 @@ exports.notify = async (ctx) => {
|
|
|
918
918
|
ctx.res.end(returnResult)
|
|
919
919
|
}
|
|
920
920
|
|
|
921
|
+
exports.url_link = 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.createUrlLink({
|
|
933
|
+
page,
|
|
934
|
+
scene,
|
|
935
|
+
})
|
|
936
|
+
ctx.SUCCESS(result)
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
exports.url_scheme = async (ctx) => {
|
|
940
|
+
const { app } = getAppByCtx(ctx)
|
|
941
|
+
|
|
942
|
+
const { page, scene, config = 'weixin_mp' } = ctx.request.body
|
|
943
|
+
const appConfig = getConfig(app)
|
|
944
|
+
const { app_id, app_secrect } = await appConfig.getObject(config)
|
|
945
|
+
const weixinMp = new WeixinMp({
|
|
946
|
+
appid: app_id,
|
|
947
|
+
secrect: app_secrect,
|
|
948
|
+
})
|
|
949
|
+
weixinMp.init()
|
|
950
|
+
const result = await weixinMp.createUrlscheme({
|
|
951
|
+
page,
|
|
952
|
+
scene,
|
|
953
|
+
})
|
|
954
|
+
ctx.SUCCESS(result)
|
|
955
|
+
}
|
|
956
|
+
|
|
921
957
|
exports.qr_code = async (ctx) => {
|
|
922
958
|
const { app } = getAppByCtx(ctx)
|
|
923
959
|
|
|
924
|
-
const {
|
|
960
|
+
const {
|
|
961
|
+
page,
|
|
962
|
+
is_hyaline,
|
|
963
|
+
scene,
|
|
964
|
+
is_oss = false,
|
|
965
|
+
config = 'weixin_mp',
|
|
966
|
+
} = ctx.request.body
|
|
925
967
|
|
|
926
968
|
// if (!lodash.get(ctx.request, `${appName}-user.id`, null)) throw new Error('没有登录')
|
|
927
969
|
|
|
928
970
|
const appConfig = getConfig(app)
|
|
929
|
-
const { app_id, app_secrect } = await appConfig.getObject(
|
|
971
|
+
const { app_id, app_secrect } = await appConfig.getObject(config)
|
|
930
972
|
|
|
931
973
|
const { site_host } = await appConfig.getObject('base')
|
|
932
974
|
const weixinMp = new WeixinMp({
|
|
@@ -984,10 +1026,16 @@ exports.qr_code = async (ctx) => {
|
|
|
984
1026
|
exports.sendMessage = async (ctx) => {
|
|
985
1027
|
const { app } = getAppByCtx(ctx)
|
|
986
1028
|
|
|
987
|
-
const {
|
|
1029
|
+
const {
|
|
1030
|
+
openid,
|
|
1031
|
+
template_id,
|
|
1032
|
+
data,
|
|
1033
|
+
page,
|
|
1034
|
+
config = 'weixin_mp',
|
|
1035
|
+
} = ctx.request.body
|
|
988
1036
|
|
|
989
1037
|
const appConfig = getConfig(app)
|
|
990
|
-
const { app_id, app_secrect } = await appConfig.getObject(
|
|
1038
|
+
const { app_id, app_secrect } = await appConfig.getObject(config)
|
|
991
1039
|
|
|
992
1040
|
const weixinMp = new WeixinMp({
|
|
993
1041
|
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,10 @@ 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'
|
|
13
|
+
const createUrlLinkUrl =
|
|
14
|
+
'https://api.weixin.qq.com/wxa/generate_urllink?access_token=%s'
|
|
11
15
|
const sendMessageUrl =
|
|
12
16
|
'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s'
|
|
13
17
|
const handleMessageUrl =
|
|
@@ -41,6 +45,7 @@ const cache = new LRU({
|
|
|
41
45
|
maxAge: 1000 * 60 * 60,
|
|
42
46
|
})
|
|
43
47
|
const uuid = require('node-uuid')
|
|
48
|
+
const { rest } = require('lodash')
|
|
44
49
|
|
|
45
50
|
const uploadPromise = (options) => {
|
|
46
51
|
return new Promise((resolve, reject) => {
|
|
@@ -296,6 +301,60 @@ module.exports = class Singleton {
|
|
|
296
301
|
return result.phone_info
|
|
297
302
|
}
|
|
298
303
|
|
|
304
|
+
async createUrlLink(options) {
|
|
305
|
+
const { page, scene, ...rest } = options
|
|
306
|
+
const access_token = await this.getAccessToken()
|
|
307
|
+
const url = util.format(createUrlLinkUrl, access_token)
|
|
308
|
+
const payLoad = {
|
|
309
|
+
...rest,
|
|
310
|
+
path: options.page,
|
|
311
|
+
query: options.scene
|
|
312
|
+
? Object.keys(options.scene)
|
|
313
|
+
.map((item) => `${item}=${options.scene[item]}`)
|
|
314
|
+
.join('&')
|
|
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.url_link
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
async createUrlscheme(options) {
|
|
331
|
+
const { page, scene, ...rest } = options
|
|
332
|
+
const access_token = await this.getAccessToken()
|
|
333
|
+
const url = util.format(createUrlschemeUrl, access_token)
|
|
334
|
+
const payLoad = {
|
|
335
|
+
...rest,
|
|
336
|
+
jump_wxa: {
|
|
337
|
+
query: options.scene
|
|
338
|
+
? Object.keys(options.scene)
|
|
339
|
+
.map((item) => `${item}=${options.scene[item]}`)
|
|
340
|
+
.join('&')
|
|
341
|
+
: '',
|
|
342
|
+
path: options.page,
|
|
343
|
+
},
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
const result = await axios.post(url, payLoad).then((res) => res.data)
|
|
347
|
+
|
|
348
|
+
if (result.errcode) {
|
|
349
|
+
if (result.errcode === 40001) {
|
|
350
|
+
cache.reset()
|
|
351
|
+
return await this.getPhoneNumber(code)
|
|
352
|
+
}
|
|
353
|
+
throw new Error(`${result.errcode};${result.errmsg}`)
|
|
354
|
+
}
|
|
355
|
+
return result.openlink
|
|
356
|
+
}
|
|
357
|
+
|
|
299
358
|
async createQR(options) {
|
|
300
359
|
if (!this.config.targetPath) throw new Error('没有配置文件夹')
|
|
301
360
|
const access_token = await this.getAccessToken()
|