微信开发 服务器要求_微信公众平台开发服务器与微信服务器通信时失败 - CSDN
  • 微信公众号开发(一)服务器及接口的配置 关于微信公众号中的订阅号和服务的区别这里不多加讨论,网上有很多资源可以搜到,这里直接进入正题,如果是个人开发者,这里建议使用测试号进行开发学习,测试号的权限要比...

    微信公众号开发(一)服务器及接口的配置

    关于微信公众号中的订阅号和服务的区别这里不多加讨论,网上有很多资源可以搜到,这里直接进入正题,如果是个人开发者,这里建议使用测试号进行开发学习,测试号的权限要比个人订阅号要多的多,而本篇博客也是基于测试号进行开发的。

     

    在开始微信号开发之前需要准备好两样东西,1、需要一个测试号,2、需要一个拥有域名的服务器,下面将分别介绍怎样获取这两样东西。

    1、测试号

    点击此链接测试号登录可直接用微信扫一扫注册一个测试号,相应的界面如下所示

     

    进入测试号界面之后可以获得一些开发所需要的东西,以及关注者列表和开发权限等,如下所示

     

    2、服务器

    微信号开发需要一个第三方服务器来和微信服务器沟通,这里我使用的是一个百度云的BAE虚拟主机,理由有以下几点:

    1、性价比高,该主机一天只需要2毛钱,而且不限制充值金额,如果你只是用来学习微信公众号开发,而且预计一个月学会的话,那么你只需要充值6元钱就可以,相比其他最低充值一年的平台相比,要划算的多。

    2、可以免去购买域名的费用,该BAE可免费设置一个二级域名,可用于微信公众号开发,并且数据库的使用也是免费的。

    3、该BAE的代码可以使用git或svn管理,我们在本地写好代码之后,直接push上去就可以了,相当方便,而且可以设置快捷发布,提交代码当即发布。

    缺点就是它的日志系统不够完善,不过这个缺点很容易解决,我们可以自己打印信息到文件里,然后读取出来,下面将会介绍到。

     

    百度云网址是:https://login.bce.baidu.com/?account=,登录之后,点击BAE后如图

     

    好了,这样我们就准备好了微信开发的两个必备的东西。接下来就要配置接口了。

     

    3、配置接口

    上面进入测试号界面的时候我们可以看到有一个接口配置信息的模块,如下所示

     

     

    这里的URL就是填写以上BAE中的域名就好了,当然了要注意加上http://前缀,以后用户发送的消息都会经过微信服务器转发到该接口。Token可以随便填写一些东西,这里填写了weixin。关于Token的用途下面会讲到。

    好了,现在先别急着点击提交,因为我们还没有在URL指向的服务器里编写任何的代码,还不能正确响应微信服务器的请求。

     

    在编写任何的代码之前,我先说一下本博客的一些习惯,为了便于理解,我会先将文件的结构和代码先贴出来,然后才解释具体代码的含义,这样如果熟悉的人就可以直接跳过该部分了。

     

    文件结构如下

     

    index.php用于处理消息。

    output_log.php和output_query.php分别用来输出post过来的数据和请求的查询字符串,Utils.php主要用来将数据输出到文件中,看了下面的代码你就明白了,其实相当简单,这三个东西是我用来调试用的,相比起微信公众号提供的在线调试接口而言(需要设置一堆的信息),我觉得这样更加简单。

     

    Utils.php,提供了两个函数,traceHttp()将请求的时间、远程主机地址和查询字符串输出到query.xml文件中。logger()将类型、时间和post数据输出到log.xml中。

    <?php
    class Utils
    {
        public static function traceHttp()
        {
            $content = date('Y-m-d H:i:s')."\n\rremote_ip:".$_SERVER["REMOTE_ADDR"].
                "\n\r".$_SERVER["QUERY_STRING"]."\n\r\n\r";
            $max_size = 1000;
            $log_filename = "./query.xml";
            if (file_exists($log_filename) and (abs(filesize($log_filename))) > $max_size){
                unlink($log_filename);
            }else {
    
            }
            file_put_contents($log_filename, $content, FILE_APPEND);
        }
    
        public static function logger($log_content, $type = '用户')
        {
            $max_size = 3000;
            $log_filename = "./log.xml";
            if (file_exists($log_filename) and (abs(filesize($log_filename)) >
                    $max_size)) {
                unlink($log_filename);
            }
            file_put_contents($log_filename, "$type  ".date('Y-m-d H:i:s')."\n\r".$log_content."\n\r",
                FILE_APPEND);
        }
    }

     

    output_query.php,输出query.xml的内容

    <?php
    @header('Content-type: text/plain;charset=UTF-8');
    $filepath = './query.xml';
    readfile($filepath);


    output_log.php,输出log.xml的内容。

    <?php
    @header('Content-type: text/plain;charset=UTF-8');
    $filepath = './log.xml';
    readfile($filepath);


    是不是非常简单,然后我们开始写处理消息index.php

    <?php
    //设置时区
    date_default_timezone_set("Asia/Shanghai");
    //定义TOKEN常量,这里的"weixin"就是在公众号里配置的TOKEN
    define("TOKEN", "weixin");
    
    require_once("Utils.php");
    //打印请求的URL查询字符串到query.xml
    Utils::traceHttp();
    
    $wechatObj = new wechatCallBackapiTest();
    /**
     * 如果有"echostr"字段,说明是一个URL验证请求,
     * 否则是微信用户发过来的信息
     */
    if (isset($_GET["echostr"])){
        $wechatObj->valid();
    }else {
        $wechatObj->responseMsg();
    }
    
    class wechatCallBackapiTest
    {
        /**
         * 用于微信公众号里填写的URL的验证,
         * 如果合格则直接将"echostr"字段原样返回
         */
        public function valid()
        {
            $echoStr = $_GET["echostr"];
            if ($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
    
        /**
         * 用于验证是否是微信服务器发来的消息
         * @return bool
         */
        private function checkSignature()
        {
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
    
            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            sort($tmpArr);
            $tmpStr = implode($tmpArr);
            $tmpStr = sha1($tmpStr);
    
            if ($tmpStr == $signature){
                return true;
            }else {
                return false;
            }
        }
    
        /**
         * 响应用户发来的消息
         */
        public function responseMsg()
        {
            //获取post过来的数据,它一个XML格式的数据
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
            //将数据打印到log.xml
            Utils::logger($postStr);
            if (!empty($postStr)){
                //将XML数据解析为一个对象
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $RX_TYPE = trim($postObj->MsgType);
                //消息类型分离
                switch($RX_TYPE){
                    case "event":
                        $result = $this->receiveEvent($postObj);
                        break;
                    default:
                        $result = "unknow msg type:".$RX_TYPE;
                        break;
                }
                //打印输出的数据到log.xml
                Utils::logger($result, '公众号');
                echo $result;
            }else{
                echo "";
                exit;
            }
        }
    
        /**
         * 接收事件消息
         */
        private function receiveEvent($object)
        {
            switch ($object->Event){
                //关注公众号事件
                case "subscribe":
                    $content = "欢迎关注微微一笑很倾城";
                    break;
                default:
                    $content = "";
                    break;
            }
            $result = $this->transmitText($object, $content);
            return $result;
        }
    
        /**
         * 回复文本消息
         */
        private function transmitText($object, $content)
        {
            $xmlTpl = "<xml>
        <ToUserName><![CDATA[%s]]></ToUserName>
        <FromUserName><![CDATA[%s]]></FromUserName>
        <CreateTime><![CDATA[%s]]></CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[%s]]></Content>
    </xml>";
            $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);
            return $result;
        }
    }


    这几个文件写好之后,直接通过git push到BAE上,如果设置了快捷发布,过1、2秒钟就会自动发布了,状态里面会显示绿色的"正常",如果没有设置快捷发布,上传代码后需要手动点击右边的快捷发布按钮。

     

    这时我们就可以点击测试号界面里面的那个提交按钮了。

     

     

    如果配置正确,则会提示配置成功。

     

    4、调试

    在浏览器地址栏上输入,xxx/output_query.php,xxx是你的域名。则会出现你点击提交后发送过来的请求,类似如下

     

     

    可以看到该查询字符串有4个字段

    • signature:微信加密签名
    • echostr:随机字符串
    • timestamp:时间戳
    • nonce:随机数

    只有在验证URL的时候查询字符串中才会有“echostr”这个字段,验证的方法是

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

     

    验证通过之后,我们可以用微信扫一扫,扫描测试号里面的公众号二维码,关注该公众号,关注之后,公众号列表会显示出关注者的列表。

     

    此时微信应该会回复一条文本消息,也就是以上在index.php中设置的“欢迎关注XXX”。

     

    这时我们重新刷新一下xxx/output_query.php,发现没有“echostr”这个字段了,因为这个是用户发来的消息,而不是验证URL的消息。多出来的openid字段是用户的微信号,如果采用的是加密模式,还会有encrypt_type和msg_signature等字段。测试号只有明文模式。

    接着我们重新打开一个标签,访问XXX/log.xml,查看发送的post数据,下面是一个关注公众号的事件,和我们返回给微信的XML数据。

     

    现在不比纠结这些数据格式的问题,以后我们会提到,这样我们的微信公众号开发就准备好了,记得把这两个日志URL保存为浏览器的标签方便下次访问,以后调试只要F5一下就可以了,是不是比微信提供的在线调试容易多了。

    注意:必须在5秒内响应微信的服务器,否则会导致重传或者报错

     

    下一章我们将会尝试微信的基本消息接口,那时候就会理解这些数据结构了。

    相关博客

    微信公众号开发(一)服务器及接口的配置

    微信公众号开发(二)基础接口

    微信公众号开发(三)获取access_token

    微信公众号开发(四)自定义菜单

    微信公众号开发(五)个性化菜单

    微信公众号开发(六)素材管理

    微信公众号开发(七)发送客服消息

    微信公众号开发(八)用户管理

    微信公众号开发(九)群发消息接口

    微信公众号开发(十)模板消息

    微信公众号开发(十一)生成带参数二维码

    微信公众号开发(十二)OAuth2.0网页授权

    展开全文
  • 下图是配置完成后的样子,后面给大家详细介绍每一步的步骤:下图为微信公众号开发验证机制:由用户发送请求给微信服务器,微信服务器根据地址URL访问请求个人开发服务器,然后个人开发服务器响应返回给微信服务器(其中有...

    我们在进行微信公众平台开发,基本都会遇到一个问题:配置服务器.....这个问题不大不小,还是挺繁琐的.......下图是配置完成后的样子,后面给大家详细介绍每一步的步骤:


    下图为微信公众号开发验证机制:由用户发送请求给微信服务器,微信服务器根据地址URL访问请求个人开发服务器,然后个人开发服务器响应返回给微信服务器(其中有数据报文验证,Token字段验证是其中之一),微信服务器接收后响应给用户,整个过程完成无误后,即服务器配置完成....


    第一步:申请个人服务器及域名

    (1)腾讯云:https://cloud.tencent.com/

    (2)阿里云:https://www.aliyun.com/

    (3)华为云:https://www.huaweicloud.com/

    以上提供云服务的公司都可以选择,其中域名备案通常需要一个月时间,三家公司都有一个共同点就是要钱,哈哈哈哈大哭......既然这么说了就给大家介绍一下免费的安静

    (4)魔方云:https://www.mfyun.com.cn/act/freehost/ ,直戳链接免费领取一年虚拟云主机活动,虚拟云主机和云服务器的区别我就不介绍了,两者感觉都能满足个人对微信公众号的基本开发,虚拟云主机自带域名很合适短期用户需求


    注册号云虚拟主机后,滚动至下方根据需求将数据库开启,这个活动免费赠送100M容量MySQL数据库

    第二步:添加服务器地址URL


    服务器地址URL为:http://或者https://加申请域名,填写之前可以先进行个人服务器访问测试,访问其根目录页面

    第三步:填写令牌(Token)

    微信服务器与个人服务器数据报验证是采用doGet形式进行验证,本文采用的是php代码验证


      验证代码中的token字符串要和微信服务器配置中的令牌(Token)一致

    第四步:上传完整验证代码至个人服务器

    ftp文件传输协议,将完整代码上传至个人云服务器或者云虚拟主机,本人采用的是notepad++的ftp插件,ftp插件下载和导入请自行百度。

    4.1与个人服务器建立连接


    其中Hostname为:云虚拟主机的上传地址,Username为ftp用户,password为ftp密码

    连接成功即显示服务器中文件目录


    上传完整代码:1.新建index.php文件2.将完整代码copy后点击保存,3.成功后可以看到目录出现上传文件


    第五步:尝试启动微信服务器配置

    将完整URL填入,这里是http://+域名+index.php,令牌Token值需要和代码中的token一样,消息加解密密匙可以点击随即获取,加解密方式选明文模式

    到这里终于配置完服务器,但这只是总体开发万里长征中的第一步,路漫漫其修远,然上下而求索兮............

    希望以上解释说明能对大家有所帮助,谢谢支持!

    展开全文
  • 说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家...在这里可以通过微信渠道将品牌推广给上亿的微信用户,减少宣传成本,提高品牌知名度,打造更具影响力的品牌形象。 3. 公众平台 微信公众平...

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

    一丶概述

    公众号与公众平台

    1. 微信账号类型

    • 个人号
    • 公众号
      • 订阅号
      • 服务号
    • 企业号

    2. 公众号

    微信公众号主要面向名人、政府、媒体、企业等机构推出的合作推广业务。在这里可以通过微信渠道将品牌推广给上亿的微信用户,减少宣传成本,提高品牌知名度,打造更具影响力的品牌形象。

    3. 公众平台

    微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读公众平台开发接口文档来帮助开发。

    微信公众平台可以用来注册、管理公众号企业号

    登录网址:https://mp.weixin.qq.com/

    进入上面网址,可进行登录及注册

    注册流程:

    • step1 基本信息

    • step2 选择类型

    • step3 信息登记

    • step4 公众号信息

    • step5 完成注册后,进行登录,首先需使用手机进行扫码

    • 在手机端显示此界面,确认无误后,确定即可

    • 通过身份验证后,即可在网页端对创建的公众号进行简单配置,如下图

    • 一些简单的功能添加以及配置(需要啥配置啥即可,简单操作这里不做详细说明了)

    4. 公众号与个人号的区别

    微信公众号和个人号是完全不同的。

    微信对个人号的定位是普通用户之间的交流和通讯,微信并不鼓励和支持使用个人号进行营销推广(微信曾经大规模封杀好友过多的营销个人号)。

    而公众号则完全是为品牌推广、信息推送等服务而定制的。使用公众号,可以向关注者(即粉丝)群发图文消息,粉丝在对话界面看到消息后,可以点击跳转到一个图文页面。公众号还提供关键词自动回复等基础功能,以此可以随时、自动的和粉丝进行互动。

    除了这些基础功能之外,更大的区别是,微信针对公众号开放了很多程序接口。在这些接口的基础上,可以向粉丝提供更多的服务。此外,认证的服务号还可以申请微信支付。粉丝可以使用微信支付向进行付款(订购服务或购买商品)。所有这些,都是个人号不具备的。

    微信公众号的注册几乎是没有门槛的。不过针对不同类型的公众号,微信提供的功能不同,资质要求也不一样。

    二丶微信开发原理

    公众号主要通过

    • 公众号消息会话
    • 公众号内网页

    来为用户提供服务的。

    • 公众号消息会话

    公众号是以微信用户的一个联系人形式存在的,消息会话是公众号与用户交互的基础。

    • 公众号内网页

    许多复杂的业务场景,需要通过网页形式来提供服务。

    • 使用微信服务器提供的功能无法满足我们的需求

    设想两个场景:

    1. 公众号的消息自动回复想做的智能一些,类似于iphone的Siri,例如粉丝发送“今天的北京天气”到公众号,回复粉丝信息时要按照特定时间特定城市给予反馈;

    2. 公众号内嵌的网页需要获取浏览用户的微信头像、昵称、当前定位等信息

    • 模型分类

    无扩展应用模型

    1. 公众号消息会话

     

    2. 公众号内网页

    有扩展应用模型

    1. 公众号消息会话

    2. 公众号内网页

    • 公众号接口

    1. 公众号消息会话

    目前公众号内主要有这样几类消息服务的类型,分别用于不同的场景。

    群发消息

    公众号可以以一定频次(订阅号为每天1次,服务号为每月4次),向用户群发消息,包括文字消息、图文消息、图片、视频、语音等。

    被动回复消息

    在用户给公众号发消息后,微信服务器会将消息发到开发者预先在开发者中心设置的服务器地址(开发者需要进行消息真实性验证),公众号可以在5秒内做出回复,可以回复一个消息,也可以回复命令告诉微信服务器这条消息暂不回复。被动回复消息可以设置加密(在公众平台官网的开发者中心处设置,设置后,按照消息加解密文档来进行处理。其他3种消息的调用因为是API调用而不是对请求的返回,所以不需要加解密)。

    客服消息

    在用户给公众号发消息后的48小时内,公众号可以给用户发送不限数量的消息,主要用于客服场景。用户的行为会触发事件推送,某些事件推送是支持公众号据此发送客服消息的,详见微信推送消息与事件说明文档。

    模板消息

    在需要对用户发送服务通知(如刷卡提醒、服务预约成功通知等)时,公众号可以用特定内容模板,主动向用户发送消息。

    2. 公众号内网页

    对于公众号内网页,提供以下场景接口:

    网页授权获取用户基本信息

    通过该接口,可以获取用户的基本信息

    微信JS-SDK

    是开发者在网页上通过JavaScript代码使用微信原生功能的工具包,开发者可以使用它在网页上录制和播放微信语音、监听微信分享、上传手机本地图片、拍照等许多能力。

    3.微信开发者文档

    文档链接地址:https://mp.weixin.qq.com/wiki/home/index.html

     

     

     

     

     

    展开全文
  • 昨天跟一个朋友吃饭,谈到微信公众号的事情,说到帮他做一个微信公众号,于是今天在折腾这个,在微信页面添加服务器配置之后,点提交,自己搭建的web服务器收到了微信转发过来的请求,然后按要求返回传过来的随机...
    昨天跟朋友谈到微信公众号的事情,说到帮他做一个微信公众号,于是今天在折腾这个,在微信页面添加服务器配置之后,点提交,自己搭建的web服务器收到了微信转发过来的请求,然后按要求返回传过来的随机字符串之后,微信页面提示请求URL超时,于是就觉得很奇怪,服务器已经接收了请求了啊,也返回随机字符串。在网上搜了一下可能是ip变化的原因,因为用的自己电脑做的外网映射,用的nat123工具,可能是这个原因,多提交几次就成功了,只是不稳定而已,前期自己开发测试一下够了。
    
    展开全文
  • 微信开发时,把本机的服务映射到外网。这样就可以很容易的完成调试。 具体步骤如下:下载 natapp客户端 https://natapp.cn/注册账号获取token运行客户端 natapp -authtoken=xxxx出现下图表示成功 附:还有...

    在微信开发时,把本机的服务映射到外网。这样就可以很容易的完成调试。

    1. 具体步骤如下:下载 natapp客户端  https://natapp.cn/
    2. 注册账号获取token
    3. 运行客户端  natapp -authtoken=xxxx
    4. 出现下图表示成功

    附:还有一些其他类型的第三方工具:

    花生壳http://www.oray.com/

    ngrok:https://ngrok.com/download

    ....各取所需

    展开全文
  • 由于项目需要微信公众号的开发,弄了老半天,发现也不是那么难弄。对于微信公众号开发,首先要有开发者权限然后进行基本的配置。登录进微信公众号平台,首页最下面有个基本配置:进入基本配置后,会看到两个栏目,一...
  • 最近在做微信公众号的开发,有个下载发票pdf文件的功能,这个pdf文件在服务器上,需要下载到手机本地,处理流程是,页面列表里每项都有一个下载按钮,点击下载按钮,跳到新的下载页面,下载页面代码如下: ...
  • 直接一点哈,用的是Java开发的、SpringMvc。自己只是把自己遇到的东西 写下来 ,方便以后查看,大家也可以了解一下。有什么问题可以一起探讨! 如果启用“开发者中心”,则微信公众平台本身的自动回复,自定义菜单则...
  •  各位肯定都知道,做微信开发,我们的开发服务器需要和微信服务器做交互,我们需要准备一台放置在公网的服务器,能够使得我们的服务器可以正常访问微信服务器,并且微信服务器也需要可以正常访问我们的开发服务器。...
  • 好久没有更新博客,最近课余时间看看微信的开发,本文主要介绍如何认证微信的token,开启微信开发之旅。 首先我是申请了一个新浪云的一个应用,进行开发(SAE),主要利用php进行验证
  • 1.首先可以自行购买获取服务器,也可以在本地主机中设置虚拟机搭建服务器(这个方法没试过,但在设想中我认为是可行的,后续会自己尝试一下再发布),这里我购买的是腾讯云服务器Ubuntu16.04 64位版本。 2.推荐使用...
  • 如果你只是简单使用微信公众号,发送推文等简单需求,你就不需要的配置自己的开发服务器微信公众号平台功能十分强大,不懂技术的用户也可以简单开发一个自己公众号。如果你有像成绩推送等需求,你就需要知道用户的...
  • 微信开发服务器主动发送微信消息,流程是自己的服务器向微信服务器发送消息请求,微信服务器接受请求后发消息给手机客户端。
  • 3 填写相关服务器配置信息: 这里的token要跟服务器的验证文件里的token一致。4 写一个验证文件放进服务器,验证token,看是否连接成功。附上验证代码:** * wechat php test */ //define your tokendefine("T
  • 前期准备工作准备工具:Tomcat服务器,阿里云服务器Tomcat下载地址 阿里云服务器(云翼计划) 阿里云阿里云服务器购买:学生可以使用云翼计划购买阿里云服务器,平均一个月12块左右。正常阿里云购买一个月阿里云...
  • 之前直接写了怎么开发,忘了写怎么知道验证消息来自微信服务器,否则无法进行开发,先来看一下官方的开发文档怎么描述的 接入微信公众平台开发,开发者需要按照如下步骤完成: 1、填写服务器配置 2、验证服务器...
  • 学习微信公众号的开发,必须先阅读微信开发文档,通过阅读文档,了解有关微信公众开发的步骤及相关限制,了解其工作原理等。 微信开发之入门指引 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
  • 前提: 1.微信订阅号 2.开发语言C# 3.有自己的域名,且可以正常使用
  • 微信公众号开发需要将项目运行在带有独立ip地址的主机上,可以选择内网穿透或者云服务器,我用的阿里云的服务器微信验证接入过程就是微信给你的服务器发送一个get请求,请求中携带signature、timestamp、nonce和...
  • 之前说过,公众平台测试号和个人号没太大区别,这里为了方便以测试号为例,先给大家讲解如何填写服务器配置,在公众号后台点击开发者工具里的接口测试申请系统。 在服务器配置里我们需要填写一个URL和Token,之前...
1 2 3 4 5 ... 20
收藏数 97,473
精华内容 38,989
关键字:

微信开发 服务器要求