本篇总结主要涉及微信H5开发中的比较重要的内容,整理下来也是为了以后可以方便开发。
其实微信接口的使用在微信公众号文档中都有详细的讲解,所以我会整理工作中使用微信接口的代码逻辑。所有代码都是在Vuejs框架下开发的。
微信网页授权
微信网页授权是微信H5中最为重要的,因为如果授权不成功,用户也进不了页面中来。
微信网页授权分两种情况,用scope来体现:当scope为snsapi_base
时,网页授权可以获得用户的openid,而且是静默授权,并自动跳转到回调页中,相当于直接进入H5页面中;当scope为snsapi_userinfo
时,网页授权可以获得用户的基本信息,但是需要用户手动同意。还有一种是涉及用户关注公众号的,暂且不提。这里我们主要也是整理前一种网页授权方式。
微信公众号文档中对网页授权流程有分步骤,按照以获取用户openid为目的,操作就是引导用户打开以下链接:
1 | // appid为公众号唯一标识 |
然后静默获得用户授权之后,会跳转到以下链接:
1 | // redirect_uri是重定向的回调链接 |
我在搜索相关开发博客的时候也有看到在前端完成上面跳转的,简单说就是先判断链接是否带有code参数,没有的话就把window.location.href
指向网页授权链接,重定向之后获得code参数:
1 | this.wxCode = this.$route.query.code ? code : ''; |
但是实际开发中我们并没有在前端做这部分内容,而且交给后端做重定向。因为网页授权链接中带有appid,是公众号唯一标识,比较重要,考虑到保险起见,不放在前端代码中。
上面的代码可以看到,获取code之后,还需要后端获取access_token。文档也有提到,这部分安全级别非常高,涉及公众号secret跟用户的access_token,所以不允许在客户端请求。因此,获得code之后,我们可以把code通过接口传到服务器,在服务器进行access_token的获取。这一步可以获取到用户的openid,这个openid是用户跟公众号唯一的openid,所以非常有用。所以最终的代码:
1 | computed: { |
微信SDK
首先,使用微信sdk的前提是域名已绑定微信公众号。然后步骤是:引入js文件,通过config配置权限,通过ready接口跟error接口处理验证,最后用checkJsApi接口判断接口支持情况。
引入js文件
在html文件中引入:
1 | <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> |
config配置
根据微信公众号文档,config配置需要以下字段:
1 | wx.config({ |
由于appid是公众号唯一标识,最好不要存放在客户端,所以可以通过请求从服务器获得除debug跟jsApiList之外的信息。所以会分两步走:
1 | data() { |
ready接口跟error接口处理
在传入config之后,可以直接调用ready接口处理验证成功的,而error接口则是处理验证失败的情况:
1 | methods: { |
checkJsApi接口
验证成功之后,还需要调用checkJsApi接口来判断客户端是否支持指定JS接口:
1 | wxInit(_rpdata) { |
以上完成微信SDK基础配置处理。
微信分享
微信分享这块包括了所有分享的平台,使用的也是微信SDK所提供的所有分享相关的接口。目前微信分享有以下这些接口:
1 | updateAppMessageShareData // 分享给朋友及分享到QQ接口 |
所有接口的写法基本相同,所有这里只列举一个接口的写法作为例子。通过上面的接口验证后,就可以调用这些接口了。
1 | wxShareInit() { |
微信关注
微信关注这个比较容易,其实就是跳转到历史消息页面,如果用户没有关注公众号的话,这个页面会显示关注按钮。这个链接的形式是:
1 | https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=xxxxxxxx#wechat_redirect |
其中,xxxxxxxx用公众号的uin id的base64编码替换。这个公众号的uin id可以在微信公众平台登入账号后,在源代码中查找uin即可找到一串数字,然后把这串数字用base64编码,获得。
不过实际的效果是这个页面的关注按钮有时会出现,有时没有,后来网上查了一下,这个页面的关注按钮已经被微信屏蔽了,除非跟微信投钱合作,才会显示。所以……
微信关注判断
微信关注的判断目前我还没有做过,但是大致的了解到判断的方案。最关键的是需要获得openid,获得access_token,然后通过获取用户基本信息接口获得用户信息,进而判断。
首先,获得openid的方法已经在微信网页授权一节有说明,故可以获得;获得access_token需要前端获取code,然后传给服务器去换access_token,所以这一步也在微信网页授权一节有说明,故也可以获得。
获取用户基本信息接口为:
1 | // http请求方式: GET |
然后根据微信公众号开发文档所介绍的,返回的数据有这些:
1 | { |
这里可以获得到不少的信息了,这里我们关注的是subscribe
这个字段,是指用户是否订阅该公众号标识。0为未关注,1为已关注。这样,我们就可以判断用户是否关注公众号了。
微信支付
微信支付有两种方案,一种是依赖上面的微信JS-SDK,再配置完成之后调用chooseWXPay方法:
1 | // 官方文档 |
可以参考上面微信分享一节的封装方案进行开发。
另一种方案是调用在微信内置浏览器才有的WeixinJSBridge内置对象。这种方案使用起来比较简单,不需要引入什么,配置什么,只要是在微信内置浏览器中,就一定能调用这个内置对象。使用的时候只要先判断是否存在WeixinJSBridge内置对象,存在则可以传入请求参数,然后再判断返回的支付信息。需要传入的参数跟上面的一样,一般需要发起支付请求给服务器,让服务器提供需要的参数,然后在去调用WeixinJSBridge内置对象:
1 | // 微信支付api相关配置文档 |
微信地图
在微信H5中调起微信地图也是一个常见的功能点,也是可以通过微信JS-SDK的接口来实现。
一般使用微信地图分两种情况:一种是需要打开已知地点的微信地图,方便用户对地点进行导航;另一种是需要打开用户所在位置的微信地图。
已知地点的微信地图
这里使用的为微信JS-SDK 中的openLocation接口:
1 | // 官方文档 |
根据官方文档,我们需要拿到已知地点的纬度,经度,位置名跟地址详情说明。我们可以通过以下网页获得:
1 | http://www.gpsspg.com/maps.htm |
然后参考前面微信分享的封装进行开发。
打开用户所在位置的微信地图
这里还需要使用另一个接口:getLocation接口。也很简单,这里直接贴代码:
1 | wx.getLocation({ |
微信H5的坑
iOS中微信环境下页面有浮框软键盘隐藏后页面不能点击问题
问题是这样的:浮框中有输入框,使用了fixed布局,可能在页面正中间,也可能出现在页面底部。当输入框失去焦点时,软键盘隐藏,但是页面所有点击事件都发生错乱。
其实和这个问题跟iOS系统有关,也跟微信有关。本身iOS系统下调出软键盘就会影响页面布局,然后滚动页面,然后微信内置浏览器会在软键盘隐藏时恢复页面布局,但是并没有恢复监听事件的位置。也就是在虽然有监听事件的标签元素恢复到原位了,但是监听的区域并没有恢复,因为受到页面滚动的影响。
如何处理?分两种情况:一种情况是浮框只出现在页面第一屏,这种情况下,在软键盘隐藏的同时,操作页面滚动到顶部,即可恢复正常的监听区域:
1 | scrollBack () { // 绑定在blur事件上 |
另一种情况是浮框在底部,这种情况主要跟iOS系统有关,会单独放在下一篇工作总结中详细整理。