【微信开发】1、服务器响应,与微信服务器握手

官方说明

按照微信公众平台,第一步微信服务器会按照公众号的设置验证我们自己的服务器,服务器需要做正确响应。

官方文档说明如下:

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

1)将token、timestamp、nonce三个参数进行字典序排序

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

公众平台服务器配置

源码

实现起来比较简单

通过校验签名来确定消息合法性

def _is_weixin_msg(signature,timestamp,nonce):
       tempStr = "".join(sorted([‘token令牌字符串‘,timestamp,nonce]))
       if sha1(tempStr).hexdigest() == signature:
           return True
       else:
           return False

校验通过则直接把echostr 返回给微信服务器,握手成功

try:
            signature = request.GET.get(‘signature‘,‘‘)
            timestamp = request.GET.get(‘timestamp‘,‘‘)
            nonce = request.GET.get(‘nonce‘,‘‘)
            echostr = request.GET.get(‘echostr‘,‘‘)
           
            #print ‘1:‘,request.GET
           
            if signature is not ‘‘ and timestamp is not ‘‘ and nonce is not ‘‘:
                #签名正确
                if _is_weixin_msg(signature,timestamp,nonce):
                    return HttpResponse(echostr)
                else:
                    return HttpResponse("error")
            #普通网页浏览
            else:
                return render_to_response(‘html/index.html‘,{},context_instance=RequestContext(request))
        except:
            #print ‘except:signature-‘,signature,‘;timestamp-‘,timestamp,‘;nonce-‘,nonce,‘;echostr-‘,echostr
            return HttpResponse("error")

微信IP白名单

微信IP白名单获取比较简单,用https get方法‘api.weixin.qq.com/cgi-bin/getcallbackip?access_token=xxxxxxxx到微信服务器获取即可。

通过白名单也可以判断消息来源是否合法。另外access_token是微信服务器颁发给应用服务器的全局令牌,有其时效性,下一节介绍token的获取和更新。

部分源码

#get消息到微信服务器   
def https_get(url):
    try:
        conn = httplib.HTTPSConnection(wxHost)
        conn.request(‘GET‘,url,None,headers_get)
        response = conn.getresponse()
        backdata = response.read(5000)
        errorcode,result = response_handle(backdata)
        #{"access_token":"ACCESS_TOKEN","expires_in":7200}
        debug(‘https_get‘,url,errorcode,result)
        #GET方法处理成功,状态判断的主要在response_handle函数中处理
        if  errorcode == ‘0‘:
            return errorcode,result
        else:
            return errorcode,‘https get方法失败‘+errorcode
    except:
        return ‘https_get except‘,‘https get方法异常‘

正常流程,微信返回的JSON数据体中,‘ip_list‘则为微信服务器的IP列表

def get_ip_list():
   
    #ip_list = []
   
    try:
        url = wxHost + ‘/cgi-bin/getcallbackip?access_token=‘ \
            + get_access_token()
        errorcode = ‘‘
        for i in range(0,harq):
            errorcode,response = https_get(url)
            #菜单创建成功
            if errorcode == ‘0‘:
                #ip_list = response.get(‘ip_list‘,{})
                #print ip_list
                return True,response.get(‘ip_list‘,{})
            #token非法,重新获取替换
            else:# errorcode == ‘40014‘ or errorcode == ‘41001‘:
                #强制获取token,备注掉,在https_get中处理
                #print ‘get_ip_list:token invalid‘
                #get_access_token(True)
                url = replace_access_token(url)
               
        return False ,errorcode
    except:
        return False,‘except‘

发送和响应数据示例

(‘https_get‘, ‘api.weixin.qq.com/cgi-bin/getcallbackip?access_token=xxxxxxxx‘, ‘0‘, {‘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‘, ‘182.254.11.203‘, ‘182.254.11.202‘, ‘182.254.11.201‘, ‘182.254.11.200‘, ‘182.254.11.199‘, ‘182.254.11.198‘, ‘59.37.97.100‘, ‘59.37.97.101‘, ‘59.37.97.102‘, ‘59.37.97.103‘, ‘59.37.97.104‘, ‘59.37.97.105‘, ‘59.37.97.106‘, ‘59.37.97.107‘, ‘59.37.97.108‘, ‘59.37.97.109‘, ‘59.37.97.110‘, ‘59.37.97.111‘, ‘59.37.97.112‘, ‘59.37.97.113‘, ‘59.37.97.114‘, ‘59.37.97.115‘, ‘59.37.97.116‘, ‘59.37.97.117‘, ‘59.37.97.118‘, ‘112.90.78.158‘, ‘112.90.78.159‘, ‘112.90.78.160‘, ‘112.90.78.161‘, ‘112.90.78.162‘, ‘112.90.78.163‘, ‘112.90.78.164‘, ‘112.90.78.165‘, ‘112.90.78.166‘, ‘112.90.78.167‘, ‘140.207.54.19‘, ‘140.207.54.76‘, ‘140.207.54.77‘, ‘140.207.54.78‘, ‘140.207.54.79‘, ‘140.207.54.80‘, ‘180.163.15.149‘, ‘180.163.15.151‘, ‘180.163.15.152‘, ‘180.163.15.153‘, ‘180.163.15.154‘, ‘180.163.15.155‘, ‘180.163.15.156‘, ‘180.163.15.157‘, ‘180.163.15.158‘, ‘180.163.15.159‘, ‘180.163.15.160‘, ‘180.163.15.161‘, ‘180.163.15.162‘, ‘180.163.15.163‘, ‘180.163.15.164‘, ‘180.163.15.165‘, ‘180.163.15.166‘, ‘180.163.15.167‘, ‘180.163.15.168‘, ‘180.163.15.169‘, ‘180.163.15.170‘, ‘101.226.103.0/25‘, ‘101.226.233.128/25‘, ‘58.247.206.128/25‘, ‘182.254.86.128/25‘]})

时间: 2024-10-05 09:23:15

【微信开发】1、服务器响应,与微信服务器握手的相关文章

[转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台

先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数: function CheckSignature(const signature, timestamp, nonce, token: string): boolean; var strs: TStringList;   tmpStr: string; begin strs := TStringList.Create;   try     strs.Add(token);     strs.A

微信开发调试小工具进化→微信用户发送信息模拟器发布!——这标题起真是好数码暴龙的说

直接说正题吧.最近在做微信第三方服务器.在模拟用户发过来的请求方面,网上流传着一个“微信开发调试小工具”,谁做都不知道了.反正我觉得那个东西看起来挺不爽的,因为其信息发送类型不是很全面,于是我就把它反编译过来自己重写一个了. 我复用了它原本项目的一个类和几个方法 .与原版相比,功能改进如下: 1涵盖了迄今为止所有的信息类型和事件类型(具体的参见微信官方文档里面的接收信息节点); 2对于所有参数都有相关的提示信息 3参数的所属范围除了少数外都用groupbox圈了起来,更加直观地看到了各类信息之间

微信开发本地调试工具(模拟微信客户端)

微信部署需要依靠80端口,如何快速有效的调试本地微信开发程序, 捷微团队(jeewx-java微信开源系统),采用微信开发调试工具, 供本地开发测试: 第一个参数:http://localhost:8080/jeewx/wechatController.do?wechat 第二个参数:微信公众账号的原始ID 微信开发调试功能.rar 69.42 KB, 阅读权限: 10, 下载次数: 19 微信开发本地调试工具(模拟微信客户端),布布扣,bubuko.com

微信开发SDK使用教程--手机微信个人号移除好友通知服务端

微信开发SDK使用教程--手机微信个人号移除好友通知服务端 case FriendDelNotice: {// 微信个人号移除好友通知 log.debug("socket:msgtype=FriendDelNotice"); friendDelNoticeHandler.handleMsg(ctx, msgVo); break; } package com.jubotech.framework.netty.handler.socket; import org.slf4j.Logger;

微信开发SDK使用教程--手机微信个人号新增好友通知服务端

微信开发SDK使用教程--手机微信个人号新增好友通知服务端 case FriendAddNotice: {// 微信个人号新增好友通知 log.debug("socket:msgtype=FriendAddNotice"); friendAddNoticeHandler.handleMsg(ctx, msgVo); break; } package com.jubotech.framework.netty.handler.socket; import org.slf4j.Logger;

微信开发SDK使用教程--手机微信好友发来聊天消息通知服务端

微信开发SDK使用教程--手机微信好友发来聊天消息通知服务端 case FriendTalkNotice: {// 微信好友发来聊天消息 log.debug("socket:msgtype=FriendTalkNotice"); friendTalkNoticeHandler.handleMsg(ctx, msgVo); break; } package com.jubotech.framework.netty.handler.socket; import org.slf4j.Logg

微信开发SDK使用教程--手机微信有好友请求添加好友的通知服务端

微信开发SDK使用教程--手机微信有好友请求添加好友的通知服务端 case FriendAddReqeustNotice: {//有好友请求添加好友的通知 log.debug("socket:msgtype=FriendAddReqeustNotice"); friendAddReqeustNoticeHandler.handleMsg(ctx, msgVo); break; } package com.jubotech.framework.netty.handler.socket;

《C#微信开发系列(Top)-微信开发完整学习路线》

因为年后回来这段时间学校还有公司那边有很多事情需要兼顾,所以没能及时更新文章.今天比较有时间,年前那会答应说要将微信开发的完整学习路线整理给到大家,话不多说,上图,希望对大家有所帮助哈.

微信开发(二)设置微信回调服务器 ( Node.js )

div#cpmenu {height:200px;float:left;} div#cpcontent {height:200px;width:150px;float:left;} 文章作者:松阳 原文链接:http://blog.csdn.net/fansongy/article/details/43341405 概述 上一篇中简单介绍了Token的获取,这篇中介绍如何设置回调服务器.使用技术为Node.js中的Express. 搭建服务器 这里我使用Node.js中的Express框架实现一

微信开发之(一)微信验证

基于微信公众测试平台进行开发测试,并在网上找了很多资料再此声明(如有占用代码请联系以备修改),由于比较杂不一一说明谢谢他们的努力.供有需要的人参考. 首先是实现微信的认证,登录微信测试平台我们可以看到系统自动给了一个微信号,测试号信息:appID和appsecret. 在接口配置信息中,有URL和Token 二个文本框,我们分别在URL上写上我们的服务器测试文件的地址,采用的是一般处理程序类似(http://yourdomain.com/valided.ashx). Token的值我们可以自定义