• 微信公众号开发(一)服务器及接口的配置 关于微信公众号中的订阅号和服务...在开始微信号开发之前需要准备好两样东西,1、需要一个测试号,2、需要一个拥有域名服务器,下面将分别介绍怎样获取这两样东西。 1、...

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

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

     

    在开始微信号开发之前需要准备好两样东西,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网页授权

    展开全文
  • 微信小程序在生产环境下如果没有配置合法域名,是不能正常访问的,那就需要把服务器域名添加到微信小程序后台管理系统的服务器域名白名单里面。那么接下来本节就来介绍一下配置小程序添加合法域名的步骤方法,具体...

    微信小程序开发过程中,微信小程序只要有网络请求就必定要用到服务器接口,这样的话就需要在微信小程序管理平台里面添加服务器的域名,而且添加的这个域名一定是合法有效的域名,不然就不会设置成功的。

    微信小程序在生产环境下如果没有配置合法域名,是不能正常访问的,那就需要把服务器域名添加到微信小程序后台管理系统的服务器域名白名单里面。那么接下来本节就来介绍一下配置小程序添加合法域名的步骤方法,具体步骤如下所示。

    一、打开微信公众平台官网,登录微信小程序账号,然后进入微信小程序管理主界面。

    二、在微信小程序主界面的左侧菜单栏里面找到“</>开发”选项。

    三、在“</>开发”模块,找到“开发设置”选项,下拉找到“服务器域名”模块。

    四、首次设置服务器域名的话,会有一个“开始配置”按钮,点击进入。

    五、进入配置服务器信息之前需要先进行身份确认,需要管理员扫码进行身份认证。

     

    六、管理员身份认证之后,就进入到“配置服务器信息”模块,一般设置第一个选项“request合法域名”里面的域名即可,如果有特殊需求或者根据实际情况来设置下面几个选项的合法域名设置。

    七、填写完域名信息之后,点击下面“保存并提及”按钮即可设置完成。

    八、设置完成小程序服务器域名之后,如果想修改服务器域名或者删除服务器域名,依然在“</>开发”模块进入,然后进入服务器域名设置部分进行操作设置即可。

    以上就是本章全部内容,欢迎关注三掌柜的微信公众号“iOS开发by三掌柜”,三掌柜的新浪微博“三掌柜666”,欢迎关注!

    展开全文
  • 昨天跟一个朋友吃饭,谈到微信公众号的事情,说到帮他做一个微信公众号,于是今天在折腾这个,在微信页面添加服务器配置之后,点提交,自己搭建的web服务器收到了微信转发过来的请求,然后按要求返回传过来的随机...
    昨天跟朋友谈到微信公众号的事情,说到帮他做一个微信公众号,于是今天在折腾这个,在微信页面添加服务器配置之后,点提交,自己搭建的web服务器收到了微信转发过来的请求,然后按要求返回传过来的随机字符串之后,微信页面提示请求URL超时,于是就觉得很奇怪,服务器已经接收了请求了啊,也返回随机字符串。在网上搜了一下可能是ip变化的原因,因为用的自己电脑做的外网映射,用的nat123工具,可能是这个原因,多提交几次就成功了,只是不稳定而已,前期自己开发测试一下够了。
    
    展开全文
  • 下图是配置完成后的样子,后面给大家详细介绍每一步的步骤:下图为微信公众号开发验证机制:由用户发送请求给微信服务器,微信服务器根据地址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一样,消息加解密密匙可以点击随即获取,加解密方式选明文模式

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

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

    展开全文
  • 服务器域名设置” 添加 api工厂的接口域名,否则无法获取到数据; 配置服务器信息 这里有 4 个类型的域名可以进行设置: request : 小程序调用接口 socket: websocket 链接地址 upload:上传文件...
        

    小程序中使用api工厂的接口,需要在您的小程序的后台,左侧菜单,“开发” --> “开发设置” --> “服务器域名设置” 添加 api工厂的接口域名,否则无法获取到数据;

    13379300-d9cbd4f69ce78e1e.png
    配置服务器信息

    这里有 4 个类型的域名可以进行设置:

    request : 小程序调用接口

    socket: websocket 链接地址

    upload:上传文件地址

    downloadFile:下载文件地址

    一般来说,只要设置 request 域名即可,如果有使用 api工厂的上传文件接口,需要在 upload 域名那里也添加 api.it120.cc,如果有调用小程序的下载文件api,那么你也需要添加 downloadFile 的域名;

    这里的域名可以添加多个,并不是只能填写一个,例如上图的 downloadFile ,我们就举例添加了 3 个域名;

    这里的域名修改了以后,需要重启您的开发工具才能生效!
    如果是手机预览,请先杀掉 微信 / 小程序 进程后再重新打开小程序!

    展开全文
  • 由于项目需要微信公众号的开发,弄了老半天,发现也不是那么难弄。对于微信公众号开发,首先要有开发者权限然后进行基本的配置。登录进微信公众号平台,首页最下面有个基本配置:进入基本配置后,会看到两个栏目,一...
  • 微信开发的,必不可少的都会涉及到微信网页授权,来获取用户信息的功能。想要实现公众号通过微信网页授权机制,来获取用户基本信息,必须先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权...
  • 微信公众平台的开发目前可在三个地方配置域名域名所起到的作用不尽相同,本篇文章将讲解微信公众平台如何配置、以及配置后的域名各有什么样的作用(注:文章中的图片来源于个人的微信订阅号、接口测试号)。...
  • 申请服务器资源 想要进行微信开发,少不了后台服务器端程序的开发,那么我们首先就要申请服务器资源。目前有很多云服务器可选,比如新浪的sae,这里就以sae为例来讲解。 1. 打开http://sae.sina.com.cn/登录。 2....
  • 域名和虚拟主机可以使用的情况下我们要完成三步:填写服务器配置。验证服务器地址的有效性。依据接口实现业务逻辑。(暂时忽略)填写服务器配置:我们登录微信公众平台之后,找到开发者工具,打开公众平台测试账号...
  •  各位肯定都知道,做微信开发,我们的开发服务器需要和微信服务器做交互,我们需要准备一台放置在公网的服务器,能够使得我们的服务器可以正常访问微信服务器,并且微信服务器也需要可以正常访问我们的开发服务器。...
  • 关于ThinkPHP框架开发微信公众号在微信后台配置服务器URL提示Token验证失败的解决方案
  • 在开始微信号开发之前需要准备好两样东西,1、一个测试号,2、需要一个拥有域名(有公网ip也可以)的服务器,下面将分别介绍怎样获取这两样东西。 1、测试号 点击此链接测试号登录可直接用微信扫一扫注册一个测试号 ...
  • 下面我就从头一步一步的讲述下搭建微信小程序服务器的整个过程,希望可以帮到你。 第一步:申请服务器域名 申请服务器:一般公司都会有自己的服务器,但是如果你是自己私下学习或者开发的话,当然有自己的服务器...
  • 如果你只是简单使用微信公众号,发送推文等简单需求,你就不需要的配置自己的开发服务器微信公众号平台功能十分强大,不懂技术的用户也可以简单开发一个自己公众号。如果你有像成绩推送等需求,你就需要知道用户的...
  • 开发设置,找到服务器域名 开始配置,把你的域名填上就好了。 这样就配好服务器域名了。 注意,这里配置域名时都是以https://开头的,所以要把网站升级为https,具体怎么操作,找百度,网上有很多...
  • [前言]:因为自己第一次配置开发者模式是2015年底,当时是SAE的应用,现在申请了一个阿里云的服务器,根据官方文档尝试一晚上无果,自己又找资料成功完成启用微信公众号后台开发者模式的服务器设置。一、前提1、购买...
  • 问题:确认项目正常运行,创建菜单,微信支付模块等无异常。消息被动,关注提示等异常。...开发 =》接口权限=》网页授权=》业务域名 ===》下载授权验证文件 并上传至web服务器 转载于:https://www.cnblogs.com/...
1 2 3 4 5 ... 20
收藏数 4,469
精华内容 1,787