`
a283037321
  • 浏览: 16867 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

微信开发之架构设计

阅读更多

    微信作为一款app,提供了友好的用户体验,在开发微信应用时,我们应该尽可能得让自己的网页像webapp一样。用户使用我们的网页,就好像在使用微信内置的app,这样用户才会喜欢我们的网站。

   本文将讲解微信开发的前期准备,包括微信开发上的一些坑、架构上的设计、接口上需要注意的地方,全部来自自己的开发经验,如有不对,请指正。

 

微信开发的坑

 

1、微信授权

    微信中涉及到了OAuth2.0网页授权,正因为这样,我理所当然的用这个接口来读取用户的基本信息,包括头像、用户名等,因为之前了解过淘宝的公众平台,大家都是这么玩儿的。

    后来走了不少弯路,oauth2.0只是一个网页授权,它在微信中被分为高级接口中,其意义在于用户没有关注您的公众号但是只要用户同意,你也可以读取到用户的相关基本信息。前面我们讲到,我们应该把咱的网页做得尽可能的像一个webapp,我是不推荐大量使用oauth去授权的。

    我们应该努力地让用户成为我们的粉丝,并且在后台数据库中做上标记:这个用户已经关注我们了。这个标记很有用,后面的模板消息、客服接口等都推送接口都需要用户已经关注我们的公众号了。

    同样,用户关注了我们后,我们可以不使用oauth2.0去进行网页授权了,使用“获取用户基本信息”接口同样可以获取用户的基本信息,这样就不会有授权页面出现,大大提高了用户体验。

 

2、openId

    openId往往被我们用来作为用户的唯一标识,其实这是不对的。openId只在对当前公众号唯一,你可以认为它是MD5(公众号ID+用户微信ID)。我公司的产品设计到多个公众号,但是后台数据库可能重用,想当然的就把openId公用了,结果可想而知。

   其实微信为开发者提供了UnionId的机制,通过获取用户基本信息中的UnionId来保证用户的唯一性,后续再写Union机制的具体实现。

 

3、AccessToken

微信中基本所有的接口调用都需要一个accesstoken,这个accesstoken的获取是有频率限制的,正常情况下access_token有效期为7200秒,这个需要特别注意,我们可以将accesstoken持久化,获取accesstoken的方法判断是否该重新获取,至于持久化的方法,可以使用redis、数据库、本地内存等。

 

4、session问题

    大部分人认为微信窗口关闭后,session就消失了,重新打开窗口访问应用相当于重建session。这也是有问题的,微信中重新打开窗口sessionId并不会重新生成,其实可以想象微信为了不让开发者的服务器不断重建session造成压力已经将sessionId持久化了一段时间。

    sessionId其实是服务端识别用户所属session的标识,只要sessionId不变,那用户的session上下文也不会变,也就不会重建session了。

    最合理的方案其实应该讲session自定义,比如使用memcache、redis等独立的缓存服务来存储session,好处是用户不打开我们的网站而是点击微信聊天窗口的菜单与我们的服务器交互时,我们照样可以识别是哪一个用户在与我们交互。

 

架构设计

    架构设计应与我们的网站系统业务相结合,大体上将几点值得注意的地方。

   1、第一点就是上面所讲的sessionId问题,如果我们自定义了sessionId,可以带来相当大的好处。在应用中,可以使用具有一定规律的自定义sessionId方便的找到一个用户,对用户进行操作。

   2、微信的接口和通常所说的接口有些不一样。通常的接口是两个系统间进行交互,而微信的接口是用户发起操作,我们的服务器访问微信服务器进行交互,返回数据给用户。相当于我们是一个中间件,供用户去操作微信。这就带来一个问题:当并发量大了之后,服务器不断的发送请求到微信,这对服务器的带宽都是一个不小的考验。

    所以我们需要适当考虑接口的重试机制。拿获取用户基本信息来说,完全有可能第一次请求无响应,第二次请求才成功,不要因为第一次的失败就导致我们拿不到用户的基本信息了。

   3、缓存。不止是针对微信,互联网网站缓存可以说是必不可少的。我比较喜欢使用redis来作为缓存,当然,mongodb也不差。

 

 

 转载请保留出处,尊重原创,

 

http://a283037321.iteye.com/blog/2148661

6
2
分享到:
评论
6 楼 a283037321 2014-12-03  
belivexiaoqi 写道
你好,想请假一个问题:

用户通过微信菜单跳转到wap页面登录,登录成功后系统以cookie的形式存了个sessionid放在微信内置浏览器里面,有效期一个月。

我的问题是:微信内置浏览器会不会把这个sessionid给清除掉。

经验不是很多请指教,谢谢!



你好,微信的cookie是很不靠谱的。据我测试,微信把cookie的保存时间固定了,比如sessionId,普通浏览器一般都是重新打开后就重新生成了,而微信不是,它能保证大约半小时之内不会重新生成,这就是为了节约不断点击微信菜单造成服务器压力。
至于你说的将sessionId持久化到cookie,同理,也是不靠谱的,你设置的时间应该是没有用的,微信想删就删了,况且用户在设置里面同样可以清除。
  你为什么要持久化sessionId,无非就是希望sessionId和用户做一个绑定关系,这是分布式环境中常用的手段,将session提取出来统一处理。建议你的做法是将sesisonId存储在服务端,然后每一次交互都获取微信的openId,将openId和sessionId做关系映射
5 楼 belivexiaoqi 2014-12-02  
你好,想请假一个问题:

用户通过微信菜单跳转到wap页面登录,登录成功后系统以cookie的形式存了个sessionid放在微信内置浏览器里面,有效期一个月。

我的问题是:微信内置浏览器会不会把这个sessionid给清除掉。

经验不是很多请指教,谢谢!

4 楼 zhangt882 2014-10-29  
a283037321 写道
zhangt882 写道
楼主,看完你的文章,我有个问题。
在第一点的最后你说到不用oauth2.0去获取用户的基本信息。如果用户是通过点击菜单跳转到我们的网站,我们怎么获取到用户的基本信息呢?点击菜单跳转网页,我们是拿不到openid的啊。


谢谢评论,确实是拿不到的,我的意思是我们应该引导用户去成为我们的粉丝,成为粉丝之后根据事件推送是可以拿到openId的,然后可以使用“获取用户基本信息”获取用户基本信息。试想如果用户从外部链接进入我们的网站,就是通过授权获取了基本信息,但他不是我们的粉丝,有什么用呢?后面的推送照样无法使用。所以我们的目的是让用户成为我们的粉丝,使用oauth2.0授权会造成用户的不安,总觉得你这个网站要偷我的隐私。当然,oauth2.0也是可以使用的,看需求吧。


哈哈,原来是这个意思,懂了!
3 楼 a283037321 2014-10-29  
zhangt882 写道
楼主,看完你的文章,我有个问题。
在第一点的最后你说到不用oauth2.0去获取用户的基本信息。如果用户是通过点击菜单跳转到我们的网站,我们怎么获取到用户的基本信息呢?点击菜单跳转网页,我们是拿不到openid的啊。


谢谢评论,确实是拿不到的,我的意思是我们应该引导用户去成为我们的粉丝,成为粉丝之后根据事件推送是可以拿到openId的,然后可以使用“获取用户基本信息”获取用户基本信息。试想如果用户从外部链接进入我们的网站,就是通过授权获取了基本信息,但他不是我们的粉丝,有什么用呢?后面的推送照样无法使用。所以我们的目的是让用户成为我们的粉丝,使用oauth2.0授权会造成用户的不安,总觉得你这个网站要偷我的隐私。当然,oauth2.0也是可以使用的,看需求吧。
2 楼 zhangt882 2014-10-28  
楼主,看完你的文章,我有个问题。
在第一点的最后你说到不用oauth2.0去获取用户的基本信息。如果用户是通过点击菜单跳转到我们的网站,我们怎么获取到用户的基本信息呢?点击菜单跳转网页,我们是拿不到openid的啊。
1 楼 zj_jay 2014-10-28  
写的很详细,不错!

相关推荐

Global site tag (gtag.js) - Google Analytics