V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lvxudong
V2EX  ›  微信

如何验证消息是否来自微信公众平台服务器

  •  
  •   lvxudong · 2015-03-13 10:08:41 +08:00 · 7466 次点击
    这是一个创建于 3537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    微信的文档中是这样说的

    此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。效验方式与首次提交验证申请一致。

    可是微信文档却没有说是以什么方式带上这三个参数(signature、timestamp、nonce)的
    是放在HTTP的Head头部吗,还是用?带在URL后面?(这不是GET请求吗)

    16 条回复    2015-03-13 13:59:43 +08:00
    shangjiyu
        1
    shangjiyu  
       2015-03-13 10:20:05 +08:00   ❤️ 1
    不是 head 里面是在 URL 参数
    faceair
        2
    faceair  
       2015-03-13 10:20:48 +08:00 via iPhone
    放url后面 query参数
    alex321
        3
    alex321  
       2015-03-13 10:22:16 +08:00
    get 的方式。
    kslr
        4
    kslr  
       2015-03-13 10:31:44 +08:00   ❤️ 1
    开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:
    参数 描述
    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp 时间戳
    nonce 随机数
    echostr 随机字符串
    http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html
    你没有仔细看
    lvxudong
        5
    lvxudong  
    OP
       2015-03-13 10:34:29 +08:00
    @alex321 GET方式?我是接收来自用户的消息
    lvxudong
        6
    lvxudong  
    OP
       2015-03-13 10:35:55 +08:00
    @kslr 谢谢,接入验证这里是GET请求这个我知道,但是我问的是接收来自用户消息的时候
    kslr
        7
    kslr  
       2015-03-13 10:36:23 +08:00
    @lvxudong 用户消息是POST过来的XML
    kslr
        8
    kslr  
       2015-03-13 10:39:58 +08:00
    @lvxudong 你在之前已经配置的时候已经连接成功,只要token不泄露就没啥问题吧,如果非要搞,恐怕只能判断微信服务器IP了。
    http://mp.weixin.qq.com/wiki/0/2ad4b6bfd29f30f71d39616c2a0fcedc.html
    {"ip_list":["101.226.62.77","101.226.62.78","101.226.62.79","101.226.62.80","101.226.62.81","101.226.62.82","101.226.62.83","101.226.62.84","101.226.62.85","101.226.62.86","101.226.103.59","101.226.103.60","101.226.103.61","101.226.103.62","101.226.103.63","101.226.103.69","101.226.103.70","101.226.103.71","101.226.103.72","101.226.103.73","140.207.54.73","140.207.54.74","140.207.54.75","140.207.54.76","140.207.54.77","140.207.54.78","140.207.54.79","140.207.54.80"]}
    lvxudong
        9
    lvxudong  
    OP
       2015-03-13 11:11:01 +08:00
    @kslr 要这样搞,太麻烦了把
    alex321
        10
    alex321  
       2015-03-13 11:11:04 +08:00
    @lvxudong 用户发送消息经过微信服务器中转时,微信向你的 api 发起请求的时候都会在 url 上添加 signature、timestamp、nonce 这几个参数以 get 方式传递给你,你可以通过它们校验微信消息是否合法地来自微信服务器。而用户发送的内容会由微信服务器以 xml 的格式以 post 的方式传递给你。
    lvxudong
        11
    lvxudong  
    OP
       2015-03-13 11:20:23 +08:00
    @alex321 谢谢,查看一下微信请求的日志,终于了解了。
    纠正你一下,
    >用户发送消息经过微信服务器中转时,微信向你的 api 发起请求的时候都会在 url 上添加 signature、timestamp、nonce 这几个参数以 get 方式传递给你

    这里用户发送的消息经过微信服务器中转时,微信服务器是用 POST 方式把XML传给我的,不是GET 额
    qiayue
        12
    qiayue  
       2015-03-13 11:24:59 +08:00
    签名参数 get
    消息体(xml) post
    alex321
        13
    alex321  
       2015-03-13 11:27:27 +08:00
    @lvxudong 这位童鞋,你很需要静下心来看文字。就像上学的时候做题目一样,审题。
    siko
        14
    siko  
       2015-03-13 11:40:35 +08:00
    看来是没法绕过了?
    zieglar
        15
    zieglar  
       2015-03-13 11:41:06 +08:00   ❤️ 1
    @alex321 @lvxudong 你们都说错了
    用户发送消息经过微信服务器中转时,微信向你的 api 发起请求的时候都会在 url 上添加 signature、timestamp、nonce 这三个参数,所以处理微信的 API 需要有个入口方法来接收这三个参数并验证是否能正常解码,再执行正常的请求回应。
    lvxudong
        16
    lvxudong  
    OP
       2015-03-13 13:59:43 +08:00
    @alex321 ,@zieglar 这位同学说的对的,
    微信过来的请求,不论GET还是POST,都会在你的URL后面带query参数
    (之前没遇到过在 POST 的URL加query参数情况,一直以为只有GET才能在URL后面带query)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:20 · PVG 02:20 · LAX 10:20 · JFK 13:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.