From c8804ceb1fe2dea76f9949c5ea04423876ee2c81 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 28 六月 2024 14:02:47 +0800
Subject: [PATCH] 2024-06-28

---
 src/mob/header/index.jsx                                                       |    4 
 src/views/design/header/index.jsx                                              |    4 
 src/tabviews/zshare/actionList/funcbutton/index.jsx                            |  202 +++++
 src/views/appcheck/index.jsx                                                   |    6 
 src/components/header/index.jsx                                                |    1 
 src/menu/components/share/actioncomponent/dragaction/card.jsx                  |    2 
 src/views/appmanage/transmenu/index.jsx                                        |    2 
 src/utils/utils-custom.js                                                      |   18 
 src/menu/components/card/cardcellcomponent/dragaction/action.jsx               |    2 
 src/templates/sharecomponent/actioncomponent/verifypay/customscript/index.jsx  |  224 ++++++
 src/templates/sharecomponent/actioncomponent/verifypay/index.scss              |   84 ++
 src/views/mkiframe/index.jsx                                                   |    2 
 src/menu/transfer/index.jsx                                                    |    3 
 src/templates/sharecomponent/actioncomponent/verifypay/customscript/index.scss |    0 
 src/templates/zshare/verifycard/fullScripts/index.jsx                          |    2 
 src/views/design/header/transmenu/index.jsx                                    |    4 
 src/views/tabledesign/index.jsx                                                |    6 
 src/menu/tablenodes/index.jsx                                                  |   11 
 src/tabviews/zshare/actionList/index.jsx                                       |    2 
 src/api/index.js                                                               |   40 
 src/tabviews/zshare/actionList/newpagebutton/index.jsx                         |  282 +++++++
 src/tabviews/zshare/actionList/normalbutton/index.jsx                          |   15 
 public/README.txt                                                              |    2 
 src/views/mobdesign/index.jsx                                                  |   11 
 src/views/menudesign/index.jsx                                                 |    4 
 src/index.js                                                                   |    7 
 src/tabviews/custom/components/card/cardcellList/index.jsx                     |    2 
 src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx             |    2 
 src/menu/components/card/cardcellcomponent/index.jsx                           |    7 
 src/views/pcdesign/index.jsx                                                   |    8 
 src/menu/components/share/actioncomponent/formconfig.jsx                       |  149 ++-
 src/templates/zshare/verifycard/index.jsx                                      |    2 
 src/menu/components/share/actioncomponent/index.jsx                            |    9 
 src/views/pay/index.jsx                                                        |   80 +-
 src/menu/components/share/actioncomponent/actionform/index.jsx                 |   80 +
 src/templates/sharecomponent/actioncomponent/verifypay/index.jsx               |  516 ++++++++++++++
 src/mob/header/index.scss                                                      |    7 
 src/views/appmanage/index.jsx                                                  |   72 +
 src/menu/debug/index.jsx                                                       |   54 +
 src/templates/zshare/verifycard/baseform/index.jsx                             |  133 ++
 src/views/appmanage/submutilform/index.jsx                                     |   36 
 src/views/design/sidemenu/thdmenuplus/index.jsx                                |    2 
 src/templates/sharecomponent/searchcomponent/searchform/index.jsx              |    2 
 43 files changed, 1,875 insertions(+), 226 deletions(-)

diff --git a/public/README.txt b/public/README.txt
index 6cbdae7..ab6579d 100644
--- a/public/README.txt
+++ b/public/README.txt
@@ -11,6 +11,8 @@
 defaultLang       -- 鎵撳紑鐨勫瓙搴旂敤璇█绫诲瀷锛岄粯璁や负zh-CN
 WXAppID           -- 浣跨敤鍏紬鍙锋椂锛岀粦瀹氱殑鍏紬鍙稩D
 WXminiAppID       -- 浣跨敤寰俊灏忕▼搴忔椂锛岀粦瀹氱殑灏忕▼搴廔D
+WXNotice          -- 鏄惁寮�鍚槑绉戜簯鍏紬鍙锋秷鎭彁閱掞紝鍊间负 true 鏃跺紑鍚紝鍙�氳繃鏄庣浜戝彂閫佹ā鏉挎秷鎭�
+WXApps            -- 瀛樺湪澶氫釜鍏紬鍙锋垨灏忕▼搴忔椂鍙娇鐢ㄥ井淇PP鍒楄〃锛屾敞鎰忓~鍐欓粯璁ゅ叕浼楀彿鎴栧皬绋嬪簭锛孾{"appId": "", "appName": "", "appType": "public/miniProgram"}]
 nginx             -- 鏄惁寮�鍚簡nginx鏈嶅姟锛屽�间负 true 鏃跺紑鍚紝濡傞渶浣跨敤寰俊妯℃澘娑堟伅绛夋湇鍔★紝璇峰厛璁剧疆nginx鏈嶅姟骞跺紑鍚閰嶇疆
 debugger          -- 鍊间负 true 鏃跺紑鍚皟璇曟ā寮忥紝寮�鍚悗绉诲姩绔瓙搴旂敤涓細鏈夋帶鍒跺彴
 licenseKey        -- 璁稿彲瀵嗛挜锛屽湪鍐呴儴缃戠粶涓娇鐢ㄧ郴缁熸椂锛屼細璺宠繃epc楠岃瘉
diff --git a/src/api/index.js b/src/api/index.js
index d700941..a2ca5e0 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -100,18 +100,18 @@
   /**
    * @description 寰俊涓氬姟璇锋眰 鍘熸帴鍙� 'wxpay/getaccesstoken'
    */
-  wxAccessToken (domain = '') {
+  wxAccessToken (appId, domain = '') {
     let _url = domain || window.GLOB.baseurl
 
     return new Promise(resolve => {
-      if (window.GLOB.accessToken.domain === domain && window.GLOB.accessToken.accessTime && (parseInt(new Date().getTime() / 1000) - window.GLOB.accessToken.accessTime < 30)) {
+      if (window.GLOB.accessToken.appId === appId && window.GLOB.accessToken.accessTime && (parseInt(new Date().getTime() / 1000) - window.GLOB.accessToken.accessTime < 30)) {
         resolve(window.GLOB.accessToken)
       } else {
-        window.GLOB.accessToken = {domain}
+        window.GLOB.accessToken = {appId}
         axios({
           url: _url + 'wechat/getaccesstoken',
           method: 'post',
-          data: JSON.stringify({app_id: domain === '' ? window.GLOB.WXAppID : 'wx4d8a34c8d4494872'})
+          data: JSON.stringify({app_id: appId})
         }).then(res => {
           if (res.access_token) {
             window.GLOB.accessToken.accessTime = parseInt(new Date().getTime() / 1000)
@@ -135,12 +135,12 @@
       if (process.env.NODE_ENV === 'production') {
         _url = document.location.origin + '/' + url
       }
-      if (/qingqiumarket.cn|cloud.mk9h.cn/.test(_url)) {
-        _url = _url.replace('http://qingqiumarket.cn/', 'http://qingqiumarket.cn:8080/')
-        _url = _url.replace('http://cloud.mk9h.cn/', 'http://cloud.mk9h.cn:8080/')
-        _url = _url.replace('https://qingqiumarket.cn/', 'https://qingqiumarket.cn:8443/')
-        _url = _url.replace('https://cloud.mk9h.cn/', 'https://cloud.mk9h.cn:8443/')
-      }
+    }
+    if (/qingqiumarket.cn|cloud.mk9h.cn/.test(_url)) {
+      _url = _url.replace('http://qingqiumarket.cn/', 'http://qingqiumarket.cn:8080/')
+      _url = _url.replace('http://cloud.mk9h.cn/', 'http://cloud.mk9h.cn:8080/')
+      _url = _url.replace('https://qingqiumarket.cn/', 'https://qingqiumarket.cn:8443/')
+      _url = _url.replace('https://cloud.mk9h.cn/', 'https://cloud.mk9h.cn:8443/')
     }
     
     if (param) {
@@ -1037,30 +1037,24 @@
   }
 
   /**
-   * @description 鑾峰彇寰俊鏀粯浜岀淮鐮�
+   * @description 鑾峰彇寰俊鏀粯浜岀淮鐮� 鍘熸帴鍙xpay/wxNativePay
    */
   getWxNativePay (param) {
-    let _url = window.GLOB.baseurl + 'wxpay/wxNativePay'
-
     return axios({
-      url: _url,
+      url: window.GLOB.baseurl + 'wechat/native',
       method: 'post',
-      data: qs.stringify(param)
+      data: JSON.stringify(param)
     })
   }
 
   /**
-   * @description 寰俊鏀粯閫�娆�
+   * @description 寰俊鏀粯閫�娆� 鍘熸帴鍙xpay/wxRefund
    */
-  setRefund (orderId) {
-    let _param = new FormData()
-    _param.append('out_biz_no', orderId)
-
+  setRefund (param) {
     return axios({
-      url: '/wxpay/wxRefund',
-      headers: { 'Content-Type': 'multipart/form-data' },
+      url: window.GLOB.baseurl + 'wechat/wxRefund',
       method: 'post',
-      data: _param
+      data: JSON.stringify(param)
     })
   }
 
diff --git a/src/components/header/index.jsx b/src/components/header/index.jsx
index 2204476..8cf0ff8 100644
--- a/src/components/header/index.jsx
+++ b/src/components/header/index.jsx
@@ -109,6 +109,7 @@
       setTimeout(() => {
         sessionStorage.clear()
         this.props.history.replace('/login')
+        window.location.reload()
       }, 2000)
     })
   }
diff --git a/src/index.js b/src/index.js
index dbc9c37..b1f8d21 100644
--- a/src/index.js
+++ b/src/index.js
@@ -59,6 +59,13 @@
     GLOB.style = 'bg_black_style_blue'
     GLOB.defLang = ''
 
+    if (config.WXApps) {
+      config.WXApps = config.WXApps.filter(app => app.appId && app.appName && ['public', 'miniProgram'].includes(app.appType))
+      if (config.WXApps.length) {
+        GLOB.WXApps = config.WXApps
+      }
+    }
+
     if (langs[config.defaultLang]) {
       GLOB.defLang = config.defaultLang
     }
diff --git a/src/menu/components/card/cardcellcomponent/dragaction/action.jsx b/src/menu/components/card/cardcellcomponent/dragaction/action.jsx
index 4db573b..44c1b19 100644
--- a/src/menu/components/card/cardcellcomponent/dragaction/action.jsx
+++ b/src/menu/components/card/cardcellcomponent/dragaction/action.jsx
@@ -48,6 +48,8 @@
     hasProfile = true
   } else if (card.OpenType === 'innerpage' && !card.pageTemplate) {
     warning = <WarningOutlined style={{color: 'orange', marginLeft: '5px'}}/>
+  } else if (card.payMode === 'system') {
+    hasProfile = true
   }
 
   let btnElement = null
diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx
index 50386cc..693f87a 100644
--- a/src/menu/components/card/cardcellcomponent/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/index.jsx
@@ -21,6 +21,7 @@
 const VerifyPrint = asyncComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyprint'))
 const VerifyExcelIn = asyncComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyexcelin'))
 const VerifyExcelOut = asyncComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyexcelout'))
+const VerifyPay = asyncComponent(() => import('@/templates/sharecomponent/actioncomponent/verifypay'))
 
 class CardCellComponent extends Component {
   static propTpyes = {
@@ -806,6 +807,12 @@
         columns={side === 'sub' ? cards.subColumns : cards.columns}
         wrappedComponentRef={(inst) => this.verifyRef = inst}
       />
+    } else if (card.payMode === 'system') {
+      return <VerifyPay
+        card={card}
+        columns={side === 'sub' ? cards.subColumns : cards.columns}
+        wrappedComponentRef={(inst) => this.verifyRef = inst}
+      />
     }
   }
 
diff --git a/src/menu/components/share/actioncomponent/actionform/index.jsx b/src/menu/components/share/actioncomponent/actionform/index.jsx
index 104c448..1c3c0e4 100644
--- a/src/menu/components/share/actioncomponent/actionform/index.jsx
+++ b/src/menu/components/share/actioncomponent/actionform/index.jsx
@@ -443,6 +443,15 @@
         reOptions.Ot = requireOptions
       } else if (this.record.pageTemplate === 'pay') {
         reOptions.Ot = requireOptions.filter(op => op.value === 'requiredSgl')
+
+        shows.push('payMode', 'wxApp')
+        if (this.record.payMode === 'inner') {
+          reRequired.innerFunc = true
+          shows.push('innerFunc')
+        }
+        if (this.record.payMode !== 'none') {
+          shows.push('output')
+        }
       }
     } else if (openType === 'funcbutton') {
       reOptions.intertype = this.state.interTypeOptions.filter(op => op.value !== 'custom')
@@ -511,14 +520,31 @@
 
         shows.push('innerFunc', 'Ot', 'execSuccess', 'execError', 'urlkey')
       } else if (_funcType === 'pay') {
-        shows.push('payType', 'Ot', 'execSuccess', 'execError', 'syncComponent', 'openmenu')
+        shows.push('payType', 'wxApp', 'Ot', 'execSuccess', 'execError', 'syncComponent', 'openmenu')
         if (this.record.openmenu && this.record.openmenu !== 'goback') {
           shows.push('open')
         }
         reOptions.Ot = requireOptions.filter(op => ['requiredSgl'].includes(op.value))
+        shows.push('payMode')
+        if (this.record.payMode === 'inner') {
+          reRequired.innerFunc = true
+          shows.push('innerFunc')
+        }
+        if (this.record.payMode !== 'none') {
+          shows.push('output')
+        }
       } else if (_funcType === 'refund') {
-        shows.push('Ot', 'execSuccess', 'execError', 'syncComponent', 'openmenu', 'tipTitle')
+        shows.push('Ot', 'wxApp', 'execSuccess', 'execError', 'syncComponent', 'openmenu', 'tipTitle')
         reOptions.Ot = requireOptions.filter(op => ['requiredSgl'].includes(op.value))
+
+        shows.push('payMode')
+        if (this.record.payMode === 'inner') {
+          reRequired.innerFunc = true
+          shows.push('innerFunc')
+        }
+        if (this.record.payMode !== 'none') {
+          shows.push('output')
+        }
       } else if (_funcType === 'shareLink') {
         shows.push('shortUrl', 'shareUrl', 'shareProUrl', 'shareTip')
       // } else if (_funcType === 'expPdf') {
@@ -856,22 +882,42 @@
             { max: 512, message: '鏈�澶�512涓瓧绗�' }
           )
         } else if (item.key === 'output') {
-          if (this.record.intertype === 'system' || ((this.record.intertype === 'outer' || this.record.intertype === 'custom') && this.record.callbackType === 'script')) {
-            rules = [{
-              pattern: /^@[0-9a-zA-Z_]+@?$/,
-              message: '鍙橀噺浠绗﹀紑澶达紝鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
-            }, {
-              max: 100,
-              message: '鏈�澶�100涓瓧绗︺��'
-            }]
+          if (['pop', 'prompt', 'exec'].includes(this.record.openType)) {
+            if (this.record.intertype === 'system' || ((this.record.intertype === 'outer' || this.record.intertype === 'custom') && this.record.callbackType === 'script')) {
+              rules = [{
+                pattern: /^@[0-9a-zA-Z_]+@?$/,
+                message: '鍙橀噺浠绗﹀紑澶达紝鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
+              }, {
+                max: 100,
+                message: '鏈�澶�100涓瓧绗︺��'
+              }]
+            } else {
+              rules = [{
+                pattern: /^[0-9a-zA-Z_]*$/,
+                message: '瀛楁鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
+              }, {
+                max: 100,
+                message: '鏈�澶�100涓瓧绗︺��'
+              }]
+            }
           } else {
-            rules = [{
-              pattern: /^[0-9a-zA-Z_]*$/,
-              message: '瀛楁鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
-            }, {
-              max: 100,
-              message: '鏈�澶�100涓瓧绗︺��'
-            }]
+            if (this.record.payMode === 'system') {
+              rules = [{
+                pattern: /^@[0-9a-zA-Z_]+@?$/,
+                message: '鍙橀噺浠绗﹀紑澶达紝鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
+              }, {
+                max: 100,
+                message: '鏈�澶�100涓瓧绗︺��'
+              }]
+            } else {
+              rules = [{
+                pattern: /^[0-9a-zA-Z_]*$/,
+                message: '瀛楁鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
+              }, {
+                max: 100,
+                message: '鏈�澶�100涓瓧绗︺��'
+              }]
+            }
           }
         } else {
           rules.push({ max: formRule.input.max, message: formRule.input.message })
diff --git a/src/menu/components/share/actioncomponent/dragaction/card.jsx b/src/menu/components/share/actioncomponent/dragaction/card.jsx
index a90472c..5955f56 100644
--- a/src/menu/components/share/actioncomponent/dragaction/card.jsx
+++ b/src/menu/components/share/actioncomponent/dragaction/card.jsx
@@ -46,6 +46,8 @@
     hasProfile = true
   } else if (card.funcType === 'megvii') {
     hasProfile = true
+  } else if (card.payMode === 'system') {
+    hasProfile = true
   }
 
   let btnElement = null
diff --git a/src/menu/components/share/actioncomponent/formconfig.jsx b/src/menu/components/share/actioncomponent/formconfig.jsx
index 1106bec..e9d1a30 100644
--- a/src/menu/components/share/actioncomponent/formconfig.jsx
+++ b/src/menu/components/share/actioncomponent/formconfig.jsx
@@ -222,6 +222,7 @@
     opentypes = opentypes.filter(item => item.value !== 'tab')
     funTypes = [
       { value: 'print', text: '鏍囩鎵撳嵃' },
+      { value: 'refund', text: '閫�娆�' },
     ]
     pageTemps = [
       { value: 'linkpage', text: '鍏宠仈鑿滃崟' },
@@ -421,20 +422,20 @@
       required: true,
       options: []
     },
-    {
-      type: 'checkbox',
-      key: 'payType',
-      label: '鏀粯鏂瑰紡',
-      initVal: card.payType || [],
-      required: true,
-      options: [{
-        value: 'wxpay',
-        text: '寰俊'
-      // }, {
-      //   value: 'alipay',
-      //   text: '鏀粯瀹�'
-      }]
-    },
+    // {
+    //   type: 'checkbox',
+    //   key: 'payType',
+    //   label: '鏀粯鏂瑰紡',
+    //   initVal: card.payType || [],
+    //   required: true,
+    //   options: [{
+    //     value: 'wxpay',
+    //     text: '寰俊'
+    //   // }, {
+    //   //   value: 'alipay',
+    //   //   text: '鏀粯瀹�'
+    //   }]
+    // },
     {
       type: 'radio',
       key: 'procMode',
@@ -470,15 +471,6 @@
     },
     {
       type: 'text',
-      key: 'innerFunc',
-      label: '鍐呴儴鍑芥暟',
-      initVal: card.innerFunc || '',
-      tooltip: functip,
-      fields: usefulFields,
-      required: false,
-    },
-    {
-      type: 'text',
       key: 'urlkey',
       label: '鍦板潃瀛楁',
       initVal: card.urlkey || '',
@@ -493,6 +485,43 @@
       initVal: card.pageTemplate || '',
       required: true,
       options: pageTemps
+    },
+    {
+      type: 'radio',
+      key: 'payMode',
+      label: '鍙傛暟澶勭悊',
+      initVal: card.payMode || 'none',
+      tooltip: '鏀粯锛堟垨閫�娆撅級鍗曞彿鐨勯澶勭悊鏂瑰紡銆�',
+      required: true,
+      options: [{
+        value: 'system',
+        text: '绯荤粺鍑芥暟'
+      }, {
+        value: 'inner',
+        text: '鍐呴儴鍑芥暟'
+      }, {
+        value: 'none',
+        text: '鏃�'
+      }]
+    },
+    {
+      type: 'select',
+      key: 'wxApp',
+      label: '鍏宠仈搴旂敤',
+      initVal: card.wxApp || '',
+      tooltip: '璇峰叧鑱旀敮浠橈紙鎴栭��娆撅級鐨勫叕浼楀彿鎴栧皬绋嬪簭銆�',
+      required: true,
+      forbid: !!appType || !window.GLOB.WXApps,
+      options: window.GLOB.WXApps ? window.GLOB.WXApps.map(item => ({value: item.appId, text: item.appName})) : []
+    },
+    {
+      type: 'text',
+      key: 'innerFunc',
+      label: '鍐呴儴鍑芥暟',
+      initVal: card.innerFunc || '',
+      tooltip: functip,
+      fields: usefulFields,
+      required: false,
     },
     {
       type: 'printTemps',
@@ -1795,20 +1824,20 @@
       required: true,
       options: []
     },
-    {
-      type: 'checkbox',
-      key: 'payType',
-      label: '鏀粯鏂瑰紡',
-      initVal: card.payType || [],
-      required: true,
-      options: [{
-        value: 'wxpay',
-        text: '寰俊'
-      // }, {
-      //   value: 'alipay',
-      //   text: '鏀粯瀹�'
-      }]
-    },
+    // {
+    //   type: 'checkbox',
+    //   key: 'payType',
+    //   label: '鏀粯鏂瑰紡',
+    //   initVal: card.payType || [],
+    //   required: true,
+    //   options: [{
+    //     value: 'wxpay',
+    //     text: '寰俊'
+    //   // }, {
+    //   //   value: 'alipay',
+    //   //   text: '鏀粯瀹�'
+    //   }]
+    // },
     {
       type: 'radio',
       key: 'procMode',
@@ -1844,15 +1873,6 @@
     },
     {
       type: 'text',
-      key: 'innerFunc',
-      label: '鍐呴儴鍑芥暟',
-      initVal: card.innerFunc || '',
-      tooltip: functip,
-      fields: usefulFields,
-      required: false,
-    },
-    {
-      type: 'text',
       key: 'urlkey',
       label: '鍦板潃瀛楁',
       initVal: card.urlkey || '',
@@ -1869,6 +1889,43 @@
       options: pageTemps
     },
     {
+      type: 'radio',
+      key: 'payMode',
+      label: '鍙傛暟澶勭悊',
+      initVal: card.payMode || 'none',
+      tooltip: '鏀粯锛堟垨閫�娆撅級鍗曞彿鐨勯澶勭悊鏂瑰紡銆�',
+      required: true,
+      options: [{
+        value: 'system',
+        text: '绯荤粺鍑芥暟'
+      }, {
+        value: 'inner',
+        text: '鍐呴儴鍑芥暟'
+      }, {
+        value: 'none',
+        text: '鏃�'
+      }]
+    },
+    {
+      type: 'select',
+      key: 'wxApp',
+      label: '鍏宠仈搴旂敤',
+      initVal: card.wxApp || '',
+      tooltip: '璇峰叧鑱旀敮浠橈紙鎴栭��娆撅級鐨勫叕浼楀彿鎴栧皬绋嬪簭銆�',
+      required: true,
+      forbid: !window.GLOB.WXApps,
+      options: window.GLOB.WXApps ? window.GLOB.WXApps.map(item => ({value: item.appId, text: item.appName})) : []
+    },
+    {
+      type: 'text',
+      key: 'innerFunc',
+      label: '鍐呴儴鍑芥暟',
+      initVal: card.innerFunc || '',
+      tooltip: functip,
+      fields: usefulFields,
+      required: false,
+    },
+    {
       type: 'printTemps',
       key: 'printTemp',
       label: '鎵撳嵃妯℃澘',
diff --git a/src/menu/components/share/actioncomponent/index.jsx b/src/menu/components/share/actioncomponent/index.jsx
index 27bde39..77d657a 100644
--- a/src/menu/components/share/actioncomponent/index.jsx
+++ b/src/menu/components/share/actioncomponent/index.jsx
@@ -20,6 +20,7 @@
 const VerifyExcelIn = asyncSpinComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyexcelin'))
 const VerifyExcelOut = asyncSpinComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyexcelout'))
 const VerifyMegvii = asyncSpinComponent(() => import('@/templates/sharecomponent/actioncomponent/verifymegvii'))
+const VerifyPay = asyncSpinComponent(() => import('@/templates/sharecomponent/actioncomponent/verifypay'))
 
 class ActionComponent extends Component {
   static propTpyes = {
@@ -524,7 +525,7 @@
   verifySubmit = () => {
     const { config } = this.props
     const { card } = this.state
-    
+
     this.verifyRef.handleConfirm().then(res => {
       let _actionlist = fromJS(this.state.actionlist).toJS()
       _actionlist = _actionlist.filter(item => !item.origin || item.uuid === card.uuid)
@@ -698,6 +699,12 @@
         columns={config.columns}
         wrappedComponentRef={(inst) => this.verifyRef = inst}
       />
+    } else if (card.payMode === 'system') {
+      return <VerifyPay
+        card={card}
+        columns={config.columns}
+        wrappedComponentRef={(inst) => this.verifyRef = inst}
+      />
     }
   }
 
diff --git a/src/menu/debug/index.jsx b/src/menu/debug/index.jsx
index 737fd3e..6cf383d 100644
--- a/src/menu/debug/index.jsx
+++ b/src/menu/debug/index.jsx
@@ -439,6 +439,12 @@
     } else if (cell.OpenType === 'funcbutton') {
       if (cell.funcType === 'print') {
 
+      } else if ((cell.funcType === 'refund' || cell.funcType === 'pay') && cell.payMode === 'system') {
+        sql = this.getPaySql(cell, item)
+      }
+    } else if (cell.OpenType === 'innerpage' || cell.OpenType === 'outerpage') {
+      if (cell.pageTemplate === 'pay' && cell.payMode === 'system') {
+        sql = this.getPaySql(cell, item)
       }
     } else if (cell.OpenType === 'popview') {
       if (cell.config && cell.config.components) {
@@ -1896,6 +1902,54 @@
     return sql
   }
 
+  getPaySql = (btn, component) => {
+    let sysfields = ['username', 'fullname', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'tbid', 'bid']
+    let _declare = []
+    let _select = []
+    
+    component.columns.forEach(_f => {
+      if (sysfields.includes(_f.field.toLowerCase())) return
+
+      if (/decimal|int/ig.test(_f.datatype)) {
+        _select.push(`@${_f.field}=1`)
+      } else if (/date/ig.test(_f.datatype)) {
+        _select.push(`@${_f.field}='1949-10-01'`)
+      } else {
+        _select.push(`@${_f.field}=''`)
+      }
+
+      _declare.push(`@${_f.field} ${_f.datatype}`)
+    })
+
+    _declare = _declare.join(', ')
+    _select = _select.join(', ')
+
+    let _sql = `Declare @UserName nvarchar(50), @FullName nvarchar(50), @RoleID nvarchar(512), @mk_departmentcode nvarchar(512), @mk_organization nvarchar(512), @mk_user_type nvarchar(20), @mk_nation nvarchar(50), @mk_province nvarchar(50), @mk_city nvarchar(50), @mk_district nvarchar(50), @mk_address nvarchar(100), @ErrorCode nvarchar(50), @retmsg nvarchar(4000), @bid nvarchar(50), @tbid nvarchar(50), ${_declare}
+    Select @UserName='', @FullName='', @RoleID='', @mk_departmentcode='', @mk_organization='', @mk_user_type='', @mk_nation='', @mk_province='', @mk_city='', @mk_district='', @mk_address='', @ErrorCode='', @retmsg='', @bid='', ${_select}
+    `
+
+    btn.verify.scripts.forEach(item => {
+      if (item.status === 'false') return
+
+      _sql += `
+      ${item.sql}
+      `
+    })
+
+    if (btn.output) {
+      _sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${btn.output} as mk_b_id`
+    } else {
+      _sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+    }
+
+    _sql = _sql.replace(/@typename@/ig, `'typename'`)
+    _sql = _sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
+
+    return _sql
+  }
+
   formatDataSource = (item, regs, mainSearch = []) => {
     if (!item.setting || item.setting.interType !== 'system') return false
     
diff --git a/src/menu/tablenodes/index.jsx b/src/menu/tablenodes/index.jsx
index 12951c2..4174e4d 100644
--- a/src/menu/tablenodes/index.jsx
+++ b/src/menu/tablenodes/index.jsx
@@ -485,9 +485,12 @@
                 if (m.debug_url) {
                   let _param = JSON.parse(window.decodeURIComponent(window.atob(m.debug_url)))
                   let label = _param.MenuName
+                  _param.lang = _param.lang || 'zh-CN'
 
                   if (_param && _param.type === 'app') {
-                    label += ` (${_param.kei_no} | ${_param.typename}${param.lang !== 'zh-CN' ? ' | ' + param.lang : ''})`
+                    label += ` (${_param.kei_no} | ${_param.typename}${_param.lang !== 'zh-CN' ? ' | ' + _param.lang : ''})`
+                  } else if (_param && _param.lang && _param.lang !== 'zh-CN') {
+                    label += ` (${_param.lang})`
                   }
 
                   cell.children.push({
@@ -534,7 +537,7 @@
       }, 50)
     } else if (menu.param) {
       if (menu.param.type === 'admin') {
-        if (menu.param.MenuType === 'custom') {
+        if (['custom', 'home', 'billPrint'].includes(menu.param.MenuType)) {
           let _param = {...menu.param}
           delete _param.type
           _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
@@ -548,11 +551,11 @@
         }
       } else if (menu.param.type === 'app') {
         if (menu.param.typename !== 'pc') {
-          let _param = {...menu.param, lang: sessionStorage.getItem('lang')}
+          let _param = {...menu.param}
           _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
           window.open(`#/mobdesign/${_param}`)
         } else {
-          let _param = {...menu.param, lang: sessionStorage.getItem('lang')}
+          let _param = {...menu.param}
           _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
           window.open(`#/pcdesign/${_param}`)
         }
diff --git a/src/menu/transfer/index.jsx b/src/menu/transfer/index.jsx
index 1919b20..f4fa0e0 100644
--- a/src/menu/transfer/index.jsx
+++ b/src/menu/transfer/index.jsx
@@ -218,7 +218,8 @@
       type: 'admin',
       OpenType: _config.OpenType,
       PageParam: {Template: 'CustomPage', OpenType: 'newtab', hidden: _config.hidden},
-      MenuType: 'custom'
+      MenuType: 'custom',
+      lang: sessionStorage.getItem('lang')
     }
 
     let url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam)))
diff --git a/src/mob/header/index.jsx b/src/mob/header/index.jsx
index 6d61f1f..7d372fb 100644
--- a/src/mob/header/index.jsx
+++ b/src/mob/header/index.jsx
@@ -1,5 +1,6 @@
 import React, {Component} from 'react'
 
+import { langs } from '@/store/options.js'
 import avatar from '@/assets/img/avatar.jpg'
 import MainLogo from '@/assets/img/main-logo.png'
 import './index.scss'
@@ -13,10 +14,13 @@
 
   render () {
     const { logo } = this.state
+    let lang = sessionStorage.getItem('lang')
+    lang = lang !== 'zh-CN' ? langs[lang] || '' : ''
 
     return (
       <header className="mob-header-container">
         <div className="header-logo"><img src={logo} alt=""/></div>
+        <span className="lang">{lang}</span>
         <div className="header-user">
           <img src={this.state.avatar} alt=""/>
           <span>
diff --git a/src/mob/header/index.scss b/src/mob/header/index.scss
index b4009e2..2f9cd6e 100644
--- a/src/mob/header/index.scss
+++ b/src/mob/header/index.scss
@@ -9,6 +9,13 @@
   background: #001529;
   border-bottom: 1px solid #000;
 
+  .lang {
+    position: absolute;
+    font-size: 18px;
+    left: calc(50% - 12px);
+    top: 10px;
+    color: #ffffff;
+  }
   .header-logo {
     float: left;
     width: 180px;
diff --git a/src/tabviews/custom/components/card/cardcellList/index.jsx b/src/tabviews/custom/components/card/cardcellList/index.jsx
index 8d44dbb..ba48a45 100644
--- a/src/tabviews/custom/components/card/cardcellList/index.jsx
+++ b/src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -1235,6 +1235,7 @@
             name={name}
             BID={data.$$BID}
             LID={lid}
+            columns={cards.columns}
             BData={data.$$BData || ''}
             disabled={_disabled}
             selectedData={_data}
@@ -1297,6 +1298,7 @@
               disabled={_disabled}
               LID={lid}
               btn={card}
+              columns={cards.columns}
               selectedData={_data}
             />
           }
diff --git a/src/tabviews/zshare/actionList/funcbutton/index.jsx b/src/tabviews/zshare/actionList/funcbutton/index.jsx
index 10786db..995c55d 100644
--- a/src/tabviews/zshare/actionList/funcbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/funcbutton/index.jsx
@@ -2,9 +2,11 @@
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
 import { Button, notification, message, Modal } from 'antd'
+import moment from 'moment'
 import md5 from 'md5'
 
 import Api from '@/api'
+import Utils from '@/utils/utils.js'
 import MKEmitter from '@/utils/events.js'
 import MkIcon from '@/components/mk-icon'
 
@@ -165,21 +167,207 @@
         okText: dict['ok'] || '纭畾',
         cancelText: dict['cancel'] || '鍙栨秷',
         onOk() {
-          that.execRefund(orderId)
+          that.execRefund(orderId, data[0])
         },
         onCancel() {}
       })
     }
   }
 
-  execRefund = (orderId) => {
-    Api.setRefund(orderId).then(res => {
-      if (!res.status) {
-        this.execError({ErrCode: 'E', message: window.GLOB.dict['exc_fail'] || '鎵ц澶辫触锛�', ...res})
-      } else {
-        this.execSuccess({ErrCode: 'S', ...res})
+  execRefund = (orderId, data) => {
+    const { btn, BID } = this.props
+
+    let param = null
+    if (btn.payMode === 'inner') {
+      param = {
+        func: btn.innerFunc || '',
+        BID: BID || '',
+        username: sessionStorage.getItem('User_Name') || '',
+        fullname: sessionStorage.getItem('Full_Name') || '',
+        dataM: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
+        ID: orderId
       }
+    } else if (btn.payMode === 'system') {
+      let sql = this.getSysDeclareSql(orderId, data)
+
+      param = {
+        func: 'sPC_TableData_InUpDe',
+        BID: BID || '',
+        exec_type: window.GLOB.execType || 'y',
+        timestamp: moment().format('YYYY-MM-DD HH:mm:ss')
+      }
+
+      param.secretkey = Utils.encrypt('', param.timestamp)
+      param.LText = Utils.formatOptions(sql, param.exec_type)
+
+      if (btn.output) {
+        param.key_back_type = 'Y'
+      }
+
+      if (window.GLOB.mkHS) { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
+        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
+      }
+
+      param.menuname = btn.logLabel
+
+      if (window.GLOB.probation) {
+        param.s_debug_type = 'Y'
+      }
+    }
+
+    let appId = window.GLOB.WXAppID || window.GLOB.WXminiAppID || ''
+
+    if (btn.wxApp && window.GLOB.WXApps && window.GLOB.WXApps.findIndex(item => item.appId === btn.wxApp) > -1) {
+      appId = btn.wxApp
+    }
+    
+    if (!appId) {
+      notification.warning({
+        top: 10,
+        message: '鏈幏鍙栧埌搴旂敤ID锛�',
+        duration: 5
+      })
+      return
+    }
+
+    this.setState({loading: true})
+
+    if (param) {
+      Api.genericInterface(param).then(res => {
+        if (res.status) {
+          let id = orderId
+          if (btn.output) {
+            id = res.mk_b_id || res[btn.output] || orderId
+          }
+
+          Api.setRefund({out_biz_no: id, app_id: appId}).then(res => {
+            if (!res.status) {
+              this.execError({ErrCode: 'E', message: res.message || window.GLOB.dict['exc_fail'] || '鎵ц澶辫触锛�', ...res})
+            } else {
+              this.execSuccess({ErrCode: 'S', ...res})
+            }
+          })
+        } else {
+          this.execError(res)
+        }
+      })
+    } else {
+      Api.setRefund({out_biz_no: orderId, app_id: appId}).then(res => {
+        if (!res.status) {
+          this.execError({ErrCode: 'E', message: res.message || window.GLOB.dict['exc_fail'] || '鎵ц澶辫触锛�', ...res})
+        } else {
+          this.execSuccess({ErrCode: 'S', ...res})
+        }
+      })
+    }
+  }
+
+  getSysDeclareSql = (ID, data) => {
+    const { columns, btn, BID } = this.props
+
+    // 绯荤粺鍙橀噺
+    let _vars = ['tbid', 'errorcode', 'retmsg', 'username', 'fullname', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'bid']
+    let _declare = []
+    let _initVal = []
+  
+    let _data = {}
+    Object.keys(data).forEach(key => {
+      _data[key.toLowerCase()] = data[key]
     })
+  
+    columns.forEach(col => {
+      let _key = col.field.toLowerCase()
+
+      if (_vars.includes(_key)) return
+
+      _declare.push(`@${_key} ${col.datatype}`)
+
+      let _val = _data.hasOwnProperty(_key) ? _data[_key] : ''
+
+      if (/^date/ig.test(col.datatype) && !_val) {
+        _val = '1949-10-01'
+      }
+
+      if (/'/.test(_val)) {
+        _val = _val.replace(/'/ig, '"')
+      }
+
+      _initVal.push(`@${_key}='${_val}'`)
+    })
+  
+    // 鍙橀噺澹版槑
+    _declare = _declare.join(',')
+    if (_declare) {
+      _declare = ',' + _declare
+    }
+
+    let _sql = `/* 绯荤粺鐢熸垚 */
+      Declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000), @UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100),@bid nvarchar(50),@tbid nvarchar(50)${_declare}
+    `
+  
+    let userName = sessionStorage.getItem('User_Name') || ''
+    let fullName = sessionStorage.getItem('Full_Name') || ''
+    let RoleID = sessionStorage.getItem('role_id') || ''
+    let departmentcode = sessionStorage.getItem('departmentcode') || ''
+    let organization = sessionStorage.getItem('organization') || ''
+    let mk_user_type = sessionStorage.getItem('mk_user_type') || ''
+    let nation = sessionStorage.getItem('nation') || ''
+    let province = sessionStorage.getItem('province') || ''
+    let city = sessionStorage.getItem('city') || ''
+    let district = sessionStorage.getItem('district') || ''
+    let address = sessionStorage.getItem('address') || ''
+  
+    // 鍒濆鍖栧嚟璇佸強鐢ㄦ埛淇℃伅瀛楁
+    _sql += `
+      /* 鐢ㄦ埛淇℃伅鍒濆鍖栬祴鍊� */
+      select @ErrorCode='',@retmsg='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}', @bid='${BID}'
+    `
+    _sql += `
+      /* 鏄剧ず鍒楀彉閲忚祴鍊� */
+      select ${_initVal.join(',')}
+    `
+
+    btn.verify.scripts.forEach(item => {
+      if (item.status === 'false') return
+
+      _sql += `
+      ${item.sql}
+      `
+    })
+
+    if (btn.output) {
+      _sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${btn.output} as mk_b_id`
+    } else {
+      _sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+    }
+
+    _sql = _sql.replace(/@ID@/ig, `'${ID || ''}'`)
+    _sql = _sql.replace(/@BID@/ig, `'${BID || ''}'`)
+    _sql = _sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
+    _sql = _sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
+    _sql = _sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
+    _sql = _sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
+    _sql = _sql.replace(/@lang@/ig, `'${sessionStorage.getItem('lang')}'`)
+    _sql = _sql.replace(/@typename@/ig, `'admin'`)
+
+    if (window.GLOB.externalDatabase !== null) {
+      _sql = _sql.replace(/@db@/ig, window.GLOB.externalDatabase)
+    }
+
+    if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
+      _sql = _sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, `'Y'`)
+    } else {
+      _sql = _sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
+    }
+
+    if (window.GLOB.debugger === true) {
+      console.info('%c' + btn.logLabel, 'color: blue')
+      console.info(_sql)
+    }
+
+    return _sql
   }
 
   getShortUrl = (url) => {
diff --git a/src/tabviews/zshare/actionList/index.jsx b/src/tabviews/zshare/actionList/index.jsx
index d0a7bd4..8948d0c 100644
--- a/src/tabviews/zshare/actionList/index.jsx
+++ b/src/tabviews/zshare/actionList/index.jsx
@@ -134,6 +134,7 @@
             BID={BID}
             btn={item}
             BData={BData}
+            columns={columns}
             selectedData={selectedData}
           />
         )
@@ -213,6 +214,7 @@
               key={item.uuid}
               BID={BID}
               btn={item}
+              columns={columns}
               selectedData={selectedData}
             />
           )
diff --git a/src/tabviews/zshare/actionList/newpagebutton/index.jsx b/src/tabviews/zshare/actionList/newpagebutton/index.jsx
index 55bdf19..1c7f2bb 100644
--- a/src/tabviews/zshare/actionList/newpagebutton/index.jsx
+++ b/src/tabviews/zshare/actionList/newpagebutton/index.jsx
@@ -1,8 +1,11 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Button, notification, Modal } from 'antd'
+import { Button, notification, Modal, message } from 'antd'
+import moment from 'moment'
 
+import Api from '@/api'
+import Utils from '@/utils/utils.js'
 import MKEmitter from '@/utils/events.js'
 import MkIcon from '@/components/mk-icon'
 import './index.scss'
@@ -21,8 +24,10 @@
 
   state = {
     disabled: false,
+    loading: false,
     hidden: false,
-    visible: false
+    visible: false,
+    dict: window.GLOB.dict
   }
 
   UNSAFE_componentWillMount () {
@@ -102,7 +107,7 @@
    */
   actionTrigger = (triggerId, record, type, lid) => {
     const { btn, selectedData, BID, LID } = this.props
-    const { disabled } = this.state
+    const { disabled, dict } = this.state
 
     if (disabled) return
     if (triggerId && btn.uuid !== triggerId) return
@@ -114,7 +119,7 @@
       // 闇�瑕侀�夋嫨琛屾椂锛屾牎楠屾暟鎹�
       notification.warning({
         top: 92,
-        message: window.GLOB.dict['select_row'] || '璇烽�夋嫨琛岋紒',
+        message: dict['select_row'] || '璇烽�夋嫨琛岋紒',
         duration: 5
       })
       return
@@ -122,14 +127,14 @@
       // 闇�瑕侀�夋嫨鍗曡鏃讹紝鏍¢獙鏁版嵁
       notification.warning({
         top: 92,
-        message: window.GLOB.dict['select_single_row'] || '璇烽�夋嫨鍗曡鏁版嵁锛�',
+        message: dict['select_single_row'] || '璇烽�夋嫨鍗曡鏁版嵁锛�',
         duration: 5
       })
       return
     } else if (btn.pageTemplate === 'custom' && window.GLOB.systemType === 'production' && !btn.proUrl) {
       notification.warning({
         top: 92,
-        message: window.GLOB.dict['no_prod_link'] || '灏氭湭璁剧疆姝e紡绯荤粺閾炬帴鍦板潃锛�',
+        message: dict['no_prod_link'] || '灏氭湭璁剧疆姝e紡绯荤粺閾炬帴鍦板潃锛�',
         duration: 5
       })
       return
@@ -234,25 +239,34 @@
       let src = '#/print/' + window.btoa(window.encodeURIComponent(JSON.stringify({ ID: Id, lang })))
       window.open(src)
     } else if (btn.pageTemplate === 'pay') {
-      let _p = `ID=${Id}&userid=${sessionStorage.getItem('UserID')}&LoginUID=${sessionStorage.getItem('LoginUID')}&logo=${window.GLOB.doclogo}&name=${sessionStorage.getItem('Full_Name')}&icp=${window.GLOB.ICP}&copyRight=${window.GLOB.copyRight}`
-      let url = '#/pay/' +  window.btoa(window.encodeURIComponent(_p))
       _name = '鏀粯'
-      
-      confirm({
-        title: '璇峰湪浠樻椤甸潰瀹屾垚璁㈠崟鏀粯銆�',
-        content: '',
-        className: 'pay-query',
-        okText: '鏀粯鎴愬姛',
-        cancelText: '鏀粯閬囧埌闂',
-        onOk() {
-          // 鏀粯鍚庡埛鏂扮晫闈�
-          MKEmitter.emit('reloadMenuView', btn.$MenuID)
-        },
-        onCancel() {
-          MKEmitter.emit('refreshByButtonResult', btn.$menuId, 'grid', btn)
-        },
-      })
-      window.open(url)
+
+      if (btn.payMode === 'system' || btn.payMode === 'inner') {
+        this.prequest(Id, data[0] || {})
+      } else {
+        confirm({
+          title: '璇峰湪浠樻椤甸潰瀹屾垚璁㈠崟鏀粯銆�',
+          content: '',
+          className: 'pay-query',
+          okText: '鏀粯鎴愬姛',
+          cancelText: '鏀粯閬囧埌闂',
+          onOk() {
+            // 鏀粯鍚庡埛鏂扮晫闈�
+            MKEmitter.emit('reloadMenuView', btn.$MenuID)
+          },
+          onCancel() {
+            MKEmitter.emit('refreshByButtonResult', btn.$menuId, 'grid', btn)
+          },
+        })
+
+        let appId = ''
+
+        if (btn.wxApp && window.GLOB.WXApps && window.GLOB.WXApps.findIndex(item => item.appId === btn.wxApp) > -1) {
+          appId = btn.wxApp
+        }
+
+        window.open('#/pay/' + window.btoa(window.encodeURIComponent(JSON.stringify({ ID: Id, appId: appId }))))
+      }
     } else if (btn.pageTemplate === 'custom') {
       let url = btn.url
       if (window.GLOB.systemType === 'production') {
@@ -309,9 +323,226 @@
     }
   }
 
+  prequest = (ID, data) => {
+    const { btn, BID } = this.props
+
+    let param = null
+    if (btn.payMode === 'inner') {
+      param = {
+        func: btn.innerFunc || '',
+        BID: BID || '',
+        username: sessionStorage.getItem('User_Name') || '',
+        fullname: sessionStorage.getItem('Full_Name') || '',
+        dataM: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
+        ID: ID
+      }
+    } else {
+      let sql = this.getSysDeclareSql(ID, data)
+
+      param = {
+        func: 'sPC_TableData_InUpDe',
+        BID: BID || '',
+        exec_type: window.GLOB.execType || 'y',
+        timestamp: moment().format('YYYY-MM-DD HH:mm:ss')
+      }
+
+      param.secretkey = Utils.encrypt('', param.timestamp)
+      param.LText = Utils.formatOptions(sql, param.exec_type)
+
+      if (btn.output) {
+        param.key_back_type = 'Y'
+      }
+
+      if (window.GLOB.mkHS) { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
+        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
+      }
+
+      param.menuname = btn.logLabel
+
+      if (window.GLOB.probation) {
+        param.s_debug_type = 'Y'
+      }
+    }
+
+    this.setState({loading: true})
+    Api.genericInterface(param).then(res => {
+      this.setState({loading: false})
+      if (res.status) {
+        let id = ID
+        if (btn.output) {
+          id = res.mk_b_id || res[btn.output] || ID
+        }
+
+        confirm({
+          title: '璇峰湪浠樻椤甸潰瀹屾垚璁㈠崟鏀粯銆�',
+          content: '',
+          className: 'pay-query',
+          okText: '鏀粯鎴愬姛',
+          cancelText: '鏀粯閬囧埌闂',
+          onOk() {
+            // 鏀粯鍚庡埛鏂扮晫闈�
+            MKEmitter.emit('reloadMenuView', btn.$MenuID)
+          },
+          onCancel() {
+            MKEmitter.emit('refreshByButtonResult', btn.$menuId, 'grid', btn)
+          },
+        })
+
+        let appId = ''
+
+        if (btn.wxApp && window.GLOB.WXApps && window.GLOB.WXApps.findIndex(item => item.appId === btn.wxApp) > -1) {
+          appId = btn.wxApp
+        }
+
+        window.open('#/pay/' + window.btoa(window.encodeURIComponent(JSON.stringify({ ID: id, appId: appId }))))
+      } else {
+        this.execError(res)
+      }
+    })
+  }
+
+  getSysDeclareSql = (ID, data) => {
+    const { columns, btn, BID } = this.props
+
+    // 绯荤粺鍙橀噺
+    let _vars = ['tbid', 'errorcode', 'retmsg', 'username', 'fullname', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'bid']
+    let _declare = []
+    let _initVal = []
+  
+    let _data = {}
+    Object.keys(data).forEach(key => {
+      _data[key.toLowerCase()] = data[key]
+    })
+  
+    columns.forEach(col => {
+      let _key = col.field.toLowerCase()
+
+      if (_vars.includes(_key)) return
+
+      _declare.push(`@${_key} ${col.datatype}`)
+
+      let _val = _data.hasOwnProperty(_key) ? _data[_key] : ''
+
+      if (/^date/ig.test(col.datatype) && !_val) {
+        _val = '1949-10-01'
+      }
+
+      if (/'/.test(_val)) {
+        _val = _val.replace(/'/ig, '"')
+      }
+
+      _initVal.push(`@${_key}='${_val}'`)
+    })
+  
+    // 鍙橀噺澹版槑
+    _declare = _declare.join(',')
+    if (_declare) {
+      _declare = ',' + _declare
+    }
+
+    let _sql = `/* 绯荤粺鐢熸垚 */
+      Declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000), @UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100),@bid nvarchar(50),@tbid nvarchar(50)${_declare}
+    `
+  
+    let userName = sessionStorage.getItem('User_Name') || ''
+    let fullName = sessionStorage.getItem('Full_Name') || ''
+    let RoleID = sessionStorage.getItem('role_id') || ''
+    let departmentcode = sessionStorage.getItem('departmentcode') || ''
+    let organization = sessionStorage.getItem('organization') || ''
+    let mk_user_type = sessionStorage.getItem('mk_user_type') || ''
+    let nation = sessionStorage.getItem('nation') || ''
+    let province = sessionStorage.getItem('province') || ''
+    let city = sessionStorage.getItem('city') || ''
+    let district = sessionStorage.getItem('district') || ''
+    let address = sessionStorage.getItem('address') || ''
+  
+    // 鍒濆鍖栧嚟璇佸強鐢ㄦ埛淇℃伅瀛楁
+    _sql += `
+      /* 鐢ㄦ埛淇℃伅鍒濆鍖栬祴鍊� */
+      select @ErrorCode='',@retmsg='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}', @bid='${BID}'
+    `
+    _sql += `
+      /* 鏄剧ず鍒楀彉閲忚祴鍊� */
+      select ${_initVal.join(',')}
+    `
+
+    btn.verify.scripts.forEach(item => {
+      if (item.status === 'false') return
+
+      _sql += `
+      ${item.sql}
+      `
+    })
+
+    if (btn.output) {
+      _sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${btn.output} as mk_b_id`
+    } else {
+      _sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+    }
+
+    _sql = _sql.replace(/@ID@/ig, `'${ID || ''}'`)
+    _sql = _sql.replace(/@BID@/ig, `'${BID || ''}'`)
+    _sql = _sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
+    _sql = _sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
+    _sql = _sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
+    _sql = _sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
+    _sql = _sql.replace(/@lang@/ig, `'${sessionStorage.getItem('lang')}'`)
+    _sql = _sql.replace(/@typename@/ig, `'admin'`)
+
+    if (window.GLOB.externalDatabase !== null) {
+      _sql = _sql.replace(/@db@/ig, window.GLOB.externalDatabase)
+    }
+
+    if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
+      _sql = _sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, `'Y'`)
+    } else {
+      _sql = _sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
+    }
+
+    if (window.GLOB.debugger === true) {
+      console.info('%c' + btn.logLabel, 'color: blue')
+      console.info(_sql)
+    }
+
+    return _sql
+  }
+
+  execError = (res) => {
+    const { btn } = this.props
+    const { dict } = this.state
+
+    if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
+      res.ErrCode = 'E'
+    }
+
+    if (res.ErrCode === 'E') {
+      Modal.error({
+        title: res.message || dict['exc_fail'] || '鎵ц澶辫触锛�',
+        okText: dict['got_it'] || '鐭ラ亾浜�'
+      })
+    } else if (res.ErrCode === 'N') {
+      notification.error({
+        top: 92,
+        message: res.message || dict['exc_fail'] || '鎵ц澶辫触锛�',
+        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
+      })
+    } else if (res.ErrCode === 'F') {
+      notification.error({
+        className: 'notification-custom-error',
+        top: 92,
+        message: res.message || dict['exc_fail'] || '鎵ц澶辫触锛�',
+        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
+      })
+    } else if (res.ErrCode === 'NM') {
+      message.error(res.message || dict['exc_fail'] || '鎵ц澶辫触锛�')
+    }
+  }
+
   render() {
     const { btn, name } = this.props
-    const { disabled, hidden } = this.state
+    const { disabled, hidden, loading } = this.state
 
     if (hidden) return null
 
@@ -331,6 +562,7 @@
         id={'button' + btn.uuid}
         title={disabled ? (btn.reason || '') : (btn.show === 'icon' ? btn.label : '')}
         style={btn.style || null}
+        loading={loading}
         disabled={disabled}
         className={btn.hover || ''}
         onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 9a6ee18..c4b526d 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -2553,8 +2553,15 @@
 
   sendWxMessage = (verify, id) => {
     let domain = ''
+    let appId = window.GLOB.WXAppID || ''
+
+    if (verify.wxAppId && window.GLOB.WXApps && window.GLOB.WXApps.findIndex(item => item.appId === verify.wxAppId) > -1) {
+      appId = verify.wxAppId
+    }
+    
     if (['8IFltwzyKcu15iA8fqSyb6m-pMa88a3ZTu0No3vDHgo', 'LOB-bbt9jVncGh7IOAUdESh1Sgzcbt62UwOqSqcK9ok'].includes(verify.wxTemplateId) && window.GLOB.sysType !== 'cloud') {
       domain = 'https://cloud.mk9h.cn/'
+      appId = 'wx4d8a34c8d4494872'
     }
 
     if (!window.GLOB.nginx && !domain) {
@@ -2564,7 +2571,7 @@
         duration: 5
       })
       return
-    } else if (!window.GLOB.WXAppID && !domain) {
+    } else if (!appId) {
       notification.warning({
         top: 92,
         message: '灏氭湭娣诲姞鍏紬鍙稩D锛屼笉鍙彂閫佹ā鏉挎秷鎭��',
@@ -2644,11 +2651,11 @@
         return m
       })
 
-      Api.wxAccessToken(domain).then(res => {
-        if (!res.oa_access_token) return
+      Api.wxAccessToken(appId, domain).then(res => {
+        if (!res.access_token) return
   
         params.forEach(n => {
-          Api.wxNginxRequest(`${domain}cgi-bin/message/template/send?access_token=${res.oa_access_token}`, 'post', JSON.stringify(n)).then(re => {
+          Api.wxNginxRequest(`${domain}cgi-bin/message/template/send?access_token=${res.access_token}`, 'post', JSON.stringify(n)).then(re => {
             if (verify.wxNoteCallback === 'true') {
               let msg = re.errmsg || ''
 
diff --git a/src/templates/sharecomponent/actioncomponent/verifypay/customscript/index.jsx b/src/templates/sharecomponent/actioncomponent/verifypay/customscript/index.jsx
new file mode 100644
index 0000000..0ec027b
--- /dev/null
+++ b/src/templates/sharecomponent/actioncomponent/verifypay/customscript/index.jsx
@@ -0,0 +1,224 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { fromJS } from 'immutable'
+import { Form, Row, Col, Button, notification, Tooltip, Select, Switch } from 'antd'
+
+import Utils from '@/utils/utils.js'
+import { checkSQL } from '@/utils/utils-custom.js'
+import CodeMirror from '@/templates/zshare/codemirror'
+// import './index.scss'
+
+class CustomForm extends Component {
+  static propTpyes = {
+    scripts: PropTypes.array,
+    columns: PropTypes.any,
+    systemScripts: PropTypes.array,
+    scriptsChange: PropTypes.func
+  }
+
+  state = {
+    editItem: null,
+    usefulfields: null,
+    loading: false,
+    skip: false
+  }
+
+  UNSAFE_componentWillMount () {
+    this.resetfield()
+  }
+
+  resetfield = () => {
+    const { columns } = this.props
+    let fields = columns.map(item => item.field)
+
+    this.setState({
+      usefulfields: fields.join(', ')
+    })
+  }
+
+  edit = (record) => {
+    this.setState({
+      editItem: record
+    })
+
+    this.props.form.setFieldsValue({
+      sql: record.sql
+    })
+  }
+
+  handleConfirm = () => {
+    const { type, scripts } = this.props
+    const { editItem, skip } = this.state
+
+    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
+    this.props.form.validateFieldsAndScroll((err, values) => {
+      if (err) return
+
+      if (!values.sql || /^[\s\n]+$/.test(values.sql)) {
+        notification.warning({
+          top: 92,
+          message: '璇疯緭鍏ql!',
+          duration: 5
+        })
+        return
+      }
+      
+      values.uuid = editItem ? editItem.uuid : ''
+
+      if (type === 'fullscreen' && editItem) {
+        values.status = editItem.status || 'true'
+      }
+
+      let pass = checkSQL(values.sql, 'customscript')
+
+      if (!pass) return
+
+      let _scripts = fromJS(scripts).toJS()
+
+      if (values.uuid) {
+        _scripts = _scripts.map(item => {
+          if (values.uuid === item.uuid) {
+            return values
+          }
+          return item
+        })
+      } else {
+        values.uuid = Utils.getuuid()
+
+        _scripts.push(values)
+      }
+
+      if (skip) {
+        this.setState({
+          skip: false,
+          editItem: null
+        })
+        this.props.scriptsChange(_scripts, null, null, values)
+        this.props.form.setFieldsValue({
+          sql: ''
+        })
+      } else {
+        this.setState({loading: true})
+        this.props.scriptsChange(_scripts, () => {
+          this.setState({
+            loading: false,
+            editItem: null
+          })
+  
+          this.props.form.setFieldsValue({
+            sql: ''
+          })
+        }, () => {
+          this.setState({loading: false})
+        }, values)
+      }
+    })
+  }
+
+  handleCancel = () => {
+    this.setState({
+      editItem: null
+    })
+    
+    this.props.form.setFieldsValue({
+      sql: ''
+    })
+  }
+
+  selectScript = (value, option) => {
+    let _sql = this.props.form.getFieldValue('sql')
+    if (/^\s+$/.test(_sql)) {
+      _sql = ''
+    }
+    if (_sql) {
+      _sql = _sql + ` 
+
+      `
+    }
+
+    _sql = _sql.replace(/\s{6}$/, '')
+    _sql = _sql + `/*${option.props.children}*/
+    `
+    _sql = _sql.replace(/\s{4}$/, '')
+    _sql = _sql + value
+
+    this.props.form.setFieldsValue({
+      sql: _sql
+    })
+  }
+
+  render() {
+    const { systemScripts, type } = this.props
+    const { usefulfields, editItem, skip } = this.state
+    const { getFieldDecorator } = this.props.form
+    const formItemLayout = {
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 8 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      }
+    }
+
+    return (
+      <Form {...formItemLayout} className="verify-form" id="verify-excelin-custom-scripts">
+        <Row gutter={24}>
+          {!type ? <Col span={8}>
+            <Form.Item label="鎶ラ敊瀛楁" style={{margin: 0, whiteSpace: 'nowrap'}}>
+              errorcode锛堝鍔犲悗缂�NT琛ㄧず鏁版嵁涓嶅洖婊氾紝濡侲NT銆丯NT銆丗NT銆丯MNT銆丆NT銆�-2NT锛�, retmsg
+            </Form.Item>
+          </Col> : null}
+          {!type ? <Col span={24} className="sqlfield">
+            <Form.Item label="鍙敤瀛楁">
+              <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'鍏叡鍊硷紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆�'}><span style={{color: '#1890ff'}}>BID, ID, LoginUID, SessionUid, UserID, Appkey, lang, time_id, typename</span></Tooltip>,&nbsp;
+              <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'绯荤粺鍙橀噺锛岀郴缁熶細瀹氫箟鍙橀噺骞惰祴鍊笺��'}><span style={{color: '#fa8c16'}}>UserName, FullName, RoleID, mk_departmentcode, mk_organization, mk_user_type, mk_nation, mk_province, mk_city, mk_district, mk_address</span></Tooltip>,&nbsp;
+              {usefulfields}
+            </Form.Item>
+          </Col> : null}
+          {!type ? <Col span={8}>
+            <Form.Item style={{marginBottom: 0}} label="蹇嵎娣诲姞">
+              <Select
+                showSearch
+                filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
+                onSelect={this.selectScript}
+                getPopupContainer={() => document.getElementById('verify-excelin-custom-scripts')}
+              >
+                <Select.Option key="debugger" value={`z_debug: select @ErrorCode='E',@retmsg='娴嬭瘯鏂偣' goto aaa`}>
+                  娴嬭瘯鏂偣
+                </Select.Option>
+                {systemScripts.map((option, i) =>
+                  <Select.Option key={i} value={option.value}>
+                    {option.name}
+                  </Select.Option>
+                )}
+              </Select>
+            </Form.Item>
+          </Col> : null}
+          <Col span={5} className="add" style={{paddingTop: '2px', whiteSpace: 'nowrap'}}>
+            <Button onClick={this.handleConfirm} loading={this.state.loading} className="mk-green" style={{marginBottom: 15, marginLeft: 40}}>
+            {type === 'fullscreen' && !editItem ? '娣诲姞' : '淇濆瓨'}
+            </Button>
+            <Button onClick={this.handleCancel} style={{marginBottom: 15, marginLeft: 10}}>
+              鍙栨秷
+            </Button>
+          </Col>
+          <Col span={3} className="forced" style={{paddingTop: '12px', fontSize: '12px', whiteSpace: 'nowrap'}}>
+            寮哄埗淇濆瓨锛�
+            <Switch checked={skip} size="small" onChange={() => this.setState({skip: !skip})}/>
+          </Col>
+          <Col span={24} className="sql">
+            <Form.Item label="sql" required>
+              {getFieldDecorator('sql', {
+                initialValue: ''
+              })(<CodeMirror />)}
+            </Form.Item>
+          </Col>
+        </Row>
+      </Form>
+    )
+  }
+}
+
+export default Form.create()(CustomForm)
\ No newline at end of file
diff --git a/src/templates/sharecomponent/actioncomponent/verifypay/customscript/index.scss b/src/templates/sharecomponent/actioncomponent/verifypay/customscript/index.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/templates/sharecomponent/actioncomponent/verifypay/customscript/index.scss
diff --git a/src/templates/sharecomponent/actioncomponent/verifypay/index.jsx b/src/templates/sharecomponent/actioncomponent/verifypay/index.jsx
new file mode 100644
index 0000000..0aab183
--- /dev/null
+++ b/src/templates/sharecomponent/actioncomponent/verifypay/index.jsx
@@ -0,0 +1,516 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { Form, Tabs, Row, Col, Button, Popconfirm, notification, Modal, message, InputNumber, Typography } from 'antd'
+import { EditOutlined, StopOutlined, CheckCircleOutlined, SwapOutlined, DeleteOutlined } from '@ant-design/icons'
+import moment from 'moment'
+
+import Api from '@/api'
+import Utils from '@/utils/utils.js'
+
+import CustomScript from './customscript'
+import asyncComponent from '@/utils/asyncComponent'
+import MKEmitter from '@/utils/events.js'
+import './index.scss'
+
+const { TabPane } = Tabs
+const { confirm } = Modal
+const { Paragraph } = Typography
+
+const EditTable = asyncComponent(() => import('@/templates/zshare/editTable'))
+const FullScripts = asyncComponent(() => import('@/templates/zshare/verifycard/fullScripts'))
+
+class VerifyPay extends Component {
+  static propTpyes = {
+    columns: PropTypes.array,  // 鏄剧ず鍒�
+    card: PropTypes.object,
+  }
+
+  state = {
+    verify: null,
+    oriVerify: null,
+    defaultSql: '',
+    systemScripts: [],
+    scriptsColumns: [
+      {
+        title: 'SQL',
+        dataIndex: 'sql',
+        width: '60%',
+        render: (text) => {
+          let title = text.match(/^\s*\/\*.+\*\//)
+          title = title && title[0] ? title[0] : ''
+          let _text = title ? text.replace(title, '') : text
+
+          return (
+            <div>
+              {title ? <span style={{color: '#a50'}}>{title}<span style={{fontSize: '12px', marginLeft: '5px'}}>{_text.length}</span></span> : null}
+              <Paragraph copyable={{ text: text }} ellipsis={{ rows: 4, expandable: true }}>{_text}</Paragraph>
+            </div>
+          )
+        }
+      },
+      {
+        title: '鐘舵��',
+        dataIndex: 'status',
+        width: '10%',
+        render: (text, record) => record.status === 'false' ?
+          (
+            <div style={{color: '#ff4d4f'}}>
+              绂佺敤
+              <StopOutlined style={{marginLeft: '5px'}} />
+            </div>
+          ) :
+          (
+            <div style={{color: '#26C281'}}>
+              鍚敤
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
+            </div>
+          )
+      },
+      {
+        title: '鎿嶄綔',
+        align: 'center',
+        width: '140px',
+        dataIndex: 'operation',
+        render: (text, record) =>
+          (<div style={{textAlign: 'center'}}>
+            <span className="operation-btn" title="缂栬緫" onClick={() => this.handleEdit(record)} style={{color: '#1890ff'}}><EditOutlined /></span>
+            <span className="operation-btn" title="鐘舵�佸垏鎹�" onClick={() => this.handleStatus(record)} style={{color: '#8E44AD'}}><SwapOutlined /></span>
+            <Popconfirm
+              overlayClassName="popover-confirm"
+              title="纭畾鍒犻櫎鍚�?"
+              onConfirm={() => this.handleDelete(record)
+            }>
+              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
+            </Popconfirm>
+          </div>)
+      }
+    ]
+  }
+
+  UNSAFE_componentWillMount() {
+    const { card, columns } = this.props
+    let _verify = fromJS(card.verify || {}).toJS()
+
+    _verify.scripts = _verify.scripts || []
+
+    let sysfields = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'tbid', 'bid']
+    let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@RoleID nvarchar(512)', '@mk_departmentcode nvarchar(512)', '@mk_organization nvarchar(512)', '@mk_user_type nvarchar(20)', '@mk_nation nvarchar(50)', '@mk_province nvarchar(50)', '@mk_city nvarchar(50)', '@mk_district nvarchar(50)', '@mk_address nvarchar(100)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@bid nvarchar(50)', '@tbid nvarchar(50)']
+    let _select = ['@UserName=\'\'', '@FullName=\'\'', '@RoleID=\'\'', '@mk_departmentcode=\'\'', '@mk_organization=\'\'', '@mk_user_type=\'\'', '@mk_nation=\'\'', '@mk_province=\'\'', '@mk_city=\'\'', '@mk_district=\'\'', '@mk_address=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@bid=\'\'']
+    
+    sysfields = sysfields.map(field => field.toLowerCase())
+    columns.forEach(_f => {
+      if (sysfields.includes(_f.field.toLowerCase())) return
+
+      if (/decimal|int/ig.test(_f.datatype)) {
+        _select.push(`@${_f.field}=1`)
+      } else if (/date/ig.test(_f.datatype)) {
+        _select.push(`@${_f.field}='1949-10-01'`)
+      } else {
+        _select.push(`@${_f.field}=''`)
+      }
+
+      _declare.push(`@${_f.field} ${_f.datatype}`)
+    })
+
+    let _sql = `Declare ${_declare.join(', ')}
+      Select ${_select.join(', ')}
+    `
+
+    this.setState({
+      defaultSql: _sql,
+      verify: _verify,
+      oriVerify: fromJS(_verify).toJS()
+    })
+  }
+
+  componentDidMount () {
+    this.getsysScript()
+  }
+
+  getsysScript = () => {
+    if (sessionStorage.getItem('mk_sys_scripts')) {
+      this.setState({
+        systemScripts: JSON.parse(sessionStorage.getItem('mk_sys_scripts'))
+      })
+      return
+    }
+    
+    let _scriptSql = `Select distinct func+Remark as funcname,longparam, s.Sort from聽 s_custom_script s inner join (select OpenID from sapp where ID=@Appkey@) p on s.openid = case when s.appkey='' then s.openid else p.OpenID end order by s.Sort`
+
+    _scriptSql = Utils.formatOptions(_scriptSql, 'x')
+
+    let _sParam = {
+      func: 'sPC_Get_SelectedList',
+      LText: _scriptSql,
+      obj_name: 'data',
+      arr_field: 'funcname,longparam',
+      exec_type: 'x'
+    }
+    
+    _sParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    _sParam.secretkey = Utils.encrypt('', _sParam.timestamp)
+    _sParam.open_key = Utils.encryptOpenKey(_sParam.secretkey, _sParam.timestamp) // 浜戠鏁版嵁楠岃瘉
+    
+    Api.getCloudConfig(_sParam).then(res => {
+      if (res.status) {
+        let _scripts = res.data.map(item => {
+          return {
+            name: item.funcname,
+            value: window.decodeURIComponent(window.atob(item.longparam))
+          }
+        })
+
+        sessionStorage.setItem('mk_sys_scripts', JSON.stringify(_scripts))
+
+        this.setState({
+          systemScripts: _scripts
+        })
+      } else {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+      }
+    })
+  }
+
+  scriptsChange = (scripts, resolve, reject, values) => {
+    const { card } = this.props
+    const { defaultSql } = this.state
+
+    let verify = fromJS(this.state.verify).toJS()
+    verify.scripts = scripts
+
+    let sql = defaultSql
+
+    scripts.forEach(item => {
+      if (item.status === 'false') return
+
+      sql += `
+      ${item.sql}
+      `
+    })
+
+    if (card.output) {
+      sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${card.output} as mk_b_id`
+    } else {
+      sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+    }
+
+    sql = sql.replace(/@\$|\$@/ig, '')
+    sql = sql.replace(/@datam@/ig, `''`)
+    sql = sql.replace(/@typename@/ig, `'debug'`)
+      
+    if (resolve) {
+      Api.sDebug(sql).then(res => {
+        if (res.status || res.ErrCode === '-2') {
+          resolve()
+          values && MKEmitter.emit('editLineId', values.uuid)
+
+          this.setState({ verify })
+        } else {
+          reject()
+  
+          Modal.error({
+            title: res.message
+          })
+        }
+      })
+    } else {
+      values && MKEmitter.emit('editLineId', values.uuid)
+
+      this.setState({ verify })
+    }
+  }
+
+  handleDelete = (record) => {
+    const { verify } = this.state
+
+    verify.scripts = verify.scripts.filter(item => item.uuid !== record.uuid)
+
+    this.setState({ verify: verify })
+  }
+
+  handleEdit = (record) => {
+    this.scriptsForm.edit(record)
+    let node = document.getElementById('mk-pay-script')
+
+    if (node && node.scrollTop) {
+      let inter = Math.ceil(node.scrollTop / 10)
+
+      let timer = setInterval(() => {
+        if (node.scrollTop - inter > 0) {
+          node.scrollTop = node.scrollTop - inter
+        } else {
+          node.scrollTop = 0
+          clearInterval(timer)
+        }
+      }, 10)
+    }
+  }
+
+  handleStatus = (record) => {
+    let verify = fromJS(this.state.verify).toJS()
+    record.status = record.status === 'false' ? 'true' : 'false'
+
+    verify.scripts = verify.scripts.map(item => {
+      if (item.uuid === record.uuid) {
+        return record
+      } else {
+        return item
+      }
+    })
+
+    this.setState({
+      verify: verify
+    })
+  }
+
+  handleConfirm = () => {
+    const { verify } = this.state
+    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
+    return new Promise((resolve, reject) => {
+      if (verify.scripts.length === 0) {
+        notification.warning({
+          top: 92,
+          message: '浣跨敤绯荤粺鍑芥暟锛岄渶瑕佹坊鍔犺嚜瀹氫箟鑴氭湰锛�',
+          duration: 5
+        })
+        return
+      }
+
+      let _loading = false
+      if (this.scriptsForm && this.scriptsForm.state.editItem) {
+        _loading = true
+      } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
+        _loading = true
+      }
+
+      if (_loading) {
+        confirm({
+          content: `瀛樺湪鏈繚瀛橀」锛岀‘瀹氭彁浜ゅ悧锛焋,
+          onOk() {
+            resolve(verify)
+          },
+          onCancel() {}
+        })
+      } else {
+        resolve(verify)
+      }
+    })
+  }
+
+  handleCancel = () => {
+    const { verify, oriVerify } = this.state
+    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
+    return new Promise((resolve, reject) => {
+      if (!is(fromJS(verify), fromJS(oriVerify))) {
+        confirm({
+          content: '楠岃瘉淇℃伅宸蹭慨鏀癸紝纭畾鍙栨秷鍚楋紵',
+          onOk() {
+            resolve()
+          },
+          onCancel() {}
+        })
+      } else {
+        resolve()
+      }
+    })
+  }
+
+  showError = (errorType) => {
+    if (errorType === 'S') {
+      notification.success({
+        top: 92,
+        message: '鎵ц鎴愬姛锛�',
+        duration: 2
+      })
+    } else if (errorType === 'Y') {
+      Modal.success({
+        title: '鎵ц鎴愬姛锛�'
+      })
+    } else if (errorType === 'F') {
+      notification.error({
+        className: 'notification-custom-error',
+        top: 92,
+        message: '鎵ц澶辫触锛�',
+        duration: 10
+      })
+    } else if (errorType === 'N') {
+      notification.error({
+        top: 92,
+        message: '鎵ц澶辫触锛�',
+        duration: 10
+      })
+    } else if (errorType === 'E') {
+      Modal.error({
+        title: '鎵ц澶辫触锛�'
+      })
+    } else if (errorType === 'NM') {
+      message.error('鎵ц澶辫触锛�')
+    }
+  }
+
+  timeChange = (val, type) => {
+    const { verify } = this.state
+
+    this.setState({
+      verify: {...verify, [type]: val}
+    })
+  }
+
+  render() {
+    const { card, columns } = this.props
+    const { verify, scriptsColumns } = this.state
+    const formItemLayout = {
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 8 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      }
+    }
+
+    return (
+      <div>
+        {card.label ? <div className="mk-com-name">{card.label} - 楠岃瘉淇℃伅</div> : null}
+        <Tabs className="pay-verify-card-box">
+          <TabPane tab={
+            <span>
+              鑷畾涔夎剼鏈�
+              {verify.scripts.length ? <span className="count-tip">{verify.scripts.length}</span> : null}
+            </span>
+          } key="scripts" id="mk-pay-script">
+            <FullScripts
+              scripts={verify.scripts}
+              getScriptsFullForm={() => this.scriptsFullForm}
+              getScriptsForm={() => this.scriptsForm}
+              handleStatus={this.handleStatus}
+              handleDelete={this.handleDelete}
+            >
+              <CustomScript
+                type="fullscreen"
+                columns={columns}
+                scripts={verify.scripts}
+                systemScripts={this.state.systemScripts}
+                scriptsChange={this.scriptsChange}
+                wrappedComponentRef={(inst) => this.scriptsFullForm = inst}
+              />
+            </FullScripts>
+            <CustomScript
+              columns={columns}
+              scripts={verify.scripts}
+              systemScripts={this.state.systemScripts}
+              scriptsChange={this.scriptsChange}
+              wrappedComponentRef={(inst) => this.scriptsForm = inst}
+            />
+            <EditTable actions={['move']} data={verify.scripts} columns={scriptsColumns} onChange={(scripts) => {this.setState({verify: {...verify, scripts}})}}/>
+          </TabPane>
+          <TabPane tab="淇℃伅鎻愮ず" key="tip">
+            <Form {...formItemLayout}>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> S </span>
+                    <Button onClick={() => {this.showError('S')}} type="primary" size="small">
+                      鏌ョ湅
+                    </Button>
+                  </Form.Item>
+                </Col>
+                <Col span={8}>
+                  <Form.Item label="鍋滅暀鏃堕棿">
+                    <InputNumber defaultValue={verify.stime || 2} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'stime')}} />
+                  </Form.Item>
+                </Col>
+              </Row>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> Y </span>
+                    <Button onClick={() => {this.showError('Y')}} type="primary" size="small">
+                      鏌ョ湅
+                    </Button>
+                  </Form.Item>
+                </Col>
+              </Row>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> -1 </span>
+                    鎵ц鎴愬姛鏃犳彁绀恒��
+                  </Form.Item>
+                </Col>
+              </Row>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> N </span>
+                    <Button onClick={() => {this.showError('N')}} type="primary" size="small">
+                      鏌ョ湅
+                    </Button>
+                  </Form.Item>
+                </Col>
+                <Col span={8}>
+                  <Form.Item label="鍋滅暀鏃堕棿">
+                    <InputNumber defaultValue={verify.ntime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ntime')}} />
+                  </Form.Item>
+                </Col>
+              </Row>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> F </span>
+                    <Button onClick={() => {this.showError('F')}} type="primary" size="small">
+                      鏌ョ湅
+                    </Button>
+                  </Form.Item>
+                </Col>
+                <Col span={8}>
+                  <Form.Item label="鍋滅暀鏃堕棿">
+                    <InputNumber defaultValue={verify.ftime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ftime')}} />
+                  </Form.Item>
+                </Col>
+              </Row>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> E </span>
+                    <Button onClick={() => {this.showError('E')}} type="primary" size="small">
+                      鏌ョ湅
+                    </Button>
+                  </Form.Item>
+                </Col>
+              </Row>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> NM </span>
+                    <Button onClick={() => {this.showError('NM')}} type="primary" size="small">
+                      鏌ョ湅
+                    </Button>
+                  </Form.Item>
+                </Col>
+              </Row>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> -2 </span>
+                    鎵ц澶辫触鏃犳彁绀�
+                  </Form.Item>
+                </Col>
+              </Row>
+            </Form>
+          </TabPane>
+        </Tabs>
+      </div>
+    )
+  }
+}
+
+export default Form.create()(VerifyPay)
\ No newline at end of file
diff --git a/src/templates/sharecomponent/actioncomponent/verifypay/index.scss b/src/templates/sharecomponent/actioncomponent/verifypay/index.scss
new file mode 100644
index 0000000..ad27818
--- /dev/null
+++ b/src/templates/sharecomponent/actioncomponent/verifypay/index.scss
@@ -0,0 +1,84 @@
+.pay-verify-card-box {
+  .ant-tabs-nav-scroll {
+    text-align: center;
+  }
+  .ant-tabs-content {
+    min-height: 40vh;
+  }
+  table tr td {
+    word-wrap: break-word;
+    word-break: break-word;
+  }
+  .count-tip {
+    position: absolute;
+    top: 0px;
+    color: #1890ff;
+    font-size: 12px;
+  }
+  .verify-form {
+    .sql {
+      .ant-col-sm-8 {
+        width: 10.5%;
+      }
+      .ant-col-sm-16 {
+        width: 89.5%;
+        padding-top: 4px;
+      }
+      .CodeMirror {
+        height: 350px;
+      }
+    }
+    .sqlfield {
+      .ant-form-item {
+        margin-bottom: 5px;
+      }
+      .ant-form-item-control {
+        line-height: 24px;
+      }
+      .ant-form-item-label {
+        line-height: 25px;
+      }
+      .ant-form-item-children {
+        line-height: 22px;
+      }
+      .ant-col-sm-8 {
+        width: 10.5%;
+      }
+      .ant-col-sm-16 {
+        width: 89.5%;
+      }
+    }
+    .ant-form-explain {
+      white-space: nowrap;
+    }
+  }
+  .errorval {
+    display: inline-block;
+    width: 30px;
+  }
+  .operation-btn {
+    display: inline-block;
+    font-size: 16px;
+    padding: 0 5px;
+    cursor: pointer;
+  }
+  .ant-tabs-tabpane {
+    position: relative;
+    .excel-col-add {
+      position: relative;
+      float: right;
+      right: -9px;
+      margin-right: 10px;
+      top: 10px;
+      z-index: 1;
+    }
+  }
+  .full-scripts {
+    position: absolute;
+    right: 24px;
+    top: 0px;
+    font-size: 16px;
+    color: #1890ff;
+    z-index: 1;
+  }
+}
\ No newline at end of file
diff --git a/src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx
index 5e80f9d..c4af547 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyprint/index.jsx
@@ -247,6 +247,8 @@
 
         if (/decimal|int/ig.test(_f.datatype)) {
           _select.push(`@${_f.field}=1`)
+        } else if (/date/ig.test(_f.datatype)) {
+          _select.push(`@${_f.field}='1949-10-01'`)
         } else {
           _select.push(`@${_f.field}=''`)
         }
diff --git a/src/templates/sharecomponent/searchcomponent/searchform/index.jsx b/src/templates/sharecomponent/searchcomponent/searchform/index.jsx
index 0979803..f093777 100644
--- a/src/templates/sharecomponent/searchcomponent/searchform/index.jsx
+++ b/src/templates/sharecomponent/searchcomponent/searchform/index.jsx
@@ -692,7 +692,7 @@
       fields.push(
         <Col span={span} key={index}>
           <Form.Item className={className} extra={extra} label={item.tooltip ?
-            <Tooltip placement="topLeft" title={item.tooltip}>
+            <Tooltip placement="topLeft" title={<div onClick={(e) => e.stopPropagation()}>{item.tooltip}</div>}>
               <QuestionCircleOutlined className="mk-form-tip" />
               {item.label}
             </Tooltip> : item.label
diff --git a/src/templates/zshare/verifycard/baseform/index.jsx b/src/templates/zshare/verifycard/baseform/index.jsx
index 6b3106f..71440ec 100644
--- a/src/templates/zshare/verifycard/baseform/index.jsx
+++ b/src/templates/zshare/verifycard/baseform/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
-import { Form, Row, Col, Select, Radio, Tooltip, Input } from 'antd'
+import { Form, Row, Col, Select, Radio, Tooltip, Input, message } from 'antd'
 import { QuestionCircleOutlined } from '@ant-design/icons'
 
 import Api from '@/api'
@@ -25,42 +25,30 @@
   state = {
     wxTemps: [],
     selectTemp: null,
-    miniTemps: []
+    WXApps: null
   }
 
   componentDidMount() {
-    let wxTemps = sessionStorage.getItem('wxTemplates')
+    const { appType, verify } = this.props
 
-    if (window.GLOB.WXAppID && window.GLOB.nginx && !wxTemps) {
-      Api.wxAccessToken().then(res => {
-        if (res.access_token) {
-          Api.wxNginxRequest(`cgi-bin/template/get_all_private_template?access_token=${res.access_token}`, 'get').then(res => {
-            let temps = []
-            if (res.template_list) {
-              temps = res.template_list.filter(item => {
-                if (!item.primary_industry || sysTempsIds.includes(item.template_id)) return false
-                if (item.content) {
-                  item.content = item.content.replace('{{first.DATA}}\n', '').replace('\n{{remark.DATA}}', '')
-                }
+    let appId = window.GLOB.WXAppID || ''
 
-                return true
-              })
-            }
-            
-            sessionStorage.setItem('wxTemplates', JSON.stringify(temps))
-            localStorage.setItem('wxTemplates', JSON.stringify(temps))
+    if (window.GLOB.WXApps && !appType) {
+      let apps = window.GLOB.WXApps.filter(app => app.appType === 'public')
 
-            localStorage.removeItem('wxTemplates')
+      if (apps.length > 0) {
+        this.setState({WXApps: apps})
+      }
 
-            this.resetTemps(temps)
-          })
-        } else {
-          sessionStorage.setItem('wxTemplates', JSON.stringify([]))
-          localStorage.setItem('wxTemplates', JSON.stringify([]))
+      if (verify.wxAppId && apps.findIndex(item => item.appId === verify.wxAppId) > -1) {
+        appId = verify.wxAppId
+      }
+    }
 
-          localStorage.removeItem('wxTemplates')
-        }
-      })
+    let wxTemps = sessionStorage.getItem('wxTemplates' + appId)
+
+    if (appId && window.GLOB.nginx && !wxTemps) {
+      this.getTemps(appId)
     } else if (wxTemps) {
       wxTemps = JSON.parse(wxTemps)
 
@@ -68,6 +56,35 @@
     } else {
       this.resetTemps([])
     }
+  }
+
+  getTemps = (appId) => {
+    Api.wxAccessToken(appId).then(res => {
+      if (res.status && res.access_token) {
+        Api.wxNginxRequest(`cgi-bin/template/get_all_private_template?access_token=${res.access_token}`, 'get').then(res => {
+          let temps = []
+          if (res.template_list) {
+            temps = res.template_list.filter(item => {
+              if (!item.primary_industry || sysTempsIds.includes(item.template_id)) return false
+              if (item.content) {
+                item.content = item.content.replace('{{first.DATA}}\n', '').replace('\n{{remark.DATA}}', '')
+              }
+
+              return true
+            })
+          } else if (res.errcode && res.errmsg) {
+            message.warning(res.errcode + ': ' + res.errmsg)
+          }
+          
+          sessionStorage.setItem('wxTemplates' + appId, JSON.stringify(temps))
+
+          this.resetTemps(temps)
+        })
+      } else {
+        message.warning(res.message || '寰俊鎺堟潈澶辫触锛�')
+        sessionStorage.setItem('wxTemplates' + appId, JSON.stringify([]))
+      }
+    })
   }
 
   resetTemps = (wxTemps) => {
@@ -169,6 +186,7 @@
       delete _verify.pre_func
     }
     if (_verify.wxNote !== 'true') {
+      delete _verify.wxAppId
       delete _verify.wxTemplateId
       delete _verify.wxNoteLink
       delete _verify.wxNoteLinkUrl
@@ -250,6 +268,45 @@
     this.props.onChange(_verify)
   }
 
+  onWxAppChange = (val) => {
+    const { verify } = this.props
+
+    let _verify = {...verify, wxAppId: val, wxNote: 'false'}
+
+    delete _verify.wxTemplateId
+    delete _verify.wxNoteLink
+    delete _verify.wxNoteLinkUrl
+    delete _verify.wxNoteMiniId
+    delete _verify.wxNoteLinkMenuId
+    delete _verify.wxNoteCallback
+    delete _verify.wxCustomTempId
+
+    _verify.wxNoteKeys = null
+    
+    if (this.state.selectTemp) {
+      this.setState({selectTemp: null})
+    }
+
+    let _verify_ = fromJS(_verify).toJS()
+    _verify_.wxNote = 'true'
+
+    this.props.onChange(_verify)
+
+    setTimeout(() => {
+      this.props.onChange(_verify_)
+
+      let wxTemps = sessionStorage.getItem('wxTemplates' + val)
+
+      if (wxTemps) {
+        wxTemps = JSON.parse(wxTemps)
+
+        this.resetTemps(wxTemps)
+      } else {
+        this.getTemps(val)
+      }
+    }, 20)
+  }
+
   onWxNoteKeyChange = (key, val) => {
     let _verify = fromJS(this.props.verify).toJS()
 
@@ -288,7 +345,7 @@
 
   render() {
     const { unionFields, verify, notes, emailCodes, card, appType, columns, fields } = this.props
-    const { wxTemps, selectTemp } = this.state
+    const { wxTemps, selectTemp, WXApps } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -635,6 +692,22 @@
               </Radio.Group>
             </Form.Item>
           </Col>
+          {verify.wxNote === 'true' && WXApps ? <Col span={8}>
+            <Form.Item label={
+              <Tooltip placement="bottomLeft" title="璇烽�夋嫨鍙戦�佹秷鎭殑鍏紬鍙枫��">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                鍏紬鍙�
+              </Tooltip>
+            } required>
+              <Select value={verify.wxAppId || window.GLOB.WXAppID} onSelect={this.onWxAppChange}>
+                {WXApps.map(option =>
+                  <Select.Option key={option.appId} value={option.appId}>
+                    {option.appName}
+                  </Select.Option>
+                )}
+              </Select>
+            </Form.Item>
+          </Col> : null}
           {verify.wxNote === 'true' ? <Col span={8}>
             <Form.Item label="娑堟伅妯℃澘" required>
               <Select value={verify.wxTemplateId} onSelect={this.onWxTemplateChange}>
diff --git a/src/templates/zshare/verifycard/fullScripts/index.jsx b/src/templates/zshare/verifycard/fullScripts/index.jsx
index 0fee3ee..b5433c1 100644
--- a/src/templates/zshare/verifycard/fullScripts/index.jsx
+++ b/src/templates/zshare/verifycard/fullScripts/index.jsx
@@ -69,7 +69,7 @@
                 position = <span style={{color: 'orange'}}>鍒濆鍖�</span>
               } else if (item.position === 'front') {
                 position = <span style={{color: '#26C281'}}>sql鍓�</span>
-              } else {
+              } else if (item.position === 'back') {
                 position = <span style={{color: '#1890ff'}}>sql鍚�</span>
               }
 
diff --git a/src/templates/zshare/verifycard/index.jsx b/src/templates/zshare/verifycard/index.jsx
index 9e50ea7..7c507ab 100644
--- a/src/templates/zshare/verifycard/index.jsx
+++ b/src/templates/zshare/verifycard/index.jsx
@@ -817,6 +817,8 @@
         if (_f.datatype) { // 鑷畾涔夊瓧娈�
           if (/decimal|int/ig.test(_f.datatype)) {
             _select.push(`@${_f.field}=1`)
+          } else if (/date/ig.test(_f.datatype)) {
+            _select.push(`@${_f.field}='1949-10-01'`)
           } else {
             _select.push(`@${_f.field}=''`)
           }
diff --git a/src/utils/utils-custom.js b/src/utils/utils-custom.js
index 1141a14..e546ebe 100644
--- a/src/utils/utils-custom.js
+++ b/src/utils/utils-custom.js
@@ -1842,21 +1842,27 @@
           errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅娇鐢ㄤ簡鍒涘缓鍑瘉鍑芥暟锛岄渶瑕侀�夋嫨琛岋紒`})
         }
       } else if (cell.intertype === 'custom' || cell.intertype === 'outer') {
-        if (cell.callbackType === 'script' && (!cell.verify || !cell.verify.cbScripts || !cell.verify.cbScripts.filter(item => item.status !== 'false').length === 0)) {
+        if (cell.callbackType === 'script' && (!cell.verify || !cell.verify.cbScripts || cell.verify.cbScripts.filter(item => item.status !== 'false').length === 0)) {
           errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅娇鐢ㄤ簡鑷畾涔夎剼鏈洖璋冿紝鍥炶皟鑴氭湰涓嶅彲涓虹┖锛乣})
         } else if (cell.procMode === 'system' && cell.Ot === 'notRequired' && cell.verify && cell.verify.voucher && cell.verify.voucher.enabled) {
           errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅娇鐢ㄤ簡鍒涘缓鍑瘉鍑芥暟锛岄渶瑕侀�夋嫨琛岋紒`})
         }
       }
-    } else if (cell.OpenType === 'funcbutton' && cell.funcType === 'print') {
-      if (!cell.verify || !cell.verify.printMode) {
-        errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濊瀹屽杽楠岃瘉淇℃伅锛乣})
-      } else if (cell.intertype === 'system' && cell.verify.dataType === 'custom' && (!cell.verify.setting || cell.verify.columns.length === 0)) {
-        errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅娇鐢ㄤ簡鑷畾涔夋墦鍗版暟鎹紝璇疯缃暟鎹簮锛乣})
+    } else if (cell.OpenType === 'funcbutton') {
+      if (cell.funcType === 'print') {
+        if (!cell.verify || !cell.verify.printMode) {
+          errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濊瀹屽杽楠岃瘉淇℃伅锛乣})
+        } else if (cell.intertype === 'system' && cell.verify.dataType === 'custom' && (!cell.verify.setting || cell.verify.columns.length === 0)) {
+          errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅娇鐢ㄤ簡鑷畾涔夋墦鍗版暟鎹紝璇疯缃暟鎹簮锛乣})
+        }
+      } else if ((cell.funcType === 'refund' || cell.funcType === 'pay') && cell.payMode === 'system' && (!cell.verify || !cell.verify.scripts || cell.verify.scripts.filter(item => item.status !== 'false').length === 0)) {
+        errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濋渶娣诲姞鑷畾涔夎剼鏈紒`})
       }
     } else if (cell.OpenType === 'innerpage' || cell.OpenType === 'outerpage') {
       if (!cell.pageTemplate) {
         errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濋〉闈㈢被鍨嬭缃敊璇紒`})
+      } else if (cell.pageTemplate === 'pay' && cell.payMode === 'system' && (!cell.verify || !cell.verify.scripts || cell.verify.scripts.filter(item => item.status !== 'false').length === 0)) {
+        errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濋渶娣诲姞鑷畾涔夎剼鏈紒`})
       }
     }
   }
diff --git a/src/views/appcheck/index.jsx b/src/views/appcheck/index.jsx
index 3154996..c1a2e1e 100644
--- a/src/views/appcheck/index.jsx
+++ b/src/views/appcheck/index.jsx
@@ -84,6 +84,8 @@
               }
               cell.copyright = _param.copyright || ''
               cell.logo = _param.logo || ''
+              cell.wxAppId = _param.wxAppId || ''
+              cell.wxAppName = _param.wxAppName || ''
             }
 
             return cell
@@ -193,6 +195,8 @@
                     </Col>
                     <Col span={12}>
                       <div className="app-item">
+                        {item.wxAppName ? <div className="label">鍏宠仈鍏紬鍙�:</div> : null}
+                        {item.wxAppName ? <div className="content">{item.wxAppName}</div> : null}
                       </div>
                     </Col>
                     <Col span={12}>
@@ -238,7 +242,7 @@
                     </Col>
                   </Row>
                   <div className="action">
-                    <Paragraph style={{display: 'inline-block', margin: 0}} copyable={{ text: `${window.GLOB.baseurl}${item.typename === 'pad' ? 'mob' : item.typename}/index.html#/index/${this.state.selectApp.kei_no}/${item.typename !== 'pc' ? item.typename + '/' : ''}${item.lang}` }}></Paragraph>
+                    <Paragraph style={{display: 'inline-block', margin: 0}} copyable={{ text: `${window.GLOB.baseurl}${item.typename === 'pad' ? 'mob' : item.typename}/index.html#/index/${this.state.selectApp.kei_no}/${item.typename !== 'pc' ? item.typename + '/' : ''}${item.lang}${item.wxAppId ? '/' + item.wxAppId : ''}` }}></Paragraph>
                   </div>
                 </div>
               )
diff --git a/src/views/appmanage/index.jsx b/src/views/appmanage/index.jsx
index 21ccb4b..910f152 100644
--- a/src/views/appmanage/index.jsx
+++ b/src/views/appmanage/index.jsx
@@ -485,6 +485,8 @@
               cell.share_des = _param.share_des || '' // 鍒嗕韩鎻忚堪
               cell.share_url = _param.share_url || '' // 鍒嗕韩鍥剧墖
               cell.share_link = _param.share_link || '' // 鍒嗕韩閾炬帴
+              cell.wxAppId = _param.wxAppId || ''
+              cell.wxAppName = _param.wxAppName || ''
 
               if (cell.adapter && (cell.adapter === 'true' || cell.adapter === 'false')) {
                 cell.adapter = ''
@@ -672,7 +674,11 @@
     })
 
     // 瀛愬簲鐢↖D銆乼ypename銆佸簲鐢↖D銆丆loudUserID銆乤ppkey銆乴ogin_types(鏄惁闇�瑕佺櫥褰曪紝宸插純鐢�)銆乴ink_type(鏄惁浣跨敤鐭繛鎺ワ紝宸插純鐢�)銆乺ole_type(鏄惁浣跨敤瑙掕壊绠$悊)銆乴ang銆乧ss(鐨偆)銆乼itle(鏍囬)銆乫avicon(鍥炬爣)銆乽ser_binding(鐢ㄦ埛缁戝畾)銆乻ms_id(鐭俊妯℃澘ID)銆佽嚜瀹氫箟
-    param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || 'false'}','','${window.btoa(window.encodeURIComponent(JSON.stringify({userbind: item.userbind || '', instantMessage: item.instantMessage || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', topHeight: item.topHeight || '', sysBgColor: item.sysBgColor || '#ffffff', direction: item.direction || 'vertical', adapter: item.adapter || '', share: item.share || '', share_des: item.share_des || '', share_url: item.share_url || '', share_link: item.share_link || ''})))}'`)
+    param.LText = sublist.map(item => {
+      let _par = this.getCusParam(item)
+
+      return `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || 'false'}','','${window.btoa(window.encodeURIComponent(JSON.stringify(_par)))}'`
+    })
     param.LText = param.LText.join(' union all ')
     param.LText = Utils.formatOptions(param.LText, 'x')
     
@@ -948,7 +954,11 @@
           return item
         })
 
-        param.LText = selectApp.sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || 'false'}','','${window.btoa(window.encodeURIComponent(JSON.stringify({userbind: item.userbind || '', instantMessage: item.instantMessage || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', topHeight: item.topHeight || '', sysBgColor: item.sysBgColor || '#ffffff', direction: item.direction || 'vertical', adapter: item.adapter || '', share: item.share || '', share_des: item.share_des || '', share_url: item.share_url || '', share_link: item.share_link || ''})))}'`)
+        param.LText = selectApp.sublist.map(item => {
+          let _par = this.getCusParam(item)
+    
+          return `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || 'false'}','','${window.btoa(window.encodeURIComponent(JSON.stringify(_par)))}'`
+        })
         param.LText = param.LText.join(' union all ')
         param.LText = Utils.formatOptions(param.LText, 'x')
       }
@@ -985,6 +995,52 @@
         })
       })
     })
+  }
+
+  getCusParam = (item) => {
+    let _par = {
+      sysBgColor: item.sysBgColor || '#ffffff'
+    }
+    if (item.userbind) {
+      _par.userbind = item.userbind
+    }
+    if (item.instantMessage) {
+      _par.instantMessage = item.instantMessage
+    }
+    if (item.apptype) {
+      _par.apptype = item.apptype
+    }
+    if (item.topHeight) {
+      _par.topHeight = item.topHeight
+    }
+    if (item.typename === 'pad') {
+      _par.direction = item.direction || 'vertical'
+    }
+    if (item.typename !== 'pc') {
+      _par.statusBarColor = item.statusBarColor || 'black'
+      _par.delay = item.delay || 0
+    }
+    if (item.adapter) {
+      _par.adapter = item.adapter
+    }
+    if (item.share) {
+      _par.share = item.share
+    }
+    if (item.share_des) {
+      _par.share_des = item.share_des
+    }
+    if (item.share_url) {
+      _par.share_url = item.share_url
+    }
+    if (item.share_link) {
+      _par.share_link = item.share_link
+    }
+    if (item.wxAppId) {
+      _par.wxAppId = item.wxAppId
+      _par.wxAppName = item.wxAppName || item.wxAppId
+    }
+
+    return _par
   }
 
   submitSubCard = () => {
@@ -1041,7 +1097,11 @@
         return item
       })
 
-      param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || 'false'}','','${window.btoa(window.encodeURIComponent(JSON.stringify({userbind: item.userbind || '', instantMessage: item.instantMessage || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', topHeight: item.topHeight || '', sysBgColor: item.sysBgColor || '#ffffff', direction: item.direction || 'vertical', adapter: item.adapter || '', share: item.share || '', share_des: item.share_des || '', share_url: item.share_url || '', share_link: item.share_link || ''})))}'`)
+      param.LText = sublist.map(item => {
+        let _par = this.getCusParam(item)
+
+        return `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || 'false'}','','${window.btoa(window.encodeURIComponent(JSON.stringify(_par)))}'`
+      })
       param.LText = param.LText.join(' union all ')
       param.LText = Utils.formatOptions(param.LText, 'x')
 
@@ -1188,8 +1248,8 @@
                     </Col>
                     <Col span={12}>
                       <div className="app-item">
-                        {/* <div className="label">鐨偆:</div>
-                        <div className="content" style={{color: color}}>{css}</div> */}
+                        {item.wxAppName ? <div className="label">鍏宠仈鍏紬鍙�:</div> : null}
+                        {item.wxAppName ? <div className="content">{item.wxAppName}</div> : null}
                       </div>
                     </Col>
                     <Col span={12}>
@@ -1234,7 +1294,7 @@
                     <Button type="link" onClick={() => this.setState({ selectSubApp: item, subVisible: 'edit' })} style={{color: '#8E44AD'}}>淇敼</Button>
                     <Button type="link" onClick={() => this.deleteSubApp(item)} style={{color: '#ff4d4f'}}>鍒犻櫎</Button>
                     <Button type="link" onClick={() => this.jumpApp(item)}>缂栬緫搴旂敤</Button>
-                    <Paragraph style={{display: 'inline-block', margin: 0}} copyable={{ text: `${window.GLOB.baseurl}${item.typename === 'pad' ? 'mob' : item.typename}/index.html#/index/${this.state.selectApp.kei_no}/${item.typename !== 'pc' ? item.typename + '/' : ''}${item.lang}` }}></Paragraph>
+                    <Paragraph style={{display: 'inline-block', margin: 0}} copyable={{ text: `${window.GLOB.baseurl}${item.typename === 'pad' ? 'mob' : item.typename}/index.html#/index/${this.state.selectApp.kei_no}/${item.typename !== 'pc' ? item.typename + '/' : ''}${item.lang}${item.wxAppId ? '/' + item.wxAppId : ''}` }}></Paragraph>
                   </div>
                 </div>
               )
diff --git a/src/views/appmanage/submutilform/index.jsx b/src/views/appmanage/submutilform/index.jsx
index de2a0a2..0467a7c 100644
--- a/src/views/appmanage/submutilform/index.jsx
+++ b/src/views/appmanage/submutilform/index.jsx
@@ -20,7 +20,8 @@
   state = {
     typename: 'mob',
     adapters: [],
-    exts: []
+    exts: [],
+    WXApps: null
   }
 
   UNSAFE_componentWillMount() {
@@ -47,7 +48,16 @@
       }
     }
 
-    this.setState({typename, adapters, exts, langs: _langs})
+    let apps = null
+    if (window.GLOB.WXApps) {
+      apps = window.GLOB.WXApps.filter(app => app.appType === 'public')
+
+      if (apps.length === 0) {
+        apps = null
+      }
+    }
+
+    this.setState({typename, adapters, exts, langs: _langs, WXApps: apps})
   }
 
   /**
@@ -63,6 +73,10 @@
             values.user_binding = values.exts.includes('user_binding') ? 'true' : 'false'
             values.share = values.exts.includes('share') ? 'true' : 'false'
             delete values.exts
+          }
+          if (values.wxAppId) {
+            let app = window.GLOB.WXApps.filter(app => app.appType === 'public' && values.wxAppId === app.appId)[0]
+            values.wxAppName = app ? app.appName : values.wxAppId
           }
 
           resolve(values)
@@ -89,7 +103,7 @@
   render() {
     const { card, type } = this.props
     const { getFieldDecorator } = this.props.form
-    const { typename, adapters, exts, langs } = this.state
+    const { typename, adapters, exts, langs, WXApps } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -178,6 +192,22 @@
               )}
             </Form.Item>
           </Col> : null}
+          {WXApps ? <Col span={12}>
+            <Form.Item label={
+              <Tooltip placement="topLeft" title="鐢ㄦ埛鍙�氳繃姝ゅ叕浼楀彿杩涜鏀粯鍙婇��娆俱��">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                鍏宠仈鍏紬鍙�
+              </Tooltip>
+            }>
+              {getFieldDecorator('wxAppId', {
+                initialValue: card ? card.wxAppId : ''
+              })(
+                <Select allowClear>
+                  {WXApps.map(item => <Select.Option key={item.appId} value={item.appId}>{item.appName}</Select.Option>)}
+                </Select>
+              )}
+            </Form.Item>
+          </Col> : null}
           {typename !== 'pc' && (adapters.includes('weixin') || adapters.includes('wxmini')) ? <Col span={12}>
             <Form.Item label={
               <Tooltip placement="topLeft" title="鍦ㄥ叕浼楀彿鎴栧皬绋嬪簭涓紝鍙坊鍔犵粦瀹氱郴缁熺敤鎴枫�佽嚜瀹氫箟鍒嗕韩绛夊姛鑳斤紝鑷畾涔夊垎浜缃悗锛屽綋鍓嶅瓙搴旂敤灏嗛粯璁や娇鐢ㄦ鍒嗕韩閾炬帴銆�">
diff --git a/src/views/appmanage/transmenu/index.jsx b/src/views/appmanage/transmenu/index.jsx
index 101ddeb..52f0433 100644
--- a/src/views/appmanage/transmenu/index.jsx
+++ b/src/views/appmanage/transmenu/index.jsx
@@ -313,6 +313,8 @@
         }
       }
 
+      delete config.tbkey
+      
       config.uuid = values.slice(0, 24) + tail
       config.MenuID = config.uuid
       config.open_edition = ''
diff --git a/src/views/design/header/index.jsx b/src/views/design/header/index.jsx
index f41e3ec..99e105b 100644
--- a/src/views/design/header/index.jsx
+++ b/src/views/design/header/index.jsx
@@ -344,10 +344,6 @@
     window.addEventListener('storage', (e) => {
       if (e.key === 'menuUpdate') {
         this.reload()
-      } else if (e.key === 'wxTemplates') {
-        if (e.newValue) {
-          sessionStorage.setItem('wxTemplates', e.newValue)
-        }
       }
     })
     MKEmitter.addListener('mkUpdateMenuList', this.reload)
diff --git a/src/views/design/header/transmenu/index.jsx b/src/views/design/header/transmenu/index.jsx
index 4a278f6..805f411 100644
--- a/src/views/design/header/transmenu/index.jsx
+++ b/src/views/design/header/transmenu/index.jsx
@@ -422,6 +422,8 @@
         config.style = config.style || {}
       }
 
+      delete config.tbkey
+
       config.enabled = false
       config.MenuName = menu.label
       config.fstMenuId = menu.fstMenuId || ''
@@ -677,6 +679,8 @@
         config.style = config.style || {}
       }
 
+      delete config.tbkey
+      
       config.enabled = false
       config.MenuNo = temp.PrintTempNO || ''
       config.MenuName = temp.PrintTempName || ''
diff --git a/src/views/design/sidemenu/thdmenuplus/index.jsx b/src/views/design/sidemenu/thdmenuplus/index.jsx
index a159c98..e657796 100644
--- a/src/views/design/sidemenu/thdmenuplus/index.jsx
+++ b/src/views/design/sidemenu/thdmenuplus/index.jsx
@@ -246,6 +246,8 @@
 
           config.components = MenuUtils.resetConfig(config.components, commonId)
           config.enabled = false
+          
+          delete config.tbkey
 
           param.LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(config)))
         }
diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx
index f453d28..703e194 100644
--- a/src/views/menudesign/index.jsx
+++ b/src/views/menudesign/index.jsx
@@ -98,7 +98,7 @@
 
       sessionStorage.setItem('MenuType', param.MenuType || 'custom')
 
-      if (param.MenuType === 'billPrint' && param.lang) {
+      if (param.lang) {
         sessionStorage.setItem('lang', param.lang)
       }
 
@@ -845,6 +845,8 @@
       } else {
         let urlparam = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
         urlparam.type = 'admin'
+        urlparam.lang = sessionStorage.getItem('lang')
+
         url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam)))
         config.tbkey = key
       }
diff --git a/src/views/mkiframe/index.jsx b/src/views/mkiframe/index.jsx
index 329ef36..00167e6 100644
--- a/src/views/mkiframe/index.jsx
+++ b/src/views/mkiframe/index.jsx
@@ -75,6 +75,7 @@
             } else {
               sessionStorage.clear()
               this.props.history.replace('/login')
+              window.location.reload()
             }
           })
         }
@@ -102,6 +103,7 @@
           sessionStorage.clear()
           sessionStorage.setItem('iframe', `/iframe/${menuId}/@loginuid@/${bid || ''}`)
           this.props.history.replace('/login')
+          window.location.reload()
         }
       })
     }
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index dbf4105..d73400e 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -120,6 +120,10 @@
           sessionStorage.removeItem('applangList')
         }
 
+        if (param.wxAppId) {
+          sessionStorage.setItem('wxAppId', param.wxAppId)
+        }
+
         this.getAppMessage(param.MenuID)
       } else if (param.type === 'view') {
         window.GLOB.winWidth = 420
@@ -171,6 +175,11 @@
     MKEmitter.addListener('changePopview', this.initPopview)
     MKEmitter.addListener('triggerMenuSave', this.submitConfig)
     MKEmitter.addListener('changeEditMenu', this.changeEditMenu)
+
+    if (sessionStorage.getItem('wxAppId')) {
+      window.GLOB.WXAppID = sessionStorage.getItem('wxAppId')
+    }
+
     setTimeout(() => {
       this.getRoleFields()
       setGLOBFuncs()
@@ -1486,7 +1495,7 @@
           typename: sessionStorage.getItem('typename') || '',
           adapter: sessionStorage.getItem('adapter') || '',
           sysBgColor: sessionStorage.getItem('sysBgColor') || '',
-          MenuName: config.MenuName || '',
+          MenuName: config.MenuName || ''
         }
 
         url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam)))
diff --git a/src/views/pay/index.jsx b/src/views/pay/index.jsx
index 788a5c5..7230ba5 100644
--- a/src/views/pay/index.jsx
+++ b/src/views/pay/index.jsx
@@ -17,54 +17,47 @@
   state = {
     orderId: '',
     orderNo: '',
-    appid: '',
-    logo: '',
-    name: '',
-    copyRight: '',
-    icp: '',
+    logo: window.GLOB.doclogo || '',
+    name: sessionStorage.getItem('Full_Name') || '',
+    copyRight: window.GLOB.copyRight || '',
+    icp: window.GLOB.ICP || '',
     total: '',
     unit: '',
     qrcode: '',
     second: 60,
     overdue: false,
-    overdone: false
+    overdone: false,
+    appId: ''
   }
 
   UNSAFE_componentWillMount () {
-    let _urlparam = window.decodeURIComponent(window.atob(this.props.match.params.param))
-    let _params = {}
-    _urlparam.split('&').forEach(cell => {
-      let _cell = cell.split('=')
-      _params[_cell[0]] = _cell[1]
-    })
+    let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
 
-    if (!sessionStorage.getItem('LoginUID') && _params.LoginUID) {
-      sessionStorage.setItem('LoginUID', _params.LoginUID)
-    }
-    if (!sessionStorage.getItem('UserID') && _params.userid) {
-      sessionStorage.setItem('UserID', _params.userid)
-    }
+    let _appId = param.appId || window.GLOB.WXAppID || window.GLOB.WXminiAppID || ''
 
     this.setState({
-      orderId: _params.ID,
-      logo: _params.logo,
-      name: _params.name,
-      copyRight: _params.copyRight,
-      icp: _params.icp
+      orderId: param.ID,
+      appId: _appId
     })
 
-    if (_params.ID) {
-      this.getOrder(_params.ID)
-    } else {
+    if (param.ID && _appId) {
+      this.getOrder(param.ID, _appId)
+    } else if (!param.ID) {
       notification.warning({
         top: 92,
         message: '鏈幏鍙栧埌璁㈠崟ID锛�',
         duration: 5
       })
+    } else if (!_appId) {
+      notification.warning({
+        top: 92,
+        message: '鏈幏鍙栧埌搴旂敤ID锛�',
+        duration: 5
+      })
     }
   }
 
-  getOrder = (Id) => {
+  getOrder = (Id, appId) => {
     let param = {
       func: 's_get_weixin_pay_native',
       ID: Id
@@ -85,7 +78,6 @@
         }
 
         this.setState({
-          appid: res.appid,
           orderNo: res.out_trade_no,
           total: _total,
           unit: res.amount && res.amount.currency === 'CNY' ? '鍏�' : '鍏�',
@@ -114,19 +106,12 @@
             duration: 5
           })
           return
-        } else if (!res.appid) {
-          notification.warning({
-            top: 10,
-            message: '鏈幏鍙栧埌搴旂敤ID锛�',
-            duration: 5
-          })
-          return
         }
 
-        Api.getWxNativePay({ 'out_biz_no': res.out_trade_no, 'out_open_id': res.appid }).then(result => {
-          if (result.qrcode) {
+        Api.getWxNativePay({ 'out_biz_no': res.out_trade_no, app_id: appId }).then(result => {
+          if (result.status && result.code_url) {
             this.setState({
-              qrcode: result.qrcode
+              qrcode: result.code_url
             })
             setTimeout(this.resetSecond, 1000)
           } else {
@@ -135,7 +120,7 @@
             })
             notification.warning({
               top: 10,
-              message: result.msg || '鏈幏鍙栧埌鏀粯鐮侊紒',
+              message: result.message || '鏈幏鍙栧埌鏀粯鐮侊紒',
               duration: 5
             })
           }
@@ -198,7 +183,7 @@
   }
 
   resetQrcode = () => {
-    const { appid, orderNo } = this.state
+    const { orderNo, appId } = this.state
 
     if (!orderNo) {
       notification.warning({
@@ -207,12 +192,19 @@
         duration: 5
       })
       return
+    } else if (!appId) {
+      notification.warning({
+        top: 10,
+        message: '鏈幏鍙栧埌搴旂敤ID锛�',
+        duration: 5
+      })
+      return
     }
 
-    Api.getWxNativePay({ 'out_biz_no': orderNo, 'out_open_id': appid }).then(result => {
-      if (result.qrcode) {
+    Api.getWxNativePay({ 'out_biz_no': orderNo, app_id: appId }).then(result => {
+      if (result.status && result.code_url) {
         this.setState({
-          qrcode: result.qrcode,
+          qrcode: result.code_url,
           overdue: false,
           second: 60
         })
@@ -220,7 +212,7 @@
       } else {
         notification.warning({
           top: 10,
-          message: result.msg || '鏈幏鍙栧埌鏀粯鐮侊紒',
+          message: result.message || '鏈幏鍙栧埌鏀粯鐮侊紒',
           duration: 5
         })
       }
diff --git a/src/views/pcdesign/index.jsx b/src/views/pcdesign/index.jsx
index b1abf07..d998c92 100644
--- a/src/views/pcdesign/index.jsx
+++ b/src/views/pcdesign/index.jsx
@@ -115,6 +115,10 @@
           sessionStorage.removeItem('applangList')
         }
 
+        if (param.wxAppId) {
+          sessionStorage.setItem('wxAppId', param.wxAppId)
+        }
+
         this.getAppMessage(param.MenuID)
       } else if (param.type === 'view') {
         this.setState({
@@ -152,6 +156,10 @@
     MKEmitter.addListener('changeEditMenu', this.changeEditMenu)
     MKEmitter.addListener('triggerMenuSave', this.triggerMenuSave)
 
+    if (sessionStorage.getItem('wxAppId')) {
+      window.GLOB.WXAppID = sessionStorage.getItem('wxAppId')
+    }
+
     setTimeout(() => {
       this.getRoleFields()
       setGLOBFuncs()
diff --git a/src/views/tabledesign/index.jsx b/src/views/tabledesign/index.jsx
index 6dd9642..3fae1b5 100644
--- a/src/views/tabledesign/index.jsx
+++ b/src/views/tabledesign/index.jsx
@@ -88,6 +88,10 @@
     try {
       let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
 
+      if (param.lang) {
+        sessionStorage.setItem('lang', param.lang)
+      }
+      
       this.setState({
         MenuId: param.MenuID,
         ParentId: param.ParentId || '',
@@ -589,6 +593,8 @@
         let urlparam = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
         urlparam.type = 'admin'
         urlparam.MenuType = 'BaseTable'
+        urlparam.lang = sessionStorage.getItem('lang')
+
         url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam)))
         config.tbkey = key
       }

--
Gitblit v1.8.0