wl-design-mobile 0.7.7 → 0.7.8-beat.1

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/util/jssdk-sczy.js +157 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wl-design-mobile",
3
- "version": "0.7.7",
3
+ "version": "0.7.8-beat.1",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "author": "finch",
@@ -0,0 +1,157 @@
1
+ import wx from "weixin-js-sdk";
2
+ import config from '../config/config'
3
+ import {axios} from '../util/axios'
4
+
5
+ const SIGNATURE_CACHE_KEY = 'sczy_js_signature_cache'
6
+ const SIGNATURE_CACHE_TTL = 5 * 60 * 1000
7
+ let configPromise = null
8
+
9
+ function getCacheKey(url) {
10
+ return `${SIGNATURE_CACHE_KEY}:${url}`
11
+ }
12
+
13
+ function getCachedSignature(url) {
14
+ try {
15
+ const raw = sessionStorage.getItem(getCacheKey(url))
16
+ if (!raw) {
17
+ return null
18
+ }
19
+ const cached = JSON.parse(raw)
20
+ if (!cached || !cached.data || !cached.expireAt || Date.now() > cached.expireAt) {
21
+ sessionStorage.removeItem(getCacheKey(url))
22
+ return null
23
+ }
24
+ return cached.data
25
+ } catch (e) {
26
+ sessionStorage.removeItem(getCacheKey(url))
27
+ return null
28
+ }
29
+ }
30
+
31
+ function setCachedSignature(url, data) {
32
+ try {
33
+ sessionStorage.setItem(getCacheKey(url), JSON.stringify({
34
+ expireAt: Date.now() + SIGNATURE_CACHE_TTL,
35
+ data,
36
+ }))
37
+ } catch (e) {
38
+ // ignore storage failures
39
+ }
40
+ }
41
+
42
+
43
+ /**
44
+ * 判断ios系统版本号是否大于14
45
+ * @returns {boolean}
46
+ */
47
+ const isIos14AndMore = () => {
48
+ try {
49
+ const str = navigator.userAgent.toLowerCase()
50
+ const ver = str.match(/cpu iphone os (.*?) like mac os/)
51
+ if (!ver) {
52
+ return false
53
+ }
54
+ return Number(ver[1].split('_')[0]) >= 14
55
+ } catch (e) {
56
+ console.log('isIos14AndMore', e)
57
+ return false
58
+ }
59
+ }
60
+
61
+ function getSczyJsConfig() {
62
+ let url = window.location.href.split('#')[0]
63
+ if (isIos14AndMore()) {
64
+ const storedUrl = sessionStorage.getItem('ios14ConfigUrl')
65
+ if (storedUrl) {
66
+ url = storedUrl
67
+ }
68
+ }
69
+
70
+ const cached = getCachedSignature(url)
71
+ if (cached) {
72
+ return Promise.resolve(cached)
73
+ }
74
+
75
+ return axios.get(config.platformServerContext + '/api/weixin/js/signature', {
76
+ params: { url }
77
+ }).then((resp) => {
78
+ const data = resp && resp.data ? resp.data : {}
79
+ if (!data || data.errcode !== 0 || !data.data) {
80
+ throw new Error((data && data.errmsg) ? data.errmsg : '获取签名失败')
81
+ }
82
+ setCachedSignature(url, data.data)
83
+ return data.data
84
+ })
85
+ }
86
+
87
+ function configWx() {
88
+ if (configPromise) {
89
+ return configPromise
90
+ }
91
+
92
+ configPromise = getSczyJsConfig().then((resp) => {
93
+ return new Promise((resolve, reject) => {
94
+ wx.config({
95
+ debug: false,
96
+ appId: resp.appId,
97
+ timestamp: resp.timestamp,
98
+ nonceStr: resp.nonceStr,
99
+ signature: resp.signature,
100
+ jsApiList: ['scanQRCode']
101
+ })
102
+
103
+ wx.ready(() => {
104
+ resolve()
105
+ })
106
+
107
+ wx.error((res) => {
108
+ configPromise = null
109
+ reject('企业微信初始化js-sdk失败' + (res && res.errMsg ? res.errMsg : ''))
110
+ })
111
+ })
112
+ }).catch((error) => {
113
+ configPromise = null
114
+ throw new Error('请求服务端jssdk签名失败:' + error)
115
+ })
116
+
117
+ return configPromise
118
+ }
119
+
120
+ function extractScanText(res) {
121
+ if (!res) {
122
+ return ''
123
+ }
124
+ if (typeof res === 'string') {
125
+ return res
126
+ }
127
+ return res.resultStr || res.result || res.text || res.code || ''
128
+ }
129
+
130
+ function scanQRCode() {
131
+ return new Promise((resolve, reject) => {
132
+ configWx().then(() => {
133
+ wx.scanQRCode({
134
+ desc: 'scanQRCode desc',
135
+ needResult: 1,
136
+ scanType: ['qrCode', 'barCode'],
137
+ success: function (res) {
138
+ resolve(extractScanText(res))
139
+ },
140
+ error: function (res) {
141
+ if (res && res.errMsg && res.errMsg.indexOf('function_not_exist') > -1) {
142
+ reject('版本过低请升级')
143
+ } else {
144
+ reject('企业微信扫码失败,请联系系统管理员!')
145
+ }
146
+ }
147
+ })
148
+ }).catch((error) => {
149
+ configPromise = null
150
+ reject('企业微信扫码失败:' + error)
151
+ })
152
+ })
153
+ }
154
+
155
+ export default {
156
+ scanQRCode,
157
+ }