如何开发一个个性化的Web版微信(1)

发布时间:2025-12-09 18:58:37 浏览次数:10

Web版微信登录

github地址:https://github.com/hty7/vue-wechat
如有不足与错误,请见谅

Web版微信主要参考Web微信协议进行设计开发
项目主要分成三大模块
登录模块:微信扫码登录流程
微信容器:微信信息、会话接收发送、心跳监测
数据存储:用户登录信息、状态信息、会话信息

先祭图拜八哥已求无bug

效果图
我们希望实现的功能包括基本的登录、聊天群发功能(文本/表情/图片/文件/公众号链接)、公众号阅读、聊天记录导出保存、用户画像、聊天机器人

前期工作准备

DEMO主要采用web微信接口进行开发,因此在实际开发中必须调用微信接口(https://cn.vuejs.org/v2/guide/custom-directive.html)
问题:

  • 接口跨域问题(本地开发跨域、cookie)
  • 状态检测问题(心跳检测,微信会话活动中必须保持心跳接口的正常联接)
  • 接口前缀问题(微信常用有wx及wx2两个版本)
  • 数据存储问题(用户通讯录的用户UserName会随着每次登录而改变,因此必须通过特殊方法处理数据一致性及连贯性)
  • 在前期我们需要解决(1)(2)两个问题
    由于项目里使用vue+axios+webpack本地开发,请求如下

    // 获取微信唯一uidexport const getUUID = params => {return axios.get('/login/jslogin', {params: params})}

    开发阶段使用***http-proxy-middleware***解决跨域问题

    '/login': {target: 'https://login.wx.qq.com', // 重定向路径secure: false, // htts转http证书验证问题changeOrigin: true,headers: { // 设置报头Referer: 'https://login.wx.qq.com'},pathRewrite: { // 路径重写'^/login': '/'}}

    通过上面代理,可以将本地*localhost:8080//login/jslogin => https://login.wx.qq.com/jslogin*完成跨域操作
    但上面的方面还不能完全解决跨域问题,在后面的请求我们可以知道心跳checkasync和通讯录头像等请求都需要使用到cookie,因此我们必须将wx.qq.com域名下返回的cookie保存的本地域名下,因此我们必须解决跨域cookie的问题

    因此我们可以通过配置proxy进行跨域处理,通过cookieDomainRewrite重写domian,我们可以将不同域名下的cookie保存到我们所需域名下。同时由于默认请求是不带cookie,发起请求前需要配置请求中的withCredentials = true,使请求带上cookie.

    '/wx1': {target: 'https://wx.qq.com',secure: false,changeOrigin: true,headers: {Referer: 'https://wx.qq.com'},pathRewrite: {'^/wx1': '/'},onProxyRes: (proxyRes, req, res) => {let cookies = proxyRes.headers['set-cookie']let cookieRegex = /Secure/i//修改cookie secureif (cookies) {let newCookie = cookies.map((cookie) => {if (cookieRegex.test(cookie)) {return cookie.replace(cookieRegex, '')}return cookie})//修改cookie pathdelete proxyRes.headers['set-cookie']proxyRes.headers['set-cookie'] = newCookie}},// 重写cookie domiancookieDomainRewrite: {'*': 'localhost'}}

    如果需要在生产环境中需要跨域,可以参考网上解答
    如nginx环境下可以修改nginx.conf配置

    proxy_cookie_domain 'wx.qq.com' $host;

    问题(2)中,我们需要注意web微信接口并非一成不变,不同账号登录会跳到不一样的接口,已知的存在两种可能性
    如获取微信登录用户信息/cgi-bin/mmwebwx-bin/webwxnewloginpage接口,就存在两种前缀
    https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage
    https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage
    因此我们必须在登录前从login登录接口(下面会详细解析)获取该微信重定向的地址

    前期工作准备


    获取UUID

    method: GET
    path: /login/jslogin
    参数:

    appid: 'wx782c26e4c19acffb', // appid (固定值)redirect_uri: 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage', // 重定向路径fun: 'new', // (固定值)lang: 'zh_CN', // 语言版本 (固定值)_: new Date().getTime() // 时间戳

    响应返回值:window.QRLogin.code = 200; window.QRLogin.uuid = “AZc-ETs6NA==”;

    返回值为字符串,可以通过正则式得到code和uuid

    res = {code: 200,uuid: 'AZc-ETs6NA=='}

    获取二维码

    https://login.weixin.qq.com/qrcode/{uuid}

    https://login.weixin.qq.com/qrcode/AZc-ETs6NA==

    等待登录扫码

    method: GET
    path: /cgi-bin/mmwebwx-bin/login
    参数:

    loginicon: true,uuid: uuid,tip: 0,r: ~new Date().getTime(),_: new Date().getTime()

    等待登录扫码是一个长轮询接口(25S左右),用户扫码到确定存在不同响应状态
    (1)长时间未扫码,登录超时

    window.code=408;

    (2)扫码未确定,获取用户头像

    window.code=201;window.userAvatar='data:img/jpg;base64';

    (3)扫码未确定,超出限制时间,二维码无效需重新扫码

    window.code=400;

    (4)扫码并确定

    window.code=200;window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=Acej3HhQ4Mcb8CrNtZkOooln@qrticket_0&uuid=Ia-L18JF6w==&lang=zh_CN&scan=1535295440";

    获取微信登录令牌(登录中最重要的一步)

    method: GET
    path: /cgi-bin/mmwebwx-bin/webwxnewloginpage
    上一步扫码成功后redirect_uri后面加上&fun=new&version=v2
    例如:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=Acej3HhQ4Mcb8CrNtZkOooln@qrticket_0&uuid=Ia-L18JF6w==&lang=zh_CN&scan=1535295440&fun=new&version=v2

    响应:

    <error><ret>0</ret><message></message><skey>@crypt_ca4ca197_6abe45393fc8632b547d6231c537a5f5</skey><wxsid>gYCDNcRRyujtvMEF</wxsid><wxuin>\*\*\*\*\*\*\*\*</wxuin><pass_ticket>6huRNbBOP9XzXc4bZiD8H%2BJIRH6spE11Vn86Fgpn6VNfW5%2BJfDcxlQ%2B%2Bt5TSb7Cb</pass_ticket><isgrayscale>1</isgrayscale></error>

    返回值未XML格式,需要把skey, wxsid, wxuin, pass_ticket参数解析出来并保存,后面的请求参数都需要用到

    同时我们也需要保存Response cookie,也就是前面提到的第一个问题


    需要做网站?需要网络推广?欢迎咨询客户经理 13272073477