diff --git a/demo.html b/demo.html index ec2c684..4af5210 100644 --- a/demo.html +++ b/demo.html @@ -129,7 +129,11 @@ output("call ready"); hide(); var url = "https://vet.iqudoo.com/api?action=api.biz.wechat.JSSDKConfig"; - initSDK({ initWechatJssdk: { apiUrl: url } }, function () { + initSDK({ + webCanvasEnabled: true, + webScanBeepEnabled: true, + initWechatJssdk: { apiUrl: url } + }, function () { IScan.setStatusListener(function (res) { output("status", IScan.getStatus()); }); diff --git a/dist/index.d.ts b/dist/index.d.ts index dc895a3..e826c52 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -6,6 +6,22 @@ interface ScanConfigOptions { * 网页扫码canvas样式 */ webCanvasStyle?: string, + /** + * 网页扫码类型,默认支持二维码和条码 + */ + webScanType?: ('qrCode' | 'barCode')[], + /** + * 网页扫码canvas是否启用,默认启用 + */ + webCanvasEnabled?: boolean, + /** + * 网页扫码成功提示音地址,默认使用内置提示音 + */ + webScanBeepAudio?: string, + /** + * 网页扫码成功提示音是否启用,默认启用 + */ + webScanBeepEnabled?: boolean, /** * 微信JSSDK配置,微信环境才会生效,配置后会自动初始化微信JSSDK */ @@ -14,6 +30,31 @@ interface ScanConfigOptions { * 微信JSSDK配置API地址,调用接口会带上当前页面url作为参数 */ apiUrl: string, + /** + * 微信JSSDK配置参数,不配置则自动获取 + */ + sdkConfig?: { + /** + * 是否开启调试模式 + */ + debug?: boolean, + /** + * 微信公众平台应用ID + */ + appId: string, + /** + * 时间戳 + */ + timestamp: number, + /** + * 随机字符串 + */ + nonceStr: string, + /** + * 签名 + */ + signature: string, + }, /** * 微信JSSDK配置SDK地址,默认为https://res.wx.qq.com/open/js/jweixin-1.6.0.js */ diff --git a/dist/index.html b/dist/index.html index f18c7f9..5d223fb 100644 --- a/dist/index.html +++ b/dist/index.html @@ -100,7 +100,11 @@ output("call ready"); hide(); var url = "https://vet.iqudoo.com/api?action=api.biz.wechat.JSSDKConfig"; - initSDK({ initWechatJssdk: { apiUrl: url } }, function () { + initSDK({ + webCanvasEnabled: true, + webScanBeepEnabled: true, + initWechatJssdk: { apiUrl: url } + }, function () { IScan.setStatusListener(function (res) { output("status", IScan.getStatus()); }); diff --git a/dist/index.js b/dist/index.js index f90be7e..5bc9bab 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1 @@ -!function(n){var t={};function e(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return n[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}e.m=n,e.c=t,e.d=function(n,t,r){e.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:r})},e.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},e.t=function(n,t){if(1&t&&(n=e(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var o in n)e.d(r,o,function(t){return n[t]}.bind(null,o));return r},e.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(t,"a",t),t},e.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},e.p="",e(e.s=7)}([function(n,t,e){"use strict";t.__esModule=!0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n};t.getVersion=function(){return o.version},t.getConfig=function(n){var t=u[n];return t||(t=i[n]),t},t.setConfig=function(n){n&&"object"==(void 0===n?"undefined":r(n))&&Object.assign(u,n)};var o={version:"0.0.1.0430.1033"},i={},u={}},function(n,t,e){"use strict";t.__esModule=!0;var r;r="undefined"!=typeof GameGlobal?Object.assign({},GameGlobal):"undefined"==typeof window?{setTimeout:function(n){function t(){return n.apply(this,arguments)}return t.toString=function(){return n.toString()},t}((function(){return setTimeout.apply(void 0,arguments)})),setInterval:function(n){function t(){return n.apply(this,arguments)}return t.toString=function(){return n.toString()},t}((function(){return setInterval.apply(void 0,arguments)})),clearTimeout:function(n){function t(){return n.apply(this,arguments)}return t.toString=function(){return n.toString()},t}((function(){return clearTimeout.apply(void 0,arguments)})),clearInterval:function(n){function t(){return n.apply(this,arguments)}return t.toString=function(){return n.toString()},t}((function(){return clearInterval.apply(void 0,arguments)}))}:window,t.default=r},function(n,t,e){"use strict";t.__esModule=!0,t.createUUID=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(n){var t=16*Math.random()|0;return("x"==n?t:3&t|8).toString(16)}))}},function(n,t,e){"use strict";t.__esModule=!0,t.isReadyCalled=function(){return s},e(8);var r=function(n){return n&&n.__esModule?n:{default:n}}(e(1)),o=e(0),i=e(13),u=e(6),c=e(5),a=null,s=!1;r.default.__IScanReady__&&r.default.__IScanReady__(),t.default=Object.assign({},{config:function(n){return n&&(0,o.setConfig)(n),a||(a=Promise.resolve().then((function(){return(0,c.printDebug)("-------------------------------"),(0,c.printDebug)("sdk_version:",(0,o.getVersion)()),(0,c.printDebug)("-------------------------------"),(0,u.initWxJssdk)(),Promise.resolve().then((function(){s=!0})).catch((function(n){throw a=null,n}))})))},onScanListener:i.onScanListener,offScanListener:i.offScanListener,setStatusListener:i.setStatusListener,getStatus:i.getStatus,startScan:i.startScan,stopScan:i.stopScan,clear:i.clear})},function(n,t,e){"use strict";t.__esModule=!0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n};t.toAny=function(n,t){if(null==n)return t;var e=function(n){if("string"!=typeof n)return void 0===n?"undefined":r(n);try{var t=JSON.parse(n);return void 0===t?"undefined":r(t)}catch(t){var e=parseFloat(n);return isNaN(e)||""+e!==n?"string":"number"}}(n);switch(null!=t&&(e=void 0===t?"undefined":r(t)),e){case"number":return function(n){try{return JSON.parse(n)}catch(t){return parseFloat(n)}}(n);case"boolean":return function(n){return!!n&&"false"!=n&&"0"!=n}(n);case"object":return function(n,t){if("object"===(void 0===n?"undefined":r(n)))return n;try{return JSON.parse(n)}catch(n){}return t}(n,t);case"string":return function(n,t){try{var e=void 0===n?"undefined":r(n);if("string"===e)return n;if("boolean"===e)return n?"true":"false";if("number"===e)return""+n;if("object"===e)return JSON.stringify(n)}catch(n){}return t}(n,t)}return t}},function(n,t,e){"use strict";t.__esModule=!0,t.printError=function(n){for(var t,e=arguments.length,r=Array(e>1?e-1:0),o=1;o1?e-1:0),o=1;o1?e-1:0),o=1;o1)for(var e=1;e0?(0,u.startScanner)((function(n){!function(n){if(function(n){for(var t=0;t=0&&e.splice(r,1)}},t.bridgeSync=l,t.bridgeAsync=function(n,t,e){return new Promise((function(r,o){if(f()){var u=!1,a=null;e>0&&(a=setTimeout((function(){u=!0,a=null,o("bridgeAsync timeout")}),e));var s=(0,i.createUUID)()+"_"+Date.now();!function(n,t){t&&(c[n]=t)}(s,(function(n,t){u||(a&&clearTimeout(a),0==n?r(t):o(t))})),l(n,Object.assign({request_id:s},t))}else o("Can't bridgeAsync, because not in runtime")})).then((function(e){var r=[n];return t&&(r.push("params:"),r.push(t)),e&&(r.push("resp:"),r.push(e)),o.printDebug.apply(void 0,["bridge resp >>>"].concat(r)),e})).catch((function(e){throw t?(0,o.printWarn)("bridge err >>>",n,"params:",t,e):(0,o.printWarn)("bridge err >>>",n,e),e}))};var r=e(4),o=e(5),i=e(2),u={},c={},a="__bridge_client__";function s(){var n=a+"_handle_callback";window[n]||(window[n]=function(n){var t=(0,r.toAny)(n,{}),e=t.method,o=t.payload,i=t.code,a=t.request_id,s=(0,r.toAny)(o,{});a?c[a]&&c[a](i,s):u[e]&&u[e].forEach((function(n){n&&n(s)}))})}function f(){return!!window[a]}function l(n,t){s();var e=(0,r.toAny)(function(n){for(var t=n.split("."),e=window;t.length>1;)e=e[t.shift()];if(e&&1==t.length&&e.hasOwnProperty(t[0])){for(var r,o=arguments.length,i=Array(o>1?o-1:0),u=1;u>>"].concat(i)),e}},function(n,t,e){"use strict";t.__esModule=!0,t.isSupportWebScan=function(){return"undefined"!=typeof navigator&&navigator.mediaDevices&&navigator.mediaDevices.getUserMedia&&"undefined"!=typeof BarcodeDetector},t.isSupportImageScan=function(){return"undefined"!=typeof document&&"undefined"!=typeof BarcodeDetector&&"undefined"!=typeof URL&&URL.createObjectURL},t.stopScanForWeb=f,t.startScanForImage=function(){return s((0,o.getConfig)("scanType")).then((function(n){return new Promise((function(n){var t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none";var e=!1,r=function(t){e||(e=!0,u("__webscan_image_input__"),n(t))};t.id="__webscan_image_input__",t.onchange=function(){r(t.files&&t.files[0])},t.oncancel=function(){r(null)},document.body.appendChild(t),t.click()})).then((function(t){return function(n,t){return t?"undefined"!=typeof createImageBitmap?createImageBitmap(t).then((function(t){return n.detect(t).then((function(n){return t.close&&t.close(),n&&n[0]})).catch((function(n){throw t.close&&t.close(),n}))})):new Promise((function(e,r){var o=new Image,i=URL.createObjectURL(t);o.onload=function(){n.detect(o).then((function(n){URL.revokeObjectURL(i),e(n&&n[0])})).catch((function(n){URL.revokeObjectURL(i),r(n)}))},o.onerror=function(n){URL.revokeObjectURL(i),r(n)},o.src=i})):Promise.resolve(null)}(n,t)}))})).then((function(n){return n&&n.rawValue?{result:n.rawValue}:{success:!1,error:"未识别到二维码或条形码"}}))},t.startScanForWeb=function(n,t){return new Promise((function(e,u){try{i.uuid=(0,r.createUUID)(),i.finish=!1;var l,d=c("video","__webscan_video__","display: none",!1),p=n||"position: fixed; width: 300px; height: 240px; top: 0; left: 0; z-index: 9999;",h=c("canvas","__webscan_canvas__",p+" display: none;",!0);h.style.display,h.style.cssText=p,l=h.style.display,h.style.display="none";var v=h.getContext("2d"),y=i.uuid;d.width=300,d.height=300,d.uuid=i.uuid,s((0,o.getConfig)("scanType")).then((function(n){return navigator.mediaDevices.getUserMedia({video:{facingMode:"environment"}}).then((function(t){return{detector:n,stream:t}}))})).then((function(n){var r=n.detector,c=n.stream;d.srcObject=c,d.setAttribute("playsinline",!0),d.play();var s=(0,o.getConfig)("closeWebScan",(function(){})),p=(0,o.getConfig)("displayWebScan",(function(n,t){}));p&&p(h,(function(){f()})),h.style.display="none";var g=!1,m=!1,_=!1,b=function(){if(!_){_=!0;try{c.getTracks()[0].stop()}catch(n){}s&&s()}};requestAnimationFrame((function(){!function n(){try{d.readyState!==d.HAVE_ENOUGH_DATA||g||(h.height=d.videoHeight,h.width=d.videoWidth,v.setTransform(-1,0,0,1,h.width,0),v.drawImage(d,0,0,h.width,h.height),v.setTransform(1,0,0,1,0,0),m||(m=!0,h.style.display=l||""),g=!0,r.detect(d).then((function(n){var r=n&&n[0];if(r&&r.rawValue&&i.uuid==y){if(t&&!t(r.rawValue))return;!function(n,t,e){var r=e.cornerPoints;if(r&&r.length)for(var o=0;o1&&(e[t[0]]=t[1])}})),s.status>=200&&s.status<300){var r={errMsg:"request:ok"};try{var o=JSON.parse(s.response);r.data=o}catch(n){r.data=s.response}r.header=e,r.statusCode=s.status,n.success&&n.success(r)}else n.fail&&n.fail({errMsg:"request:fail",data:s.response,header:e})}},s.send(t)}(Object.assign({},{url:t,method:e,data:f,headers:c,json:a,timeout:s},{success:n,fail:r}))})).then((function(n){if(n.statusCode&&200!=n.statusCode)throw n;return n}))};var r=e(2),o=e(17),i=e(18)},function(n,t,e){"use strict";t.__esModule=!0,t.hex_md5=function(n){return h(o(d(n),n.length*r))},t.b64_md5=function(n){return v(o(d(n),n.length*r))},t.str_md5=function(n){return p(o(d(n),n.length*r))},t.hex_hmac_md5=function(n,t){return h(f(n,t))},t.b64_hmac_md5=function(n,t){return v(f(n,t))},t.str_hmac_md5=function(n,t){return p(f(n,t))};var r=8;function o(n,t){n[t>>5]|=128<>>9<<4)]=t;for(var e=1732584193,r=-271733879,o=-1732584194,i=271733878,f=0;f>>32-t}(l(l(t,n),l(r,i)),o),e)}function u(n,t,e,r,o,u,c){return i(t&e|~t&r,n,t,o,u,c)}function c(n,t,e,r,o,u,c){return i(t&r|e&~r,n,t,o,u,c)}function a(n,t,e,r,o,u,c){return i(t^e^r,n,t,o,u,c)}function s(n,t,e,r,o,u,c){return i(e^(t|~r),n,t,o,u,c)}function f(n,t){var e=d(n);e.length>16&&(e=o(e,n.length*r));for(var i=Array(16),u=Array(16),c=0;c<16;c++)i[c]=909522486^e[c],u[c]=1549556828^e[c];var a=o(i.concat(d(t)),512+t.length*r);return o(u.concat(a),640)}function l(n,t){var e=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(e>>16)<<16|65535&e}function d(n){for(var t=Array(),e=(1<>5]|=(n.charCodeAt(o/r)&e)<>5]>>>o%32&e);return t}function h(n){for(var t="0123456789abcdef",e="",r=0;r<4*n.length;r++)e+=t.charAt(n[r>>2]>>r%4*8+4&15)+t.charAt(n[r>>2]>>r%4*8&15);return e}function v(n){for(var t="",e=0;e<4*n.length;e+=3)for(var r=(n[e>>2]>>e%4*8&255)<<16|(n[e+1>>2]>>(e+1)%4*8&255)<<8|n[e+2>>2]>>(e+2)%4*8&255,o=0;o<4;o++)8*e+6*o>32*n.length?t+="":t+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(r>>6*(3-o)&63);return t}},function(n,t,e){"use strict";t.__esModule=!0,t.stringifyQuery=function(n){return Object.keys(n).map((function(t){var e=n[t];return t+"="+encodeURIComponent(e)})).join("&")},t.decodeQuery=function(n){return Object.keys(n).reduce((function(t,e){var r=n[e];return t[e]=decodeURIComponent(r),t}),{})},t.parseQueryParams=o,t.appendQueryParams=function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=o(n),r=e.url,i=e.params;Object.keys(t).forEach((function(n){var e=t[n];null!=e?i[n]=e:delete i[n]}));var u=Object.keys(i).map((function(n){var t=i[n];return n+"="+encodeURIComponent(t)})).join("&");return r?u?r+"?"+u:r:u},t.getQueryString=function(n,t){var e=r.default.location.search,o=new RegExp("(^|&)"+n+"=([^&]*)(&|$)"),i=e.substr(1).match(o);return null!=i?decodeURIComponent(unescape(i[2])):t};var r=function(n){return n&&n.__esModule?n:{default:n}}(e(1));function o(n){var t="",e={};if(!n||"string"!=typeof n)return{url:t,params:e};var r="",o=n.indexOf("?"),i=n.indexOf("#"),u=n.indexOf("=");return o>=0?(t=n.substring(0,o),r=n.substring(o+1,i>0?i:n.length)):u>=0?(t="",r=n):(t=n,r=""),r.split("&").map((function(n){var t=n.indexOf("=");if(t>0){var r=n.substring(0,t),o=n.substring(t+1);e[r]=decodeURIComponent(o)}})),{url:t,params:e}}},function(n,t,e){"use strict";t.__esModule=!0,t.startScanner=function(n){n&&"function"==typeof n&&(r=n,"scanning"!==o&&(o="scanning",a(),window.addEventListener("keydown",s)))},t.stopScanner=function(){"scanning"===o&&(o="closed",r=null,a(),window.removeEventListener("keydown",s))};var r=null,o="closed",i="",u=null,c=0;function a(){i="",c=0,u&&(clearTimeout(u),u=null)}function s(n){if("scanning"===o&&!(n.ctrlKey||n.metaKey||n.altKey)){if("Enter"===n.key){var t=function(n){return n.replace(/[\uFF01-\uFF5E]/g,(function(n){return String.fromCharCode(n.charCodeAt(0)-65248)})).replace(/\u3002/g,".")}(i);return t&&function(n){n.preventDefault&&n.preventDefault(),n.stopPropagation&&n.stopPropagation()}(n),console.log("onScannerKeydown",t),a(),void(t&&r&&r(t))}if(n.key&&1===n.key.length){var e=Date.now();c&&e-c>100&&a(),c=e,i+=n.key,u&&clearTimeout(u),u=setTimeout((function(){a()}),100)}}}},function(n,t,e){"use strict";t.__esModule=!0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n};t.exportSDK=function(n,t){for(var e=arguments.length,i=Array(e>2?e-2:0),u=2;u1&&void 0!==arguments[1]?arguments[1]:"",o={};return Object.keys(t).forEach((function(i){var u=t[i];if("object"===(void 0===u?"undefined":r(u)))Object.assign(o,n(u,""+e+i+"."));else if("function"==typeof u){var c,a=""+e+i;Object.assign(o,((c={})[a]=a,c))}})),o}(n);var a={};return Object.keys(c).forEach((function(t){var e=c[t],r=e&&e.method||t;!function(n,t,e){var r=t.split(".");r.forEach((function(t,o){o==r.length-1?n[t]=e:n[t]||(n[t]={}),n=n[t]}))}(a,t,(function(){for(var e=arguments.length,u=Array(e),c=0;c1;)e=e[r.shift()];if(e&&1==r.length&&e.hasOwnProperty(r[0])){for(var o,i=arguments.length,u=Array(i>2?i-2:0),c=2;c1?t-1:0),r=1;r1?t-1:0),r=1;r1?t-1:0),r=1;r1)for(var t=1;t0?(0,i.startScanner)((function(A){!function(A){if(function(A){for(var n=0;n=0&&t.splice(e,1)}},n.bridgeSync=f,n.bridgeAsync=function(A,n,t){return new Promise((function(e,r){if(s()){var i=!1,c=null;t>0&&(c=setTimeout((function(){i=!0,c=null,r("bridgeAsync timeout")}),t));var a=(0,o.createUUID)()+"_"+Date.now();!function(A,n){n&&(u[A]=n)}(a,(function(A,n){i||(c&&clearTimeout(c),0==A?e(n):r(n))})),f(A,Object.assign({request_id:a},n))}else r("Can't bridgeAsync, because not in runtime")})).then((function(t){var e=[A];return n&&(e.push("params:"),e.push(n)),t&&(e.push("resp:"),e.push(t)),r.printDebug.apply(void 0,["bridge resp >>>"].concat(e)),t})).catch((function(t){throw n?(0,r.printWarn)("bridge err >>>",A,"params:",n,t):(0,r.printWarn)("bridge err >>>",A,t),t}))};var e=t(4),r=t(5),o=t(2),i={},u={},c="__bridge_client__";function a(){var A=c+"_handle_callback";window[A]||(window[A]=function(A){var n=(0,e.toAny)(A,{}),t=n.method,r=n.payload,o=n.code,c=n.request_id,a=(0,e.toAny)(r,{});c?u[c]&&u[c](o,a):i[t]&&i[t].forEach((function(A){A&&A(a)}))})}function s(){return!!window[c]}function f(A,n){a();var t=(0,e.toAny)(function(A){for(var n=A.split("."),t=window;n.length>1;)t=t[n.shift()];if(t&&1==n.length&&t.hasOwnProperty(n[0])){for(var e,r=arguments.length,o=Array(r>1?r-1:0),i=1;i>>"].concat(o)),t}},function(A,n,t){"use strict";n.__esModule=!0,n.isSupportWebScan=function(){return"undefined"!=typeof navigator&&navigator.mediaDevices&&navigator.mediaDevices.getUserMedia&&"undefined"!=typeof BarcodeDetector},n.isSupportImageScan=function(){return"undefined"!=typeof document&&"undefined"!=typeof BarcodeDetector&&"undefined"!=typeof URL&&URL.createObjectURL},n.stopScanForWeb=function(){return Promise.resolve().then((function(){o.uuid=null}))},n.startScanForImage=function(){return s((0,r.getConfig)("webScanType")).then((function(A){return new Promise((function(A){var n=document.createElement("input");n.type="file",n.accept="image/*",n.style.display="none";var t=!1,e=function(n){t||(t=!0,u("__webscan_image_input__"),A(n))};n.id="__webscan_image_input__",n.onchange=function(){e(n.files&&n.files[0])},n.oncancel=function(){e(null)},document.body.appendChild(n),n.click()})).then((function(n){return function(A,n){return n?"undefined"!=typeof createImageBitmap?createImageBitmap(n).then((function(n){return A.detect(n).then((function(A){return n.close&&n.close(),A&&A[0]})).catch((function(A){throw n.close&&n.close(),A}))})):new Promise((function(t,e){var r=new Image,o=URL.createObjectURL(n);r.onload=function(){A.detect(r).then((function(A){URL.revokeObjectURL(o),t(A&&A[0])})).catch((function(A){URL.revokeObjectURL(o),e(A)}))},r.onerror=function(A){URL.revokeObjectURL(o),e(A)},r.src=o})):Promise.resolve(null)}(A,n)}))})).then((function(A){return A&&A.rawValue?{result:A.rawValue}:{success:!1,error:"未识别到二维码或条形码"}}))},n.startScanForWeb=function(A,n){return new Promise((function(t,u){try{o.uuid=(0,e.createUUID)(),o.finish=!1;var f,l=c("video","__webscan_video__","display: none",!1),g=!1!==(0,r.getConfig)("webCanvasEnabled"),d=A||"position: fixed; width: 300px; height: 240px; top: 0; left: 0; z-index: 9999;",p=c("canvas","__webscan_canvas__",d+" display: none;",!0);p.style.display,p.style.cssText=d,f=p.style.display,p.style.display="none";var C=p.getContext("2d"),h=o.uuid;l.width=300,l.height=300,l.uuid=o.uuid,s((0,r.getConfig)("webScanType")).then((function(A){return navigator.mediaDevices.getUserMedia({video:{facingMode:"environment"}}).then((function(n){return{detector:A,stream:n}}))})).then((function(A){var e=A.detector,c=A.stream;l.srcObject=c,l.setAttribute("playsinline",!0),l.play(),p.style.display="none";var s=!1,d=!1,w=!1,B=function(){if(!w){w=!0;try{c.getTracks()[0].stop()}catch(A){}}};requestAnimationFrame((function(){!function A(){try{l.readyState!==l.HAVE_ENOUGH_DATA||s||(p.height=l.videoHeight,p.width=l.videoWidth,C.setTransform(-1,0,0,1,p.width,0),C.drawImage(l,0,0,p.width,p.height),C.setTransform(1,0,0,1,0,0),g&&!d&&(d=!0,p.style.display=f||""),s=!0,e.detect(l).then((function(A){var e=A&&A[0];if(e&&e.rawValue&&o.uuid==h){if(!n||!n(e.rawValue))return;!function(A,n,t){var e=t.cornerPoints;if(e&&e.length)for(var r=0;r1&&(t[n[0]]=n[1])}})),a.status>=200&&a.status<300){var e={errMsg:"request:ok"};try{var r=JSON.parse(a.response);e.data=r}catch(A){e.data=a.response}e.header=t,e.statusCode=a.status,A.success&&A.success(e)}else A.fail&&A.fail({errMsg:"request:fail",data:a.response,header:t})}},a.send(n)}(Object.assign({},{url:n,method:t,data:s,headers:u,json:c,timeout:a},{success:A,fail:e}))})).then((function(A){if(A.statusCode&&200!=A.statusCode)throw A;return A}))};var e=t(2),r=t(18),o=t(19)},function(A,n,t){"use strict";n.__esModule=!0,n.hex_md5=function(A){return d(r(l(A),A.length*e))},n.b64_md5=function(A){return p(r(l(A),A.length*e))},n.str_md5=function(A){return g(r(l(A),A.length*e))},n.hex_hmac_md5=function(A,n){return d(s(A,n))},n.b64_hmac_md5=function(A,n){return p(s(A,n))},n.str_hmac_md5=function(A,n){return g(s(A,n))};var e=8;function r(A,n){A[n>>5]|=128<>>9<<4)]=n;for(var t=1732584193,e=-271733879,r=-1732584194,o=271733878,s=0;s>>32-n}(f(f(n,A),f(e,o)),r),t)}function i(A,n,t,e,r,i,u){return o(n&t|~n&e,A,n,r,i,u)}function u(A,n,t,e,r,i,u){return o(n&e|t&~e,A,n,r,i,u)}function c(A,n,t,e,r,i,u){return o(n^t^e,A,n,r,i,u)}function a(A,n,t,e,r,i,u){return o(t^(n|~e),A,n,r,i,u)}function s(A,n){var t=l(A);t.length>16&&(t=r(t,A.length*e));for(var o=Array(16),i=Array(16),u=0;u<16;u++)o[u]=909522486^t[u],i[u]=1549556828^t[u];var c=r(o.concat(l(n)),512+n.length*e);return r(i.concat(c),640)}function f(A,n){var t=(65535&A)+(65535&n);return(A>>16)+(n>>16)+(t>>16)<<16|65535&t}function l(A){for(var n=Array(),t=(1<>5]|=(A.charCodeAt(r/e)&t)<>5]>>>r%32&t);return n}function d(A){for(var n="0123456789abcdef",t="",e=0;e<4*A.length;e++)t+=n.charAt(A[e>>2]>>e%4*8+4&15)+n.charAt(A[e>>2]>>e%4*8&15);return t}function p(A){for(var n="",t=0;t<4*A.length;t+=3)for(var e=(A[t>>2]>>t%4*8&255)<<16|(A[t+1>>2]>>(t+1)%4*8&255)<<8|A[t+2>>2]>>(t+2)%4*8&255,r=0;r<4;r++)8*t+6*r>32*A.length?n+="":n+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e>>6*(3-r)&63);return n}},function(A,n,t){"use strict";n.__esModule=!0,n.stringifyQuery=function(A){return Object.keys(A).map((function(n){var t=A[n];return n+"="+encodeURIComponent(t)})).join("&")},n.decodeQuery=function(A){return Object.keys(A).reduce((function(n,t){var e=A[t];return n[t]=decodeURIComponent(e),n}),{})},n.parseQueryParams=r,n.appendQueryParams=function(A){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=r(A),e=t.url,o=t.params;Object.keys(n).forEach((function(A){var t=n[A];null!=t?o[A]=t:delete o[A]}));var i=Object.keys(o).map((function(A){var n=o[A];return A+"="+encodeURIComponent(n)})).join("&");return e?i?e+"?"+i:e:i},n.getQueryString=function(A,n){var t=e.default.location.search,r=new RegExp("(^|&)"+A+"=([^&]*)(&|$)"),o=t.substr(1).match(r);return null!=o?decodeURIComponent(unescape(o[2])):n};var e=function(A){return A&&A.__esModule?A:{default:A}}(t(1));function r(A){var n="",t={};if(!A||"string"!=typeof A)return{url:n,params:t};var e="",r=A.indexOf("?"),o=A.indexOf("#"),i=A.indexOf("=");return r>=0?(n=A.substring(0,r),e=A.substring(r+1,o>0?o:A.length)):i>=0?(n="",e=A):(n=A,e=""),e.split("&").map((function(A){var n=A.indexOf("=");if(n>0){var e=A.substring(0,n),r=A.substring(n+1);t[e]=decodeURIComponent(r)}})),{url:n,params:t}}},function(A,n,t){"use strict";n.__esModule=!0,n.startScanner=function(A){A&&"function"==typeof A&&(e=A,"scanning"!==r&&(r="scanning",c(),window.addEventListener("keydown",a)))},n.stopScanner=function(){"scanning"===r&&(r="closed",e=null,c(),window.removeEventListener("keydown",a))};var e=null,r="closed",o="",i=null,u=0;function c(){o="",u=0,i&&(clearTimeout(i),i=null)}function a(A){if("scanning"===r&&!(A.ctrlKey||A.metaKey||A.altKey)){if("Enter"===A.key){var n=function(A){return A.replace(/[\uFF01-\uFF5E]/g,(function(A){return String.fromCharCode(A.charCodeAt(0)-65248)})).replace(/\u3002/g,".")}(o);return n&&function(A){A.preventDefault&&A.preventDefault(),A.stopPropagation&&A.stopPropagation()}(A),console.log("onScannerKeydown",n),c(),void(n&&e&&e(n))}if(A.key&&1===A.key.length){var t=Date.now();u&&t-u>100&&c(),u=t,o+=A.key,i&&clearTimeout(i),i=setTimeout((function(){c()}),100)}}}},function(A,n,t){"use strict";n.__esModule=!0;var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A};n.exportSDK=function(A,n){for(var t=arguments.length,o=Array(t>2?t-2:0),i=2;i1&&void 0!==arguments[1]?arguments[1]:"",r={};return Object.keys(n).forEach((function(o){var i=n[o];if("object"===(void 0===i?"undefined":e(i)))Object.assign(r,A(i,""+t+o+"."));else if("function"==typeof i){var u,c=""+t+o;Object.assign(r,((u={})[c]=c,u))}})),r}(A);var c={};return Object.keys(u).forEach((function(n){var t=u[n],e=t&&t.method||n;!function(A,n,t){var e=n.split(".");e.forEach((function(n,r){r==e.length-1?A[n]=t:A[n]||(A[n]={}),A=A[n]}))}(c,n,(function(){for(var t=arguments.length,i=Array(t),u=0;u1;)t=t[e.shift()];if(t&&1==e.length&&t.hasOwnProperty(e[0])){for(var r,o=arguments.length,i=Array(o>2?o-2:0),u=2;u { + // no thing + }); + } catch (e) { + } +} + export function isSupportWebScan() { return typeof navigator !== 'undefined' && navigator.mediaDevices @@ -184,7 +205,7 @@ function detectImageFile(detector, file) { } export function startScanForImage() { - return createBarcodeDetector(getConfig("scanType")).then(detector => { + return createBarcodeDetector(getConfig("webScanType")).then(detector => { return chooseImageFile().then(file => detectImageFile(detector, file)); }).then(code => { if (code && code.rawValue) { @@ -207,6 +228,7 @@ export function startScanForWeb(canvasStyle, onResult) { let videoEl = createEl("video", "__webscan_video__", "display: none", false); + let canvasEnabled = getConfig("webCanvasEnabled") !== false; let canvasDisplay = ""; let canvasBaseStyle = canvasStyle || "position: fixed; width: 300px; height: 240px; top: 0; left: 0; z-index: 9999;"; let canvasEl = createEl("canvas", @@ -221,7 +243,7 @@ export function startScanForWeb(canvasStyle, onResult) { videoEl.width = 300; videoEl.height = 300; videoEl.uuid = scanWeb.uuid; - createBarcodeDetector(getConfig("scanType")).then(detector => { + createBarcodeDetector(getConfig("webScanType")).then(detector => { return navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" @@ -238,15 +260,6 @@ export function startScanForWeb(canvasStyle, onResult) { videoEl.srcObject = stream; videoEl.setAttribute("playsinline", true); // iOS使用 videoEl.play(); - let closeWebScan = getConfig("closeWebScan", () => { - // no thing - }); - let displayWebScan = getConfig("displayWebScan", (canvasEl, cancal) => { - // no thing - }); - displayWebScan && displayWebScan(canvasEl, () => { - stopScanForWeb(); - }); canvasEl.style.display = "none"; let detecting = false; let displayed = false; @@ -259,7 +272,6 @@ export function startScanForWeb(canvasStyle, onResult) { try { stream.getTracks()[0].stop(); } catch (_e) { } - closeWebScan && closeWebScan(); }; let tick = () => { try { @@ -269,7 +281,7 @@ export function startScanForWeb(canvasStyle, onResult) { context.setTransform(-1, 0, 0, 1, canvasEl.width, 0); context.drawImage(videoEl, 0, 0, canvasEl.width, canvasEl.height); context.setTransform(1, 0, 0, 1, 0, 0); - if (!displayed) { + if (canvasEnabled && !displayed) { displayed = true; canvasEl.style.display = canvasDisplay || ""; } @@ -277,10 +289,11 @@ export function startScanForWeb(canvasStyle, onResult) { detector.detect(videoEl).then(barcodes => { const code = barcodes && barcodes[0]; if (code && code.rawValue && scanWeb.uuid == currentUuid) { - if (onResult && !onResult(code.rawValue)) { + if (!onResult || !onResult(code.rawValue)) { return; } drawBarcode(context, canvasEl.width, code); + playScanBeep(); scanWeb.uuid = null; scanWeb.finish = true; close(); diff --git a/src/services/wx/index.js b/src/services/wx/index.js index b3d3808..683e80e 100644 --- a/src/services/wx/index.js +++ b/src/services/wx/index.js @@ -45,9 +45,12 @@ function loadWxScript() { function fetchWxConfig() { let initWechatJssdk = toAny(getConfig("initWechatJssdk"), {}); + if (!!initWechatJssdk.sdkConfig) { + return Promise.resolve(toAny(initWechatJssdk.sdkConfig, {})); + } let apiUrl = toAny(initWechatJssdk.apiUrl, ""); if (!apiUrl) { - return Promise.reject(new Error("initWechatJssdk.apiUrl is required, but not found")); + return Promise.reject(new Error("initWechatJssdk.apiUrl or initWechatJssdk.sdkConfig is required, but not found")); } return request({ url: apiUrl, @@ -61,7 +64,7 @@ function fetchWxConfig() { return null; } if (data.code !== 0) { - throw new Error(data.msg || "wx config fetch failed"); + throw new Error(data.msg || "wechat jssdk config fetch failed"); } if (data.data) { return data.data; @@ -94,10 +97,10 @@ export function initWxJssdk() { const wx = items[0]; const config = items[1]; if (!wx || !wx.config) { - throw new Error("wx jssdk is not ready"); + throw new Error("wechat jssdk is not ready"); } if (!config) { - throw new Error("wx config is empty"); + throw new Error("wechat jssdk config is empty"); } const jsApiList = config.jsApiList || []; if (jsApiList.indexOf(WX_SCAN_API) === -1) { diff --git a/types/index.d.ts b/types/index.d.ts index dc895a3..e826c52 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -6,6 +6,22 @@ interface ScanConfigOptions { * 网页扫码canvas样式 */ webCanvasStyle?: string, + /** + * 网页扫码类型,默认支持二维码和条码 + */ + webScanType?: ('qrCode' | 'barCode')[], + /** + * 网页扫码canvas是否启用,默认启用 + */ + webCanvasEnabled?: boolean, + /** + * 网页扫码成功提示音地址,默认使用内置提示音 + */ + webScanBeepAudio?: string, + /** + * 网页扫码成功提示音是否启用,默认启用 + */ + webScanBeepEnabled?: boolean, /** * 微信JSSDK配置,微信环境才会生效,配置后会自动初始化微信JSSDK */ @@ -14,6 +30,31 @@ interface ScanConfigOptions { * 微信JSSDK配置API地址,调用接口会带上当前页面url作为参数 */ apiUrl: string, + /** + * 微信JSSDK配置参数,不配置则自动获取 + */ + sdkConfig?: { + /** + * 是否开启调试模式 + */ + debug?: boolean, + /** + * 微信公众平台应用ID + */ + appId: string, + /** + * 时间戳 + */ + timestamp: number, + /** + * 随机字符串 + */ + nonceStr: string, + /** + * 签名 + */ + signature: string, + }, /** * 微信JSSDK配置SDK地址,默认为https://res.wx.qq.com/open/js/jweixin-1.6.0.js */ diff --git a/webpack.base.js b/webpack.base.js index d6a585b..2a19acc 100644 --- a/webpack.base.js +++ b/webpack.base.js @@ -28,7 +28,7 @@ const config = { template: 'demo.html' }), new CpWebpackPlugin([ - { from: path.resolve('./types'), to: path.resolve('./dist') } + { from: path.resolve('./types'), to: path.resolve('./dist') }, ]) ], devtool: 'cheap-module-souce-map', diff --git a/webpack.rules.js b/webpack.rules.js index 838d400..3a53923 100644 --- a/webpack.rules.js +++ b/webpack.rules.js @@ -23,6 +23,14 @@ const rules = [{ limit: 8192, }, }], +}, { + test: /\.(ogg|mp3|wav)$/, + use: [{ + loader: 'url-loader', + options: { + limit: 65536, + }, + }], }, { test: /\.css$/, use: [{