熊猫聊天室,小程序的Websocket聊天。有关从服务器到applet客户端的配置的基本教程。在本教程中,南京小程序开发我们将在applet中实现一个基本的websocket聊天室,并计划实现以下功能:
.微信用户登录“小程序会话管理”
.用户之间的文本通信“ websocket实现”
.富媒体信息的“文件存储和相关逻辑”,例如用户之间发送的图片
由于个别开发人员无法提交信息交换小程序,所以小程序已被挂起,但是可以在本地运行演示。
如果有任何错误,请指出,我们可以通过在SF下留言或在该项目的Git中提出问题来共同进步^
聊天室的基本配置
实际上,小应用程序一侧的聊天室信息流非常简单。本教程使用一个有趣的聊天室来进一步了解applet中的会话实现。
南京小程序开发我主要参考腾讯云实验在服务器端环境中基于CentOS构建和配置微信小程序服务
我们需要了解为什么applet无法实现会话,以及如何在applet中实现websocket通信。
该小应用程序不是嵌套在微信中的HTML 5网页,无法通过URL访问。我们只能自己执行诸如会话之类的事情。幸运的是,该官员提供了相应的套件来实施会议。也就是说,晶圆CLIENT SDK和节点中间件晶圆节点会话。我们可以根据文档简单地实现会话。
腾讯云晶圆项目下有许多类似的项目,“其中大多数需要与腾讯云合作进行一键式部署”。如果仅需要实现小程序的会话管理,则可以使用晶圆CLIENT SDK和节点中间件晶圆节点会话。
我们使用WS包在服务器端实现websocket。我们不使用socket.io的原因是socket.io在客户端需要其他脚本来实现通信。
在applet方面,我们引入了晶圆CLIENT SDK套件,以使服务器能够获取会话。
主要逻辑分为几个简单功能。当然,您需要首先配置请求的服务器域名和applet帐户密码。
//Introduce session suite, which encapsulates wx.login, wx.getuserinfo and other operations
const wafer = require('../../vendors/wafer-client-sdk/index')
//It is used to log in to make the server obtain the session, and then the session returned by the server will contain the user information. It is used to return the user's image URL in websocket
function login(){
.....
}
//Used to update data when there is new information, MSG refers to information, ad refers to the information ID returned by websocket, and used for scroll in view scrolling
pushMsg(msg, ad) {
.....
}
//Used to listen for websocket connection
listen(){
.....
}
//Used for applet to send websocket information
send(){
.....
}
基本上,这是websocket通信的过程:
客户端将信息发送到服务器M1
服务器接收到该信息后,根据情况将其返回给客户端M2
每个客户端收到M2后更新视图
当然,第一步是在服务器端连接websocket。只有每个连接的客户端都可以交换信息。
小程序的会话解析
为了实现会话,我们在服务器端使用晶圆节点会话来提供用于连接的会话功能。在小程序侧,我们使用晶圆CLIENT SDK,该程序封装了wx.request,wx.login和其他逻辑,并实现了小程序侧的用户登录和会话设置。
有几个步骤可以在applet端获取会话
.Wx.login获取代码
.Wx.request将代码发送到其自己的服务器
.服务器接收代码并与appid和appsecret协作将其发送到微信服务器以获取openid和sessionkey
.Wx.getuserinfo将获取原始数据,签名,加密数据,IV,我们需要将其发送到我们自己的服务器。我们构建自己的签名2 = SHA1(会话密钥+原始数据),并通过将签名2与签名2进行比较来完成数据验证
.服务器通过aes-128-cbc算法对称地解密加密数据和IV,然后获得userinfo。这次获得的userinfo还包含诸如openid之类的信息:“如果在微信开放平台上绑定applet,则将获得unionid。”
.服务器将构建req.session对象并将其返回到applet,该applet包含ID,userinfo,sessionkey,skey,这些ID由服务器本身根据sessionkey + appid + appsecret生成,并且具有到期时间。我们生成的密钥具有自己的到期时间,但是applet端的会话也具有自己的到期时间。Wafer将自动调用wx.checksession来检查是否过期。如果过期,将使用wx.login。
在我们的演示中,服务器会话已到期,本地会话尚未到期。而且,每当websocket发送信息时,都需要从req.session中获取用户的头像,这将导致websocket连接失败。但是,小程序侧的会话不会过期,也就是说,服务器端的会话密钥与小程序的会话密钥不一致。“客户端会话密钥仍然存在,服务器会话密钥已过期并被破坏”,这导致比较失败。那我该怎么办?再问一遍!但是,由于晶圆封装了会话管理,即“只有在会话过期后才需要在applet上请求会话”,因此applet不会将信息重新发送到其自己的服务器以生成新的会话密钥。因此,我们需要在每次wx时在服务器端检查会话。sendocketmessage发送信息。我们需要这样做。只需判断“如果websocket信息中有错误,请清除本地会话”,然后要求applet再次请求服务器。
Websocket信息发送
如果要发送一条消息“尽快生成数据”,该消息存储在哪里?发送文本消息时,服务器接收数据并对其进行简单处理,然后将其返回给applet。这时,数据应存储在服务器内存中。因为websocket在接收到请求后仅处理字符串信息并将其直接返回给applet,所以当我们发送其他富媒体信息时,我们还可以将其以二进制模式发送给websocket服务器,然后再次将其返回给客户端,即websocket只执行文件传输”,以实现websocket流。看来很复杂。在这里,我使用了中国PAAS服务提供商leancloud的存储服务,“小程序将发送的文件存储在云中并返回文件地址”。然后,我们将文件信息标记为“仅发送文件的URL信息,然后applet判断请求是否为文件并显示。” 当然,南京小程序开发建议您也可以发送视频或音频,将它们保存在云中,并且仅发送相应的URL。我们这里的websocket服务器仅执行文件传输功能,文件存储由云负责。