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
- throw new Error('系统已存在该手机号')
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
- throw new Error('微信获取手机失败,请重试')
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('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
 
@@ -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
- throw new Error('系统已存在该手机号')
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 { page, is_hyaline, scene, is_oss = false } = ctx.request.body
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('weixin_mp')
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 { openid, template_id, data, page } = ctx.request.body
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('weixin_mp')
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 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,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()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "q-koa",
3
- "version": "8.0.0",
3
+ "version": "8.0.3",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {