JeffreySu / WeiXinMPSDK

微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 8.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.
https://weixin.senparc.com
Apache License 2.0
8.47k stars 4.36k forks source link

小程序的登录流程有点小逻辑问题?请参考腾讯wafer2的登录流程 #895

Open pbzyy opened 7 years ago

pbzyy commented 7 years ago

小程序登录流程应该是(参考微信小程序客户端腾讯云增强 SDK): image

Api的流程是应该是: image

这样的做法减少了访问api的次数,而且根本不需要使用SessionContainer管理登录信息了. Senparc.Weixin.WxOpen.Helpers.EncryptHelper 这个基础类,居然有SessionContainer,显然设计有点不恰当。

这是我的建议。谢谢。

JeffreySu commented 7 years ago

@pbzyy 不使用SessionContainer的话,你到时候WebSocket等需要重新使用SessionId以及OpenId的情况,仍然需要使用其他容器缓存这个信息啊,或者就是存在数据库,那样效率就更低了。

JeffreySu commented 7 years ago

@pbzyy 另外对于 Senparc.Weixin.WxOpen.Helpers.EncryptHelper 这个基础类,居然有SessionContainer,显然设计有点不恰当。 SessionId和SessionKey是储存在SessionBag里面,由SessionContainer统一管理,当你只有SessionId的时候,就需要通过SessionBag获取到SessionKey, 不知道你觉得哪里不恰当?

pbzyy commented 7 years ago

@JeffreySu 我的建议是,不管是WebSocket 还是什么,通讯都是用token. 关于Senparc.Weixin.WxOpen.Helpers.EncryptHelper 这个基础类,既然是基础类,就没有必要再把业务的东西包含进来。

JeffreySu commented 7 years ago

@pbzyy 1、小程序的通讯不只是用token,SessionId和SessionKey是非常重要的,尤其SessionKey这个也是官方建议的做法,我觉得也非常有必要,所有做了SessionContainer,你可以看一下文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxchecksessionobject 其中的“登录时序图”,这里面的SessionKey无论是使用Container,或者其他方式,都是需要在服务器端缓存(或储存)起来的,官方建议的是使用session储存,这个方法通用性并不好,所以我设计了SessionContainer。 2、EncryptHelper是帮助类,不属于基础类,帮助类里面的方法简单地说就是帮你打包完成一个粒度很小的操作,方便重用,其实和是不是业务没有太大关系。

pbzyy commented 7 years ago

@JeffreySu SessionKey 目前只用于解密UserInfo消息, 后续基本上没有用到, 所以觉得没有必要缓存起来。我的想法(这个想法也是参考腾讯wafer2的客户端和服务端)。EncryptHelper是帮助类,既然是帮助类,我觉得没有必须要捆绑SessionContainer. 建议参考一下腾讯wafer2的客户端和服务端。

JeffreySu commented 7 years ago

@pbzyy 我是根据这个微信官方建议的储存方式来做的: imagehttps://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxchecksessionobject

和官方建议的储存一个单一value不同的是:我把数据打包放在了SessionBag里面,把SessionKey和OpenId储存在对象中了,这种方式更加灵活。而管理SessionBag更好的方式是用统一的Container来处理,首先不管SessionKey后面是否用得到,SessionBag的存在是必须的(还有OpenId、过期时间等参数需要存储),更何况SessionKey不光只在解密UserInfo有用,在解密消息、电话号码等过程中同样是需要的,是一个需要一直留存的数据。你可以注意看一下文档。

对于Helper的作用,就是为了重用,首先我觉得没有必要排除引入外部的工具,其次如果不引入Container,你就需要在每次调用的时候,在代码里执行重复的代码,从SessionBag(或者其他Session或缓存)里面索引到,这完全没必要。

wawa0210 commented 6 years ago

@JeffreySu 其实我i也觉得EncryptHelper算是一个基础帮助类,可能sessionkey是通过外部传入的,由业务方的服务端保存,这样才是更灵活的吧

JeffreySu commented 6 years ago

@wawa0210 你可以注意一下源代码:

https://github.com/JeffreySu/WeiXinMPSDK/blob/a2261f18fe24ebdce846ba852ecbbc5921238f89/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Helpers/EncryptHelper.cs#L79

WxOpen 的 EncryptHelper 只是为小程序服务,sessionKey 只是作为一个传入参数而已,真正的基础帮族类是 Senparc.CO2NET.Helpers.EncryptHelper 。