协议分析(微信网页版 wx2.qq.com)

  1. 打开首页,分配一个随机uuid,
  2. 根据该uuid获取二维码图片。
  3. 微信客户端扫描该图片,在客户端确认登录。
  4. 浏览器不停的调用一个接口,如果返回登录成功,则调用登录接口
  5. 此时可以获取联系人列表,可以发送消息。然后不断调用同步接口。
  6. 如果同步接口有返回,则可以获取新消息,然后继续调用同步接口。

Java版实现源码:https://github.com/biezhi/wechat-robot
Python实现:https://github.com/Urinx/WeixinBot
C#实现:https://github.com/sherlockchou86/WeChat.NET
QT实现:https://github.com/xiangzhai/qwx

执行流程

       +--------------+     +---------------+   +---------------+
       |              |     |               |   |               |
       |   Get UUID   |     |  Get Contact  |   | Status Notify |
       |              |     |               |   |               |
       +-------+------+     +-------^-------+   +-------^-------+
               |                    |                   |
               |                    +-------+  +--------+
               |                            |  |
       +-------v------+               +-----+--+------+      +--------------+
       |              |               |               |      |              |
       |  Get QRCode  |               |  Weixin Init  +------>  Sync Check  <----+
       |              |               |               |      |              |    |
       +-------+------+               +-------^-------+      +-------+------+    |
               |                              |                      |           |
               |                              |                      +-----------+
               |                              |                      |
       +-------v------+               +-------+--------+     +-------v-------+
       |              | Confirm Login |                |     |               |
+------>    Login     +---------------> New Login Page |     |  Weixin Sync  |
|      |              |               |                |     |               |
|      +------+-------+               +----------------+     +---------------+
|             |
|QRCode Scaned|
+-------------+

WebWechat API

1. 获取UUID(参考方法 getUUID)

| API | 获取 UUID |
| --- | --------- |
| url | https://login.weixin.qq.com/jslogin |
| method | GET |
| data | URL Encode |
| params | appid : wx782c26e4c19acffb 
fun : new 
lang: zh_CN 
**_** : 时间戳 |

返回数据(String):

window.QRLogin.code = 200; window.QRLogin.uuid = "xxx"

2. 显示二维码(参考方法 showQrCode)

| API | 显示二维码 |
| --- | --------- |
| url | https://login.weixin.qq.com/qrcode/{uuid} |
| method | POST |
| params | t : webwx 
**_** : 时间戳|

3. 等待登录(参考方法 waitForLogin)这里是微信确认登录

| API | 二维码扫描登录 |
| --- | --------- |
| url | https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login |
| method | GET |
| params | tip : 1:未扫描 0:已扫描 
uuid : 获取到的uuid 
**_** : 时间戳 |

返回数据(String):

window.code=xxx;

xxx:
    408 登陆超时
    201 扫描成功
    200 确认登录

当返回200时,还会有
window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=xxx&uuid=xxx&lang=xxx&scan=xxx";

4. 登录获取Cookie(参考方法 login)

| API | webwxnewloginpage |
| --- | --------- |
| url | https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage |
| method | GET |
| params | ticket : xxx 
uuid : xxx 
lang : zh_CN 
scan : xxx 
fun : new |

返回数据(XML):

<error>
    <ret>0</ret>
    <message>OK</message>
    <skey>xxx</skey>
    <wxsid>xxx</wxsid>
    <wxuin>xxx</wxuin>
    <pass_ticket>xxx</pass_ticket>
    <isgrayscale>1</isgrayscale>
</error>

在这一步获取xml中的 skeywxsidwxuinpass_ticket

5. 微信初始化(参考方法 wxInit)

| API | webwxinit |
| --- | --------- |
| url | https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit |
| method | POST |
| data | JSON |
| header | Content-Type: application/json; charset=UTF-8 |
| params | { 
     BaseRequest: { 
         Uin: xxx, 
         Sid: xxx, 
         Skey: xxx, 
         DeviceID: xxx, 
     } 
} |

返回数据(JSON):

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    "Count": 11,
    "ContactList": [...],
    "SyncKey": {
        "Count": 4,
        "List": [
            {
                "Key": 1,
                "Val": 635705559
            },
            ...
        ]
    },
    "User": {
        "Uin": xxx,
        "UserName": xxx,
        "NickName": xxx,
        "HeadImgUrl": xxx,
        "RemarkName": "",
        "PYInitial": "",
        "PYQuanPin": "",
        "RemarkPYInitial": "",
        "RemarkPYQuanPin": "",
        "HideInputBarFlag": 0,
        "StarFriend": 0,
        "Sex": 1,
        "Signature": "Apt-get install B",
        "AppAccountFlag": 0,
        "VerifyFlag": 0,
        "ContactFlag": 0,
        "WebWxPluginSwitch": 0,
        "HeadImgFlag": 1,
        "SnsFlag": 17
    },
    "ChatSet": xxx,
    "SKey": xxx,
    "ClientVersion": 369297683,
    "SystemTime": 1453124908,
    "GrayScale": 1,
    "InviteStartCount": 40,
    "MPSubscribeMsgCount": 2,
    "MPSubscribeMsgList": [...],
    "ClickReportInterval": 600000
}

这一步中获取 SyncKeyUser 后面的消息监听用。

6. 开启微信状态通知(参考方法 wxStatusNotify)

| API | webwxstatusnotify |
| --- | --------- |
| url | https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify |
| method | POST |
| data | JSON |
| header | Content-Type: application/json; charset=UTF-8 |
| params | { 
     BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, 
     Code: 3, 
     FromUserName: 自己的ID, 
     ToUserName: 自己的ID, 
     ClientMsgId: 时间戳 
} |

返回数据(JSON):

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    ...
}

7. 获取联系人列表(参考方法 getContact)

| API | webwxgetcontact |
| --- | --------- |
| url | https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact |
| method | POST |
| data | JSON |
| header | ContentType: application/json; charset=UTF-8 |
| params | { 
     BaseRequest: { 
         Uin: xxx, 
         Sid: xxx, 
         Skey: xxx, 
         DeviceID: xxx, 
     } 
} |

返回数据(JSON):

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    "MemberCount": 334,
    "MemberList": [
        {
            "Uin": 0,
            "UserName": xxx,
            "NickName": "Urinx",
            "HeadImgUrl": xxx,
            "ContactFlag": 3,
            "MemberCount": 0,
            "MemberList": [],
            "RemarkName": "",
            "HideInputBarFlag": 0,
            "Sex": 0,
            "Signature": "我是二蛋",
            "VerifyFlag": 8,
            "OwnerUin": 0,
            "PYInitial": "URINX",
            "PYQuanPin": "Urinx",
            "RemarkPYInitial": "",
            "RemarkPYQuanPin": "",
            "StarFriend": 0,
            "AppAccountFlag": 0,
            "Statues": 0,
            "AttrStatus": 0,
            "Province": "",
            "City": "",
            "Alias": "Urinxs",
            "SnsFlag": 0,
            "UniFriend": 0,
            "DisplayName": "",
            "ChatRoomId": 0,
            "KeyWord": "gh_",
            "EncryChatRoomId": ""
        },
        ...
    ],
    "Seq": 0
}

8.消息检查(参考方法 syncCheck)

| API | synccheck |
| --- | --------- |
| url | https://webpush2.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck |
| method | GET |
| data | JSON |
| header | ContentType: application/json; charset=UTF-8 |
| params | { 
     BaseRequest: { 
         Uin: xxx, 
         Sid: xxx, 
         Skey: xxx, 
         DeviceID: xxx, 
     } 
} |

返回数据(String):

window.synccheck={retcode:"xxx",selector:"xxx"}

retcode:
    0 正常
    1100 失败/登出微信
selector:
    0 正常
    2 新的消息
    7 进入/离开聊天界面

9. 获取最新消息(参考方法 webwxsync)

| API | webwxsync |
| --- | --------- |
| url | https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=xxx&skey=xxx&pass_ticket=xxx |
| method | POST |
| data | JSON |
| header | ContentType: application/json; charset=UTF-8 |
| params | { 
     BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, 
     SyncKey: xxx, 
     rr: 时间戳取反 
} |

返回数据(JSON):

{
    'BaseResponse': {'ErrMsg': '', 'Ret': 0},
    'SyncKey': {
        'Count': 7,
        'List': [
            {'Val': 636214192, 'Key': 1},
            ...
        ]
    },
    'ContinueFlag': 0,
    'AddMsgCount': 1,
    'AddMsgList': [
        {
            'FromUserName': '',
            'PlayLength': 0,
            'RecommendInfo': {...},
            'Content': "", 
            'StatusNotifyUserName': '',
            'StatusNotifyCode': 5,
            'Status': 3,
            'VoiceLength': 0,
            'ToUserName': '',
            'ForwardFlag': 0,
            'AppMsgType': 0,
            'AppInfo': {'Type': 0, 'AppID': ''},
            'Url': '',
            'ImgStatus': 1,
            'MsgType': 51,
            'ImgHeight': 0,
            'MediaId': '', 
            'FileName': '',
            'FileSize': '',
            ...
        },
        ...
    ],
    'ModChatRoomMemberCount': 0,
    'ModContactList': [],
    'DelContactList': [],
    'ModChatRoomMemberList': [],
    'DelContactCount': 0,
    ...
}

10. 发送消息(参考方法 webwxsendmsg)

| API | webwxsendmsg |
| --- | ------------ |
| url | https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=xxx |
| method | POST |
| data | JSON |
| header | ContentType: application/json; charset=UTF-8 |
| params | { 
     BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, 
     Msg: { 
         Type: 1 文字消息, 
         Content: 要发送的消息, 
         FromUserName: 自己的ID, 
         ToUserName: 好友的ID, 
         LocalID: 与clientMsgId相同, 
         ClientMsgId: 时间戳左移4位随后补上4位随机数 
     } 
} |

返回数据(JSON):

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    ...
}

更多资料:
https://github.com/xiangzhai/qwx
https://github.com/Urinx/WeixinBot
http://www.07net01.com/2016/01/1201188.html
http://www.cnblogs.com/xiaozhi_5638/p/4923811.html

<think>好的,我现在要帮助用户解决微信开发工具中wx.login获取错误的问题。首先,我需要回忆一下wx.login的相关知识,以及可能出现的错误原因。wx.login是微信小程序中用于获取用户登录凭证的API,调用后会返回一个code,用于后续换取openid和session_key。如果出现错误,可能有多种原因,比如网络问题、配置错误、代码逻辑问题或者微信服务端的问题。 接下来,我需要考虑用户可能遇到的常见错误场景。首先,检查网络连接是否正常,因为如果小程序无法连接到微信服务器,就会导致登录失败。然后,检查AppID是否正确,特别是在测试环境下,如果使用了测试号或者错误的AppID,会导致鉴权失败。此外,还需要确认小程序的域名配置是否正确,微信要求请求的域名必须在小程序的后台配置列表中,否则会被拦截。 另外,用户可能在代码中没有正确处理wx.login的回调函数,比如没有正确接收fail或complete回调中的错误信息。还有可能是服务器端的问题,比如用户在使用code换取session_key时,服务器没有正确处理,或者微信接口返回了错误信息,如code无效或过期。 然后,我需要考虑如何逐步引导用户排查问题。首先建议用户检查控制台是否有报错信息,这可以帮助快速定位问题。接着,确认AppID是否正确,网络是否正常,域名配置是否正确。然后检查代码逻辑,比如是否正确调用了wx.login,是否有正确处理成功和失败的回调。此外,还要确认服务器端是否正确处理了code,比如检查服务器是否调用了正确的微信接口,传递的参数是否正确,包括AppSecret是否泄露或错误。 还有一些其他可能性,比如用户在小程序没有发布的情况下,使用了线上版本的配置,或者测试环境与生产环境配置不一致。此外,微信开发工具本身的缓存问题也可能导致错误,可能需要清除缓存或者重启工具。 最后,需要给出一些常见的错误码及其解决方法,比如40029(无效的code),建议用户检查code是否重复使用或过期;40163(code已被使用),提示用户code只能使用一次;以及系统繁忙等错误,建议重试。 总结下来,我需要将这些思考整理成一个结构化的回答,分步骤列出可能的原因和解决方法,并给出示例代码和错误码说明,帮助用户逐步排查和解决问题。</think>在微信小程序开发中,使用 `wx.login` 获取登录凭证时遇到错误,可能由多种原因导致。以下是常见错误原因及解决方法: --- ### **1. 基础排查步骤** - **查看控制台错误信息** 在微信开发者工具中,打开调试器(Console),查看具体错误码和提示,这是定位问题的关键。 - **检查AppID配置** 确认项目的 `appid`(在 `project.config.json` 中)是否正确。若使用测试号,需确保与后台配置一致。 - **网络问题** 检查网络是否正常,微信登录需要访问微信服务器。可尝试切换网络或使用真机调试。 - **域名白名单配置** 确保服务器域名已在[微信公众平台](https://mp.weixin.qq.com)的 **开发管理 > 开发设置 > 服务器域名** 中配置(需HTTPS)。 --- ### **2. 代码逻辑问题** #### **(1)未正确处理回调** `wx.login` 是异步操作,需在 `success/fail/complete` 回调中处理结果。示例代码: ```javascript wx.login({ success: (res) => { if (res.code) { console.log('Code获取成功:', res.code); // 发送code到服务器换取openid和session_key } else { console.error('Code获取失败:', res.errMsg); } }, fail: (err) => { console.error('wx.login接口调用失败:', err); } }); ``` #### **(2)频繁调用限制** `wx.login` 不宜频繁调用(如每秒多次),微信会限制请求。建议用户主动触发(如按钮点击)后再调用。 --- ### **3. 服务器端问题** #### **(1)code换取session_key失败** 获取 `code` 后需发送到开发者服务器,再调用微信接口 `https://api.weixin.qq.com/sns/jscode2session` 换取 `openid` 和 `session_key`。常见错误: - **40029(无效的code)** 检查 `code` 是否已过期(5分钟有效)或重复使用(每个code只能换一次)。 - **40163(code已被使用)** 确保服务器未重复使用同一 `code`。 - **-1(系统繁忙)** 微信服务端临时问题,稍后重试。 #### **(2)参数错误** 确认服务器请求微信接口时传递的参数正确: ```bash # 请求示例 GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code ``` - `appid` 和 `secret` 需与小程序一致。 - `secret` 泄露会导致安全风险,确保服务器端保密。 --- ### **4. 其他常见问题** - **未发布小程序或体验版权限** 未发布的小程序需在微信公众平台设置体验版权限,否则部分用户无法登录。 - **用户未授权** `wx.login` 仅获取临时凭证,若需用户信息(如头像、昵称),需配合 `wx.getUserProfile` 使用。 - **微信开发者工具缓存** 尝试清除工具缓存:点击工具栏 **清除缓存 > 全部清除**。 --- ### **5. 错误码速查表** | 错误码 | 说明 | 解决方法 | |--------|-----| | 40029 | 无效的code | 检查code是否过期或重复使用 | | 40163 | code已被使用 | 确保每个code仅使用一次 | | 40013 | 无效的appid | 核对appid和secret是否正确 | | -1 | 系统繁忙 | 稍后重试 | -- ### **6. 调试建议** 1. 使用真机调试,排除开发者工具环境问题。 2. 在服务器端打印微信接口的完整响应,分析错误详情。 3. 参考[微信官方文档](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html)更新API调用方式。 通过以上步骤逐步排查,通常可以解决大多数 `wx.login` 相关错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值