weapps-plugin-jingtong-verify 1.4.1-dev → 1.4.2

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "weapps-plugin-jingtong-verify",
3
3
  "pluginName": "weapps-plugin-jingtong-verify",
4
4
  "pluginType": "mp",
5
- "version": "1.4.1-dev",
5
+ "version": "1.4.2",
6
6
  "description": "",
7
7
  "main": "sdk.js",
8
8
  "author": "tongyirenzheng",
@@ -130,7 +130,6 @@ Component({
130
130
  },
131
131
  // 内部校验 input
132
132
  validateInput() {
133
- console.log('=========内部校验=======')
134
133
  if (!this.id) {
135
134
  throw new Error('请提供需要校验的组件 ID');
136
135
  }
@@ -131,6 +131,64 @@ const rules = {
131
131
  }
132
132
  },
133
133
 
134
+ // 外国护照(人脸识别)
135
+ foreignerRulesFace: {
136
+ id_card_number: {
137
+ required: {
138
+ zh_CN: '请输入护照号码',
139
+ en: 'Please enter your passport No.'
140
+ },
141
+ validate: {
142
+ zh_CN: '证件号码不允许汉字、全角字符、特殊字符',
143
+ en: 'Please enter your passport No.'
144
+ }
145
+ },
146
+ nation: {
147
+ required: {
148
+ zh_CN: '请选择国籍',
149
+ en: 'Please select your nationality'
150
+ }
151
+ },
152
+ sur_name: {
153
+ required: {
154
+ zh_CN: '请输入姓',
155
+ en: 'Please enter your surname'
156
+ },
157
+ validate: {
158
+ zh_CN: '不能输入小写字母',
159
+ en: 'Please enter capital letters'
160
+ },
161
+ },
162
+ first_name: {
163
+ required: {
164
+ zh_CN: '请输入名',
165
+ en: 'Please enter your given names'
166
+ },
167
+ validate: {
168
+ zh_CN: '不能输入小写字母',
169
+ en: 'Please enter capital letters'
170
+ },
171
+ },
172
+ sex: {
173
+ zh_CN: '请选择性别',
174
+ en: 'Please select your gender information'
175
+ },
176
+ birthday: {
177
+ zh_CN: '请选择出生日期',
178
+ en: 'Please select your date of birth'
179
+ },
180
+ cid_expire_date: {
181
+ zh_CN: '请选择护照有效期',
182
+ en: 'Please select the expiration date of your passport'
183
+ },
184
+ phone: {
185
+ required: {
186
+ zh_CN: '请输入手机号码',
187
+ en: 'Please enter your mobile phone number'
188
+ }
189
+ }
190
+ },
191
+
134
192
  // 银行卡
135
193
  cardRules: {
136
194
  id_card_number: {
@@ -200,4 +258,6 @@ const rules = {
200
258
  }
201
259
  }
202
260
 
203
- module.exports = { rules }
261
+ module.exports = {
262
+ rules
263
+ }
@@ -122,7 +122,7 @@ Page({
122
122
  },
123
123
  '700': {
124
124
  currentAuthType: 'ForeignPassortAuth',
125
- rules: rulesConfig.ForeignPassortRules('en')
125
+ rules: rulesConfig.ForeignPassortRulesFace('en')
126
126
  }
127
127
  },
128
128
  rules: rulesConfig.chinaRules('zh_CN'),
@@ -1,9 +1,14 @@
1
1
  // weapps-plugin-jingtong-verify/pages/face-verify/index.js
2
2
  const jingtongVerifyRequest = require('../../utils/request')
3
3
  const utils = require("../../utils/index")
4
- const { flow } = require("@wecity/weda-plugin-utils");
4
+ const {
5
+ flow
6
+ } = require("@wecity/weda-plugin-utils");
5
7
  const rulesConfig = require("../../utils/rules")
6
- import { SDKTrack, setAccountInfo } from '../../utils/QDTrackerNew/QDTrackerMain'
8
+ import {
9
+ SDKTrack,
10
+ setAccountInfo
11
+ } from '../../utils/QDTrackerNew/QDTrackerMain'
7
12
  let cidType = '700'
8
13
 
9
14
  Page({
@@ -14,7 +19,7 @@ Page({
14
19
  language: 'en', // 语言环境:英文
15
20
  formData: {
16
21
  cid_type: '700', // 证件类型
17
- id_card_number: '',
22
+ id_card_number: '',
18
23
  nation: '', // 国籍
19
24
  nation_name: '',
20
25
  sur_name: '', // 姓
@@ -28,28 +33,43 @@ Page({
28
33
  isbind: 1
29
34
  },
30
35
  needUnite: '', // 是否需要串联起来
31
- cidTypeRange: [
32
- { name: 'International passport', value: '700' } // 外国护照
36
+ cidTypeRange: [{
37
+ name: 'International passport',
38
+ value: '700'
39
+ } // 外国护照
33
40
  ],
34
- sexRange: [
35
- { name: 'Male', value: 1 },
36
- { name: 'Female', value: 2 }
41
+ sexRange: [{
42
+ name: 'Male',
43
+ value: 1
44
+ },
45
+ {
46
+ name: 'Female',
47
+ value: 2
48
+ }
37
49
  ],
38
- loginTimeRangeEn: [
39
- { name: 'Keep me logged in for 1 day', value: 24 },
40
- { name: 'Keep me logged in for 7 days', value: 168 },
41
- { name: 'Keep me logged in for 30 days', value: 720 }
50
+ loginTimeRangeEn: [{
51
+ name: 'Keep me logged in for 1 day',
52
+ value: 24
53
+ },
54
+ {
55
+ name: 'Keep me logged in for 7 days',
56
+ value: 168
57
+ },
58
+ {
59
+ name: 'Keep me logged in for 30 days',
60
+ value: 720
61
+ }
42
62
  ],
43
63
  validateType: {
44
64
  id_card_number(value) {
45
65
  return utils.validate.checkCid(value, cidType).data
46
66
  },
47
- sur_name(value) {
48
- return utils.validate.checkName(value, cidType).data
49
- },
50
- first_name(value) {
51
- return utils.validate.checkName(value, cidType).data
52
- }
67
+ // surName(value) {
68
+ // return utils.validate.checkName(value, cidType).data
69
+ // },
70
+ // firstName(value) {
71
+ // return utils.validate.checkName(value, cidType).data
72
+ // }
53
73
  },
54
74
  rules: rulesConfig.ForeignPassortRules('en'),
55
75
  // 打开文档的防抖操作
@@ -79,7 +99,127 @@ Page({
79
99
  // 记录是否已经登录成功
80
100
  hadSuccessLogin: false,
81
101
  // 该操作会触发小程序的销毁回调
82
- exitedState: true
102
+ exitedState: true,
103
+ // surname自定义校验状态,傻逼数广傻逼组件逼的
104
+ sur_name_state: {
105
+ valid: true,
106
+ msg: ''
107
+ },
108
+ // givenName自定义校验状态,傻逼数广傻逼组件逼的
109
+ first_name_state: {
110
+ valid: true,
111
+ msg: ''
112
+ },
113
+ showCustomTips: false,
114
+ customTipsMsg: ''
115
+ },
116
+
117
+ // 验证sur_name和first_name
118
+ validateFullname() {
119
+ const {
120
+ sur_name,
121
+ first_name
122
+ } = this.data.formData
123
+ // 两个都没填
124
+ if ((sur_name == null || sur_name === '') && (first_name == null || first_name === '')) {
125
+ const msgEmpty = 'Please fill in surname or given name';
126
+ this.setData({
127
+ sur_name_state: {
128
+ valid: false,
129
+ msg: msgEmpty
130
+ },
131
+ first_name_state: {
132
+ valid: false,
133
+ msg: msgEmpty
134
+ }
135
+ })
136
+ return {
137
+ valid: false,
138
+ msg: msgEmpty
139
+ }
140
+ }
141
+ this.setData({
142
+ sur_name_state: {
143
+ valid: true,
144
+ msg: ''
145
+ },
146
+ first_name_state: {
147
+ valid: false,
148
+ msg: ''
149
+ }
150
+ })
151
+ // 其中一个填了,或者两个都填了
152
+ let sur_name_flag = true
153
+ let msg = 'Please enter capital letters'
154
+ if (sur_name != null && sur_name !== '') {
155
+ const valid = utils.validate.checkName(sur_name, cidType)
156
+ if (valid.data) {
157
+ sur_name_flag = true
158
+ } else {
159
+ this.setData({
160
+ sur_name_state: {
161
+ valid: false,
162
+ msg
163
+ }
164
+ })
165
+ sur_name_flag = false
166
+ }
167
+ }
168
+ let first_name_flag = true
169
+ if (first_name != null && first_name !== '') {
170
+ const valid = utils.validate.checkName(first_name, cidType)
171
+ if (valid.data) {
172
+ first_name_flag = true
173
+ } else {
174
+ this.setData({
175
+ first_name_state: {
176
+ valid: false,
177
+ msg
178
+ }
179
+ })
180
+ first_name_flag = false
181
+ }
182
+ }
183
+ if (sur_name_flag && first_name_flag) {
184
+ this.setData({
185
+ sur_name_state: {
186
+ valid: true,
187
+ msg: ''
188
+ },
189
+ first_name_state: {
190
+ valid: false,
191
+ msg: ''
192
+ }
193
+ })
194
+ }
195
+ const valid = sur_name_flag && first_name_flag
196
+ return {
197
+ valid,
198
+ msg: valid ? '' : msg
199
+ }
200
+ },
201
+
202
+ // 自定义change事件,sur_name和first_name专用
203
+ handleCustomChange(e) {
204
+ let value = e.detail.value
205
+ let field = e.target.id
206
+ // 删除前后空格
207
+ if (typeof value === 'string') {
208
+ value = value.trim()
209
+ }
210
+ this.setData({
211
+ [`formData.${field}`]: value,
212
+ })
213
+ // 临时存储表单数据
214
+ this.saveFormDataTemp()
215
+ this.validateFullname()
216
+ },
217
+
218
+ // 关闭提示条
219
+ handleTipsClose(e) {
220
+ this.setData({
221
+ showCustomTips: e.detail.isShow
222
+ });
83
223
  },
84
224
 
85
225
  /**
@@ -93,6 +233,7 @@ Page({
93
233
  this.setData({
94
234
  needUnite: options.needUnite || 'true'
95
235
  })
236
+
96
237
  // 清空本地Temp数据
97
238
  wx.setStorageSync('tif.formDataTemp', '')
98
239
 
@@ -103,7 +244,7 @@ Page({
103
244
  // 生命周期函数--监听页面显示
104
245
  onShow: function () {
105
246
  wx.hideShareMenu()
106
-
247
+
107
248
  // 获取国籍
108
249
  let pages = getCurrentPages()
109
250
  let currentPage = pages[pages.length - 1]
@@ -145,7 +286,10 @@ Page({
145
286
  this.setData({
146
287
  canOpenPdf: false
147
288
  })
148
- let { name, file } = e.currentTarget.dataset
289
+ let {
290
+ name,
291
+ file
292
+ } = e.currentTarget.dataset
149
293
  console.log('文件地址', `https://js.jt.beijing.gov.cn/jt/tiffile/${file}.pdf`)
150
294
  utils.openDoc({
151
295
  url: `https://js.jt.beijing.gov.cn/jt/tiffile/${file}.pdf`,
@@ -177,7 +321,6 @@ Page({
177
321
  // 删除前后空格
178
322
  if (typeof value === 'string' && formId !== 'cid_type') {
179
323
  value = value.trim()
180
- console.log('==删除前后空格==', value, '==删除前后空格==')
181
324
  }
182
325
 
183
326
  this.setData({
@@ -189,7 +332,6 @@ Page({
189
332
 
190
333
  // 临时存储用户填写的表单信息
191
334
  saveFormDataTemp() {
192
- console.log('临时存储用户填写的表单信息')
193
335
  let {
194
336
  formData
195
337
  } = this.data
@@ -249,7 +391,9 @@ Page({
249
391
  },
250
392
  fail: err => {
251
393
  console.log('外国人护照核验接口获取失败', err)
252
- let { errmsg } = JSON.parse(err)
394
+ let {
395
+ errmsg
396
+ } = JSON.parse(err)
253
397
  wx.showToast({
254
398
  title: errmsg || '获取核验信息接口失败',
255
399
  icon: 'none',
@@ -270,20 +414,70 @@ Page({
270
414
  },
271
415
 
272
416
  async handleFormSubmit(e) {
273
- if (!e.detail.validStatus) {
417
+ const vid1 = this.validateFullname()
418
+ if (!e.detail.validStatus || !vid1.valid) {
419
+ // 如果自定义校验字段没问题,则跳过
420
+ if (vid1.valid) {
421
+ return
422
+ }
423
+ // 自定义校验字段没问题,获取表单错误列表
424
+ const formErrList = e.detail.value
425
+ // 计算是否单独弹出错误提示
426
+ let showCustomTips = false
427
+ if (formErrList && formErrList.length) {
428
+ showCustomTips = !formErrList.some(i => ["id_card_number", "nation"].includes(i.name))
429
+ } else {
430
+ showCustomTips = true
431
+ }
432
+ // 如果需要弹出,则弹出
433
+ if (showCustomTips) {
434
+ this.setData({
435
+ showCustomTips: true,
436
+ customTipsMsg: vid1.msg
437
+ }, () => {
438
+ // 3秒后关闭
439
+ setTimeout(() => {
440
+ this.setData({
441
+ showCustomTips: false,
442
+ customTipsMsg: ''
443
+ });
444
+ }, 3500);
445
+ })
446
+ }
274
447
  return
275
448
  }
449
+ this.setData({
450
+ showCustomTips: false,
451
+ customTipsMsg: ''
452
+ })
276
453
  wx.showLoading({
277
454
  title: '加载中…',
278
455
  mask: true
279
456
  })
280
457
 
281
458
  console.log('删除“姓名、证件号码、护照号码、手机号码”的前后空格')
282
- let { id_card_number, sur_name, first_name, phone, cid_type } = this.data.formData
283
-
459
+ let {
460
+ id_card_number,
461
+ sur_name,
462
+ first_name,
463
+ phone,
464
+ cid_type
465
+ } = this.data.formData
466
+ // sur_name值为空,增加空格
467
+ if (sur_name == null || sur_name === '') {
468
+ sur_name = ' '
469
+ } else {
470
+ sur_name = sur_name.trim()
471
+ }
472
+ // first_name值为空,增加空格
473
+ if (first_name == null || first_name === '') {
474
+ first_name = ' '
475
+ } else {
476
+ first_name = first_name.trim()
477
+ }
284
478
  this.setData({
285
- ['formData.sur_name']: sur_name.trim(),
286
- ['formData.first_name']: first_name.trim(),
479
+ ['formData.sur_name']: sur_name,
480
+ ['formData.first_name']: first_name,
287
481
  ['formData.phone']: phone.trim()
288
482
  })
289
483
 
@@ -294,7 +488,7 @@ Page({
294
488
  })
295
489
  }
296
490
  console.log('入参', this.data.formData)
297
-
491
+
298
492
  console.log('外国人护照核验')
299
493
  // 外国人护照核验
300
494
  this.handlePassortAuth()
@@ -391,11 +585,13 @@ Page({
391
585
  })
392
586
  return
393
587
  }
394
-
588
+
395
589
  const [err, res] = await utils.awaitTo(jingtongVerifyRequest.passportAuth(formData))
396
590
  if (err) {
397
591
  console.log('外国人护照核验接口认证失败', err)
398
- let { errmsg } = JSON.parse(err)
592
+ let {
593
+ errmsg
594
+ } = JSON.parse(err)
399
595
  wx.showToast({
400
596
  title: errmsg || '认证失败',
401
597
  icon: 'none',
@@ -435,7 +631,9 @@ Page({
435
631
  // 埋点上报事件:自然人登录
436
632
  this.loginTracker(2, this.data.formData.cid_type)
437
633
 
438
- let { errmsg } = JSON.parse(err)
634
+ let {
635
+ errmsg
636
+ } = JSON.parse(err)
439
637
  wx.showToast({
440
638
  title: errmsg || 'auth fail',
441
639
  icon: 'none',
@@ -457,7 +655,13 @@ Page({
457
655
  return
458
656
  }
459
657
 
460
- const { face_time, realname_time, cid, has_phone, certType } = session
658
+ const {
659
+ face_time,
660
+ realname_time,
661
+ cid,
662
+ has_phone,
663
+ certType
664
+ } = session
461
665
  if ((!face_time && !realname_time) || !cid) {
462
666
  wx.showToast({
463
667
  title: `Login has expired, please log in again: ${this.data.formData.cid_type}`,
@@ -468,7 +672,7 @@ Page({
468
672
  }
469
673
 
470
674
  wx.showToast({
471
- title: isEn ? 'Verification successful, redirecting...': '验证成功, 跳转中…',
675
+ title: isEn ? 'Verification successful, redirecting...' : '验证成功, 跳转中…',
472
676
  icon: 'none',
473
677
  duration: 5000,
474
678
  mask: true
@@ -598,7 +802,7 @@ Page({
598
802
  this.setData({
599
803
  modalStatus,
600
804
  showModal: true
601
- },() => {
805
+ }, () => {
602
806
  wx.hideLoading()
603
807
  })
604
808
  },
@@ -610,7 +814,7 @@ Page({
610
814
  })
611
815
  },
612
816
 
613
- onUnload: function() {
817
+ onUnload: function () {
614
818
  // 页面卸载时的逻辑处理
615
819
  console.log('======页面即将卸载======', this.data.hadSuccessLogin);
616
820
  if (!this.data.hadSuccessLogin) {
@@ -631,7 +835,7 @@ Page({
631
835
  }, 2000)
632
836
  },
633
837
 
634
- onSaveExitState: function() {
838
+ onSaveExitState: function () {
635
839
  // 小程序可能被销毁之前的逻辑处理
636
840
  if (!this.data.hadSuccessLogin && this.data.exitedState) {
637
841
  console.log('======小程序可能被销毁======')
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "usingComponents": {
3
+ "g-tips": "../../components/gsd-ui/g-tips/index",
3
4
  "g-form": "../../components/gsd-ui/g-form/index",
4
5
  "g-input": "../../components/gsd-ui/g-input/index",
5
6
  "g-picker": "../../components/gsd-ui/g-picker/index",
@@ -1,4 +1,9 @@
1
1
  <view class="en-page">
2
+ <view wx:if="showCustomTips" class="custom-tips">
3
+ <g-tips position="fixed" is-show="{{showCustomTips}}" status="warn" closeable catch:close="handleTipsClose">
4
+ {{customTipsMsg}}
5
+ </g-tips>
6
+ </view>
2
7
  <view class="top-box">
3
8
  <view class="img-box">
4
9
  <image src="../../images/Frame.png" mode="aspectFit" class="img"></image>
@@ -58,8 +63,10 @@
58
63
  placeholder=""
59
64
  value="{{ formData.sur_name }}"
60
65
  clearable="true"
61
- bind:change="handleChange"
66
+ _required="{{ false }}"
67
+ bind:input="handleCustomChange"
62
68
  />
69
+ <view wx:if="!sur_name_state.valid" class="form-item__status-message--warn">{{ sur_name_state.msg }}</view>
63
70
  </view>
64
71
 
65
72
  <view class="form-item-wrap">
@@ -69,8 +76,10 @@
69
76
  placeholder=""
70
77
  value="{{ formData.first_name }}"
71
78
  clearable="true"
72
- bind:change="handleChange"
79
+ _required="{{ false }}"
80
+ bind:input="handleCustomChange"
73
81
  />
82
+ <view wx:if="!first_name_state.valid" class="form-item__status-message--warn">{{ first_name_state.msg }}</view>
74
83
  </view>
75
84
 
76
85
  <view class="form-item-wrap">
@@ -45,4 +45,21 @@
45
45
 
46
46
  .content-box {
47
47
  padding-bottom: 60rpx;
48
+ }
49
+
50
+ .form-item__status-message--warn {
51
+ color: #f13939;
52
+ font-size: 30rpx;
53
+ line-height: 40rpx;
54
+ margin-top: 10rpx;
55
+ padding-left: 40rpx;
56
+ padding-right: 40rpx;
57
+ }
58
+
59
+ .custom-tips {
60
+ position: fixed;
61
+ z-index: 905;
62
+ box-sizing: border-box;
63
+ top: 0rpx;
64
+ width: 100%;
48
65
  }
@@ -207,6 +207,49 @@ const cardRules = (language) => {
207
207
  const ForeignPassortRules = (language) => {
208
208
  const rules = dict.rules.foreignerRules
209
209
  const { id_card_number, sur_name, first_name } = rules
210
+ return {
211
+ id_card_number: [
212
+ { type: 'required', message: `${id_card_number.required[language]}` },
213
+ { type: 'id_card_number', message: `${id_card_number.validate[language]}` }
214
+ ],
215
+ nation: [
216
+ { type: 'required', message: `${rules.nation.required[language]}` }
217
+ ],
218
+ // sur_name: [
219
+ // { type: 'required', message: `${sur_name.required[language]}` },
220
+ // { type: 'surName', message: `${sur_name.validate[language]}` }
221
+ // ],
222
+ // first_name: [
223
+ // { type: 'required', message: `${first_name.required[language]}` },
224
+ // { type: 'firstName', message: `${first_name.validate[language]}` }
225
+ // ],
226
+ sex: [
227
+ { type: 'required', message: `${rules.sex[language]}` }
228
+ ],
229
+ birthday: [
230
+ { type: 'required', message: `${rules.birthday[language]}` }
231
+ ],
232
+ cid_expire_date: [
233
+ { type: 'required', message: `${rules.cid_expire_date[language]}` }
234
+ ],
235
+ phone: [
236
+ { type: 'required', message: `${rules.phone.required[language]}` }
237
+ ],
238
+ verify_expire_time: [
239
+ { type: 'required', message: `${verify_expire_time.required[language]}` },
240
+ { type: 'verify_expire_time', message: `${verify_expire_time.required[language]}` }
241
+ ],
242
+ agree: [
243
+ { type: 'required', message: `${agree.required[language]}` },
244
+ { type: 'agree', message: `${agree.required[language]}` }
245
+ ]
246
+ }
247
+ }
248
+
249
+ // 外国人护照(人脸识别用)
250
+ const ForeignPassortRulesFace = (language) => {
251
+ const rules = dict.rules.foreignerRulesFace
252
+ const { id_card_number, sur_name, first_name } = rules
210
253
  return {
211
254
  id_card_number: [
212
255
  { type: 'required', message: `${id_card_number.required[language]}` },
@@ -252,6 +295,7 @@ module.exports = {
252
295
  residenceAuthRules,
253
296
  cardRules,
254
297
  ForeignPassortRules,
298
+ ForeignPassortRulesFace,
255
299
  HMPassRulesForeign,
256
300
  HMORulesMore,
257
301
  residenceRules