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('weixin_mp')
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 { page, is_hyaline, scene, is_oss = false } = ctx.request.body
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('weixin_mp')
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 { openid, template_id, data, page } = ctx.request.body
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('weixin_mp')
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 Sms {
4
- constructor(config) {
5
- this.config = {
6
- accessKeyId: config.accessKeyId, // 开发者账号id
7
- accessKeySecret: config.accessKeySecret, // 开发者token
8
- SignName: config.SignName, // 应用id
9
- param: Array.from(
10
- {
11
- length: config.number || 4,
12
- },
13
- () => lodash.random(0, 9)
14
- ).join(''),
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.config.accessKeyId,
18
- accessKeySecret: this.config.accessKeySecret,
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
- // if(!mobile) throw new Error('请输入手机号码')
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.config.SignName,
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
- getCode() {
44
- return this.config.param
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()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "q-koa",
3
- "version": "8.0.1",
3
+ "version": "8.0.4",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {