这个星期,接到了一个红包页面的任务,逻辑方面并不是特别复杂,但是在仔细想过之后也可以实现。最让我头疼的问题是调微信的两个接口:一个是登录接口,另一个是注册JSSDK的接口,因为我从来没有接触过这个问题,所以遇到了很多的坑,这也直接导致和我配合的后台同学受到了我的拖累,调接口用了很长很长时间。
首先我们先来看一下这个页面的逻辑,然后分析一下这两个接口的JS,最后说一说我碰到的一些坑和学到的东西吧。
1.页面的逻辑
首先来看一下页面的逻辑,我做了一张图,大致的逻辑就是这样,其中可以还包含着一些交互和动画方面的细节,我这里就详细阐述了。逻辑如下图:
2.分析接口
首先,这两个接口分别是,微信授权登录的接口和注册JSSDK的接口。
1.微信授权登录的接口
1 |
|
具体后台是怎么处理的我不是特别清楚,大概是这样,open.weixin这个登录接口,是会接收两个参数的appid
应该是公众号的一个唯一标识,标识是授权给这个公众号登陆的,还有一个参数是redirect_url
这个是经过微信授权后你要跳转回的链接,这个链接是跳回到后台,后台要对url进行处理后再返回给前端的页面。
这里要注意一个问题就是本来我们要对redirect_url
这个参数进行URI编码处理,原因是因为如果不进行编码处理,url传到后台的时候可能会出现问题。
2.JSSDK
这个简单来其实就是用微信给的一些方法,来调出微信一些功能,比如分享朋友圈,发送给朋友等等。也可以根据微信给出的一些方法,来禁用掉微信的一些按钮。
这也是我遇到困难最多的地方,可能是第一次接触吧,所以对其中的一些原理不是太了解,所以做了很多蠢事,再次对后台配合的同学感到抱歉啊,现在就来分析分析这个JSSDK吧。
首先我们可以看一下微信的官方文档,点击这里。
第一步我们暂时忽略,引入JS文件,这里要注意http
和https
协议要引入的JS是不一样的这里大家要注意一下。
第三步,wx.config
这个接口,我们需要先注入一些配置信息,我在这里也遇到问题,这个是我粗心没有仔细阅读文档,在jsApiList
这个配置项当中,之后所有要调用的方法都要先通过这里注册,如果没有的话,下面的调用都是无效的。
第四步,ready
接口中可以监听各个接口的事件,比如点击哪个按钮后出发什么事件等等。(可能我说的不够准确,按我自己的理解来说)。
下面来读一下代码,来总结和再次理解一下,代码是原来同事已经写好的一个一些代码,就是做JSSDK注册的。我们只要读懂,并能按实际应用来修改就好了。
1 |
|
这个就是大概我在这个JSSDK中所用到的代码了,但是因为是第一次用,在修改代码的时候,出现了很多错误,这也导致了,分享的JSSDK注册的失败,在调用分享接口获取分享内容时,调用失败,等等的错误。下面我来举几个例子。
首先,是我在调用接口之前,没有在jsApiList
当中注册,这就导致调用的这个接口是不起作用的。还有当我们调share
这个函数的时候,我们把所有所有要自定义的内容其实都写到了data
这个对象的里面了。当时我一开始自己手贱删了wx.onMenuShareAppMessage(data)
这个,导致再按了分享按钮之后,不能正常定义分享的内容了。之后把这个加上了但还是不起作用。这是因为我蠢,我的代码是这么写的。
1 |
|
不知道大家看没看出来问题。我原意是想,在定义了分享内容的同时,来监听一下这个按钮,如果确认分享以后,我执行回调函数,把引导分享的遮罩层隐藏掉。但是这里问题出现了,我很想当然的觉得这么写没有问题,但如果两次来调用这个接口,其实第一次调用时的赋值就被覆盖了。所以我不能正常的自定义分享内容了。
那应该怎么写呢?应该这样,把这个也写到data对象当中。
1 |
|
如上代码,就可以完成这个功能了。
其实我觉得呢,调用这些接口都是一个熟练功,第一次可能会出现很多问题,但是越用就会越熟悉,我觉得在我下次再调用这个接口的时候,我该不会出现这些低级的问题了。(话说我觉得我计算机基础真的很差)。
3. 这次项目遇到的一些坑
这次的坑我觉得有两个:
1. translate3d 位移后会占据空间
这个问题和需求是有关系的,红包要求上下打开,我使用的就是translate3d
配合animation
来实现的,一般在css中动画不要用position
的位移,因为如果手机性能不好的话,动画会很卡。所以都会用translate
、transform
、animation
配合来用。但是我发现了,translate
之后的部分,是会占据空间的。这个导致我的红包上下打开之后,下面会把页面撑的很长,即使在我页面下面没有内容的时候,依旧会留下很大的空白。
我解决的本法是,用了一种变通的方法。
1 |
|
如上代码所示,因为我发现,在页面的上边超出的部分是不会使页面变化的,所以我在动画结束之前,把向下移动的部分,变成透明并快速移到页面的上方。这样视觉上并不会有变化,也能解决这个问题,但是我觉得这始终是个投机取巧的办法。但是因为我上网没有搜索到答案,和问题的根源,所以最后用了这种折中的方法。
2. iOS微信不能识别二维码的问题
这个问题在安卓手机上是不存在的,之后再iOS中会存在。网上搜索了一下解决办法,但是说的那些问题可能微信官方其实已经解决了,所以我试了那些办法都没有成功。我不知道产生的原因是什么,但是加上这个meta标签确实是可以识别二维码了。<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0,user-scalable=no"/>
。
还学到了一些经验吧,在不同环境测试的时候,需要配置的域名都是不一样的,所以在切换环境的时候,如果你配置的域名是写死的,那等到切换环境的时候是非常辛苦而且容易出错的。就拿昨天的上线来说,我真是对和自己配合的后台小伙伴感到抱歉,因为我经验的不足,从线上测到线下。。。。来回切环境,结果就是域名得来回改。
下次我知道了,应该把需要配置的参数,写到一个对象里面,改的时候直接改这个对象就可以了,而不用在所有代码中来回改。。。。只能说我太年轻了。。。哎悲剧死了。。。。。
问题差不多就这么多总结完了,回家睡觉。