小程序webview(H5)调用JSSDK功能指北

JavaScript028

小程序webview(H5)调用JSSDK功能指北,第1张

最核心的一个概念 :小程序 的webview(H5页面)中调用jssdk中的功能(比如获取位置信息),需要有一个和小程序申请主体一致的 公众号 账号,在公众号里去配置相关的jssdk信息.1 小程序账号因为webview不支持个人类型,所以需要申请一个企业法人及个体工商户类型的小程序账号2   公众号账号要求小程序和公众号的账号对应的主体信息必须一致,有两种途径达到此目的: 先申请公众号账号,然后通过公众号的快速生成小程序功能,生成步骤1的小程序账号,这样这两个自然满足同主体资格登录微信公众号平台,点击小程序管理-添加-快速注册并认证小程序:用和申请小程序账号完全一致的主体信息去申请公众号(主体类型,主体名称,主体证件号),也能保证两个账号的主体资格一致(目前没有小程序快速生成公众号账号的功能..)3 域名绑定这里需要两个账号都配置一下:业务域名首先webview指向一个外部网页链接(我们的H5页面) <web-view src="https://abc.xxx.com.cn/cc/index.html"></web-view> 这个地址要满足: 已经通过ICP备案域名 https协议 不支持自定义端口 不支持ip地址 不支持短链域名 那么首先要在 小程序 中的'开发'-'开发设置'的'业务域名'中,将https://abc.xxx.com.cn配置进去:JS接口安全域名在上述h5页面中,因为要调用jssdk的js文件: <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script> 因此要在公众号设置”的“功能设置”里填写“JS接口安全域名”注意 :以上两个配置地址时,都需要将配置时提供的一个文本文件按照要求上传到H5页面所在服务器并确保能被访问,用于腾讯验证服务器,否则是无法提交相关信息的4 应用jssdk提供了很多功能,但是webview中,只支持部分接口,自行查看web-view,这里以获取位置信息为例:通过config接口注入权限验证配置所有需要使用JSSDK的页面必须先注入配置信息,否则将无法调用: wx.config({ appId: '', // 必填,公众号的appid,注意不是小程序的appid timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 debug: true, // 选填,开启调试模式,调用的所有api的返回值会在客户端alert出来。 jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表,这里为获取位置信息 }) 以上参数除了最后两个,建议在后台服务中存储和计算,具体需参考jssdk,主要思路: 利用公众号的 appid 和 secret 去获取 access_token利用 access_token 去获取 ticket利用ticket和自行生成的( timestamp , nonceStr ,当前页面的 地址 )计算出最终的 签名 执行getLocation以上步骤执行成功后,方可执行wx.getLocation: var success=true // 之所以这里有个success变量,是因为发现wx.error触发也会调用wx.ready(如果有个wx.success就好了) //但其实这并不完美,因为还发现有时候wx.ready先执行,然后触发了wx.error ........ wx.ready(function(){ if(success){ wx.getLocation({ type: 'wgs84', success(res) { // res为坐标位置信息 }, fail(e) { // 获取失败 } }) } // config信息验证后会执行ready方法 }) wx.error(function(res){ success=false // config信息验证失败会执行error函数 }) 吐槽: wx.config有时候成功,有时候说签名失败 wx.ready代表配置验证完毕了,不代表验证成功了,那他的意义在于什么reference: jssdk: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.htmlweb-view: https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html

1、首先预备好外部想要引入的外部文件,命名为util.js,并且填充固定的文件内容(普通是固定的库)。

2、其次打开util.js ,持续填写重要内容将要利用的方法用module.exports给暴显露来。

3、然后将外部js放在指定的文件夹utils里(utils 规定寄存js库和数字格式化文件)。

4、最后在想要用到这个方法的js里面 require这个js,然后调用即可。

后来在父目录public创建一个eruda目录在把B.js引入,PC控制台上没有报错信息,如

后来项目上线,h5项目是嵌到客户的app里面,客户的app做了404文件的处理,导致在app打开我们的项目,出现报错,但是报错页面也是偶然出现,有点难复现。

由于h5项目也要有微信小程序版本,任务紧,部分的功能使用web-view嵌入h5页面。用小程序打开h5项目时,vconsole-webpack-plugin插件的控制台总是打印没有找到B.js文件。用app去打开h5页面则控制台没有报错。重新将B.js文件放到static目录下,PC调试,控制台还是报Unexpected token '<'的错误。搜了一下说static里面文件引用要用绝对路径。如

发布到测试,再用小程序打开H5页面,发现还是报错,如

将引入方式改成最开始的引入方式,发布后再用小程序打开h5页面,发现报错如下

根据报错信息,发现路径少了static目录,应该是https:/fo****p/static/eruda-1.2.2.min.js。将引入方式改为下图。

发布后,再用微信小程序打开的h5页面发现没有报错了,用PC调试的控制台也没有报错。这路径是我没有细想。是我想当然,相对路径是当前相对引入文件的路径。A.js是项目首页html通过下图方式引入。

而A.js通过下图方式引入B.js文件。

所以script中src的相对路径理应相对的是引入A.js文件的html文件,而不是相对A.js文件,只有A.js被html引入后才有window.document,而且window.document是html内的。对于public建一个eruda目录还是报没有找到,是因为public下的eruda目录的内容并不会在“npm run build”自动加到打完的包里,需要每次打完包后将eruda复制到打完包里或者配置webpack将eruda目录加到包里,而本地调试没有经过打包时可以正确找到B.js文件。我忘记复制eruda目录,webpack也没有配置。不知道为什么发布的项目,在app内通过vconsole-webpack-plugin插件没有看到错误打印信息,而用小程序去打开h5页面vconsole-webpack-plugin插件控制台就会报错。