微信开发接收参数_微信小程序开发为什么post请求的参数后端接收不到 - CSDN
精华内容
参与话题
  • 开发模式成为开发者时的消息校验原理 在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,...此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访

    开发模式成为开发者时的消息校验原理

    在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。

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

    参数 描述
    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp 时间戳
    nonce 随机数
    echostr 随机字符串

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

    加密/校验流程如下:
    1. 将token、timestamp、nonce三个参数进行字典序排序
    2. 将三个参数字符串拼接成一个字符串进行sha1加密
    3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    启用接口是由代码中的checkSignature()函数来实现校验的。如果对这一原理难以理解,可以暂时不用深究,继续看下面

     

    成为开发者后消息收发时的原理

    上一章节中图,当用户发送一个“?”时,系统回复了一个时间

    这一原理的消息流程图如下所示。

    从上图可以看出,用户在发送一个?后,微信服务器将组装一个消息发送给我们自己的服务器,自己的服务器然后回复一个时间,并且将该时间也按一定的规则组装,回复给公众账号,公众账号再回复给用户,在这个收发过程中,发送方和接收方进行了调换(ToUserName和FromUserName值互换),收发都是以xml格式在后台进行传输的,

    所以掌握各种消息类型的接收回复就是进行微信公众平台开发的基础

    下面对前面所述的各种消息类型讲解其XML数据包的格式。

    展开全文
  • 微信公众号开发接收与发送消息

    万次阅读 2019-08-29 12:05:43
    说明:该篇博客是博主一字一码编写的,实属不易,请... 公众号接收与发送消息 验证URL有效性成功后即接入生效,成为开发者。如果公众号类型为服务号(订阅号只能使用普通消息接口),可以在公众平台网站中申请认证...

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

    在上一篇博客中已经验证了服务器有效性:https://blog.csdn.net/qq_41782425/article/details/85321424

    一丶概论

    • 公众号接收与发送消息

    验证URL有效性成功后即接入生效,成为开发者。如果公众号类型为服务号(订阅号只能使用普通消息接口),可以在公众平台网站中申请认证,认证成功的服务号将获得众多接口权限,以满足开发者需求。

    此后用户每次向公众号发送消息、或者产生自定义菜单点击事件时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,然后开发者可以依据自身业务逻辑进行响应,例如回复消息等。

    用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID。

    1.接收普通消息

    当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

    微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

    各消息类型的推送使用XML数据包结构,如:

    <xml>
    <ToUserName><![CDATA[gh_866835093fea]]></ToUserName>
    <FromUserName><![CDATA[ogdotwSc_MmEEsJs9-ABZ1QL_4r4]]></FromUserName>
    <CreateTime>1478317060</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
    <MsgId>6349323426230210995</MsgId>
    </xml>

    注意:<![CDATA 与 ]]> 括起来的数据不会被xml解析器解析 

    2.普通消息类别

    1. 文本消息
    2. 图片消息
    3. 语音消息
    4. 视频消息
    5. 小视频消息
    6. 地理位置消息
    7. 链接消息

    文本消息

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName> 
     <CreateTime>1348831860</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[this is a test]]></Content>
     <MsgId>1234567890123456</MsgId>
     </xml>

    3. 回复的消息类型

    1. 文本消息
    2. 图片消息
    3. 语音消息
    4. 视频消息
    5. 音乐消息
    6. 图文消息

    回复文本消息

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
    </xml>
    

     注:开发文档可以到 https://mp.weixin.qq.com/wiki/home/index.html  进行阅读查看

    二丶代码实现

    需求:我们现在来实现一个针对文本消息的收发程序。实现的业务逻辑,关注者发什么内容,我们就传回给什么内容。

    说明:微信服务器推送消息还是往/wechat/8007,所以在之前代码上进行修改即可

    1.开发步骤

    • step1 如何区分微信服务器发过来的是第一次的验证操作还是消息操作
    • 验证操作为GET请求,消息操作为POST请求
    @app.route("/wechat8007", methods=["GET", "POST"])
    • step2 参数变更,echostr参数只是在第一次验证的时候需要,无论是POST请求还是GET请求这三种参数都必要要,因为需要验证是不是微信服务器发送过来的数据
    signature = request.args.get("signature")
    timestamp = request.args.get("timestamp")
    nonce = request.args.get("nonce")
    • step3 对微信服务器发送的请求进行验证判断,如果是GET请求,那么代表是第一次的验证操作,那么就需要获取echostr字段的内容,如果内容为空则抛出404,存在则返回echostr
    if request.method == "GET":
        # 表示是第一次接入微信服务器的验证
        echostr = request.args.get("echostr")
        if not echostr:
            abort(404)
        return echostr
    • step4  如果为POST请求,那么代表为微信服务器转发消息过来,获取请求中的data xml数据 ,数据为空抛出400
    elif request.method == "POST":
        # 表示微信服务器转发消息过来
        xml_str = request.data
        if not xml_str:
            abort(400)
    • step5 将对获取的数据进行解析,通过xmltodict模块中的parse方法将字符串类型的xml数据,转换成字典类型的xml格式数据,因为xml数据最外层有一个<xml></xml>标签,通过get方式获取标签里的内容,再通过get获取内容中的MsgType消息类型字段的值
    # 对xml字符串进行解析
    xml_dict = xmltodict.parse(xml_str)
    xml_dict = xml_dict.get("xml")
    
    # 提取消息类型
    msg_type = xml_dict.get("MsgType")
    • step6 对消息类型进行判断,如果为text文本消息,则返回文本消息,不是文本消息还是返回文本消息,这里可以拓展为(image,voice,video等等可以查看开发文档),这里为了演示,就简单写写
     if msg_type == "text":
        # 表示发送的是文本消息
        # 构造返回值,经由微信服务器回复给用户的消息内容
        resp_dict = {
            "xml": {
                "ToUserName": xml_dict.get("FromUserName"),
                "FromUserName": xml_dict.get("ToUserName"),
                "CreateTime": int(time.time()),
                "MsgType": "text",
                "Content": "taogang say:" + xml_dict.get("Content")
            }
        }
    else:
        resp_dict = {
            "xml": {
                "ToUserName": xml_dict.get("FromUserName"),
                "FromUserName": xml_dict.get("ToUserName"),
                "CreateTime": int(time.time()),
                "MsgType": "text",
                "Content": "Dear I Love you so much"
            }
        }
    • step7 最后将我们构造的响应返回值通过unparse方法转换成xml格式的字符串,返回给微信服务器
    # 将字典转换为xml字符串
    resp_xml_str = xmltodict.unparse(resp_dict)
    # 返回消息数据给微信服务器
    return resp_xml_str

    2.部署测试

    • step1 将代码推送到服务器上

    • step2 在服务器上进入虚拟环境,运行此程序

    • step3 进入微信公众平台,用手机扫描测试号二维码,进行关注测试

    扫码后进行关注 

    关注后进入此公众号,公众号则发送我们在开发步骤step 6,Dear I Love you so much 消息内容

    回到服务器程序运行日志上,显示为POST请求,说明程序逻辑完全没问题

    公众号测试平台用户列表将我的微信添加上去了

    • step4 测试,在关注的此公众中,进行消息(文本,表情,语言,图片,视频)发送,当消息类型为文本时,即返回此消息内容,如果不是都是返回文本类型,内容为Dear I Love you so much

     

    此时的服务器代码运行日志

    3.完整代码

    # coding:utf-8
    from flask import Flask, request, abort, render_template
    import hashlib
    import xmltodict, time
    
    
    # 常量
    # 微信的token令牌
    WECHAT_TOKEN = "cdtaogang"
    
    
    app = Flask(__name__)
    
    
    @app.route("/wechat8007", methods=["GET", "POST"])
    def wechat():
        """对接微信公众号服务器"""
        # 接收微信服务器发送的参数
        signature = request.args.get("signature")
        timestamp = request.args.get("timestamp")
        nonce = request.args.get("nonce")
    
        if not all([signature, timestamp, nonce]):
            abort(400)
    
        # 按照微信的流程进行计算签名
        li = [WECHAT_TOKEN, timestamp, nonce]
        # 排序
        li.sort()
        # 拼接字符串
        tmp_str = ''.join(li)
        # 进行sha1加密, 得到正确的签名值
        sign = hashlib.sha1(tmp_str).hexdigest()
        # 将自己计算的签名值与请求的签名参数进行对比,如果相同,则证明请求来自微信服务器
        if sign != signature:
            # 表示请求不是微信发的
            abort(403)
        else:
            # 表示是微信发送的请求
            if request.method == "GET":
                # 表示是第一次接入微信服务器的验证
                echostr = request.args.get("echostr")
                if not echostr:
                    abort(404)
                return echostr
            elif request.method == "POST":
                # 表示微信服务器转发消息过来
                xml_str = request.data
                if not xml_str:
                    abort(400)
    
                # 对xml字符串进行解析
                xml_dict = xmltodict.parse(xml_str)
                xml_dict = xml_dict.get("xml")
    
                # 提取消息类型
                msg_type = xml_dict.get("MsgType")
    
                if msg_type == "text":
                    # 表示发送的是文本消息
                    # 构造返回值,经由微信服务器回复给用户的消息内容
                    resp_dict = {
                        "xml": {
                            "ToUserName": xml_dict.get("FromUserName"),
                            "FromUserName": xml_dict.get("ToUserName"),
                            "CreateTime": int(time.time()),
                            "MsgType": "text",
                            "Content": "taogang say:" + xml_dict.get("Content")
                        }
                    }
                else:
                    resp_dict = {
                        "xml": {
                            "ToUserName": xml_dict.get("FromUserName"),
                            "FromUserName": xml_dict.get("ToUserName"),
                            "CreateTime": int(time.time()),
                            "MsgType": "text",
                            "Content": "Dear I Love you so much"
                        }
                    }
                # 将字典转换为xml字符串
                resp_xml_str = xmltodict.unparse(resp_dict)
                # 返回消息数据给微信服务器
                return resp_xml_str
    
    if __name__ == '__main__':
        app.run(port=8007, debug=True)

     

    展开全文
  • 微信开发接收事件推送

    千次阅读 2016-10-05 21:09:26
    ​在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者...

    ​在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许,详细说明请见本页末尾的微信推送消息与事件说明。

    在用户触发事件后,微信会向开发者页面发送一组xml数据

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[FromUser]]></FromUserName>
    <CreateTime>123456789</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe]]></Event>
    </xml>

    这个就是关注/取消关注事件后 触发的数据;

    参数说明:
    参数 	描述
    ToUserName 	开发者微信号
    FromUserName 	发送方帐号(一个OpenID)
    CreateTime 	消息创建时间 (整型)
    MsgType 	消息类型,event
    Event 	事件类型,subscribe(订阅)、unsubscribe(取消订阅) 

    我们要做的是

    ①判断数据类型

    <pre name="code" class="html">if ($msgType=='event'){
                    $contentStr = "为关注或取消关注类型";
    if($event==''){
    //继续判断事件类型
     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,                                $contentStr);
                    echo $resultStr;
         }
    } 
    
    最后根据事件类型作出反应.
    其余事件类型与此相同,可以自己尝试测试;


    展开全文
  • 如果在你的企业应用中需要用到如下功能时需提前开启接收消息模式 获取企业成员的地理位置信息动态调整企业应用的信息获取企业成员点击事件类型的应用菜单行为获取企业成员通过应用给企业后台发送的消息 关于...

    如果在你的企业应用中需要用到如下功能时需提前开启接收消息模式

    • 获取企业成员的地理位置信息
    • 动态调整企业应用的信息
    • 获取企业成员点击事件类型的应用菜单行为
    • 获取企业成员通过应用给企业后台发送的消息

    关于操作过程,企业微信API里已经介绍的很清晰了http://work.weixin.qq.com/api/doc#10514

    后台开启接收消息>使用接收消息>消息的加解密处理

    主要是用到了微信提供的加解密处理库,对微信请求来的参数进行解密出来,再把echostr参数明文返回给微信


    展开全文
  • 配置微信公众号当普通微信用户向公众号发送消息或者与微信公众号进行互动触发某些事件时,微信服务器将会把这些消息或者事件以XML数据包格式POST到开发者在微信公众号管理平台中配置的服务器地址URL上。
  • 基于thinkphp微信开发 ##1、 微信公众平台开启服务器配置 ##2、 具体代码 在http://ip/tp/wx.php/Home/Index.index ###wx.php <?php //1、定义项目名称 define('APP_NAME','wx'); //2、定义项目路径 define('...
  • 微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数的二维码”,通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微信公众号上 用微信扫一扫推送到开发者网址那儿的数据...
  • 企业微信接收用户输入消息内容并响应 前面一节说明了企业微信设置API接收,服务器回调配置的一些说明。这一节我们接着后面的内容来讲下在企业微信中,如何通过应用,接收用户消息。 ...
  • 一、准备阶段 需要准备事项:1.一个能在公网上访问的项目: 见:Java微信公众平台开发01本地服务器映射外网 ...3.策略文件 见:Java企业微信开发 http://www.cnblogs.com/
  • 一丶页面跳转传递参数接收 wx.navigateTo(object,object) 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。 //当前代码为...
  • 上一篇《微信开发学习总结(一)——微信开发环境搭建》我们已经完成了微信开发的准备工作,准备工作完成之后,就要开始步入正题了。 一、微信公众平台的基本原理  在开始做之前,先简单介绍了微信公众平台的基本...
  • 简介: 本篇博文是针对本人在开发企业微信消息交互的一些经验分享,介绍一下自己开发过程中遇到的问题和解决方法,如果问题或异议,欢迎讨论,技术大佬请忽略 用户在企业微信中有2种用户操作可以发送给我们服务器 1...
  • python微信公众号接收回复用户消息

    千次阅读 2019-08-06 15:28:04
    首先,微信用户发送消息给公众号, 消息是先是发送到微信服务器, 后面再由微信服务器转发到公众号, 同理, 当公众号收到微信用户消息进行回复时, 也是先发送到微信服务器, 再由微信服务器转发给指定微信用户...
  • 当Token通过验证之后,在用户发送消息过来的时候,微信服务器将也会带上前面3个参数(signature、timestamp和nonce)访问开发者设置的URL,同时还会将消息的XML数据包POST到URL 上。 第一步:获取POST数据 ...
  • 其中最重要的就是一些回调配置,回调路径指向我们自己的服务器,需要正确接收微信的响应。 微信接口开发无非就是通过一些带token的http请求来实现相关功能,而获取这些token往往需要先获取一些重要参数,这里有两个...
  • 微信公众号开发--接收与回复消息(Java)
  • (注意:若还没有进行接入操作,请参考开发教程(一))实现思路接下来我们先打开微信开发文档,选择“消息管理”模块中的”接收普通消息“。文档中已经告诉我们,当普通微信用户向公众账号发送消息时,微信服务器会把...
1 2 3 4 5 ... 20
收藏数 26,260
精华内容 10,504
关键字:

微信开发接收参数