需求
前端向后台服务器发请求获取验证码,然后端游输入验证码,向我的后端发请求获取验证信息。后台给游戏端返回信息的时候同时给微信小程序端返回验证结果。意思是不要微信小程序端主动触发,验证是否绑定的请求。
思路
后端生成验证码时存入用户的唯一Id和ip,前端获取到验证码后,与后台建立 WebSocket 连接,然后游戏端填入验证码向后端接口发起请求,遍历整个clients列表,与数据库中的ip进行匹配,向匹配的ip发送消息。由于可能存在不同客户端Ip相同的情况,这里则需要根据唯一ID进行区分
代码
前端
// 建立 WebSocket 连接const socket = uni.connectSocket({url: 'wss://xxxx.com:8889',success() {console.log("ws连接成功!");},fail() {console.log("ws连接失败!");},});
//监听WebSocket接收消息事件socket.onMessage((message)=>{console.log('监听WebSocket接收消息事件',message.data);const data = JSON.parse(message.data)if(data.type == 'invalid'){uni.showToast({title: '无效验证码',duration: 2000,icon:'none'});}else{if(data.openid == this.userOpenid){if(data.result=='绑定成功'){uni.showToast({title: "绑定成功",icon:'success',duration:1500,complete: () => {//在这里执行跳转操作setTimeout(()=>{uni.switchTab({url:'/pages/index/index'})},1500)}})uni.closeSocket({success() {console.log("WebSocket连接已关闭");},fail() {console.log("关闭WebSocket连接失败");},});}else{uni.showToast({title: '绑定失败',duration: 2000,icon:'none'});}}}})
后端
//app
const WebSocket = require('ws')
const wss = new WebSocket.Server({server:httpsServer},()=>{console.log('socket start');}
)
// 将wss对象挂载到全局对象global上,在其他页面使用global.wss访问
global.wss = wss//接口
exist(){//.....// 向前端小程序发送绑定结果global.wss.clients.forEach((client) => {//ip客户端IP地址const ip = client._socket.remoteAddress || client.upgradeReq.connection.remoteAddress;console.log('客户端IP地址:', ip,secretIp);if(ip==secretIp){client.send(JSON.stringify({openid: secretOpenid,result: '绑定成功',}));}});//.....}
记录一下。。。。