美文网首页
一起学微信公众平台开发(零)

一起学微信公众平台开发(零)

作者: 空船行者 | 来源:发表于2016-03-23 11:41 被阅读0次

    写在前面

    一个客户需要做微信公众平台开发,而自己以前没有研究过,只做过订阅号,未涉及应用开发,于是简单了解了一下,大概知道,只要会PHP+MYSQL,加上XML、JSON、HTML等等,就能够实现了。

    所以我在这里记录下自己的学习过程,给新学习的朋友一个参考,也给自己留个记录。

    环境

    1、需要一个微信公众平台账号,经过认证的,当然认证之前,可以用测试账号来做,点这里获得测试账号:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    2、需要一台服务器,能够部署你的WEB应用,我使用的是阿里云服务器

    3、需要一个域名(我现在还不确定是不是必须有,但没有的话测试用不了),而且这个域名必须可以访问(也就是备案了的),当然如果你是国外的空间或服务器,可以不备案直接解析。我因为域名还没备案完成,我在一些免费的二级域名网站申请了一个解析到我服务器,速度很快,几乎是瞬间就完成解析了。我用的是这家的(http://dns.c3z.cn/control.php#),不是广告哦。

    开始配置

    我们以测试账号为例进行配置

    关于服务器WEB应用环境如何配置我不说了,可以自己百度。

    关于各个参数怎么填写,我且一个一个道来:

    1、测试号信息:这里面的东西是随机生成的,不需要我们来填写,后边用得到。

    2、接口配置信息:这里需要我们自己填写,在这之前要做一个准备工作,把下面代码复制后,另存为wx_sample.php,

    <?php
    /**
      * wechat php test
      */
    
    //define your token
    define("TOKEN", "weixin");
    $wechatObj = new wechatCallbackapiTest();
    $wechatObj->valid();
    
    class wechatCallbackapiTest
    {
        public function valid()
        {
            $echoStr = $_GET["echostr"];
            echo $echoStr;
            echo "<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好]]></Content></xml>";
            //valid signature , option
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
    
        public function responseMsg()
        {
            //get post data, May be due to the different environments
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    
            //extract post data
            if (!empty($postStr)){
                    
                    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                    $fromUsername = $postObj->FromUserName;
                    $toUsername = $postObj->ToUserName;
                    $keyword = trim($postObj->Content);
                    $time = time();
                    $textTpl = "<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Content><![CDATA[%s]]></Content>
                                <FuncFlag>0</FuncFlag>
                                </xml>";             
                    if(!empty( $keyword ))
                    {
                        $msgType = "text";
                        $contentStr = "Welcome to wechat world!";
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        echo $resultStr;
                    }else{
                        echo "Input something...";
                    }
    
            }else {
                echo "";
                exit;
            }
        }
            
        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;
            }
        }
    }
    
    ?>
    

    放到你的WEB目录下,确保可以通过公网访问。然后将URL设置如:http://123.123.123.123/wx_sample.php 即可。
    TOKEN项请填写“weixin”,这个是可以后期修改的。
    然后点击提交。
    提示配置成功,表示成功了,但如果提示配置失败,那么你要看一下代码是不是我上面那一串,因为微信配置时需要一个返回值,而如果你的代码没有返回值,微信会提示配置失败,这时候你要加上才行。
    我后来就遇到过这个问题,因为换了一个目录,导致配置失败,后来发现我只要在里边加上一句:
    $wechatObj = new wechatCallbackapiTest();
    $wechatObj->valid();//新增加的这句
    就OK了。
    当然后期你可以去掉。

    JS接口安全域名,填写我们前面申请的免费二级域名(当然你自己有备案好的域名更好啦)

    添加测试号二维码,拿你的手机扫码一下,关注即可,这样你就可以在订阅号列表中找到这个测试用的公众号,通过给公众号发送消息,来测试返回的结果。

    至此,环境配置基本完毕。

    Hello World!

    下一步我们尝试向公众号发送任意字符,返回一个"Hello world!"

    其实,说简单了,就像一个人抽了你一巴掌(用户在订阅号内向你发送任意内容),你回头踹了他一脚(你的程序回复一个“Hello World!”)

    这个工作可以由刚才我们的那个php文件来完成,他会首先接收来自微信的一个XML文件,里面包含了用户发给你的内容、类型等信息,你可以根据内容,回复一个XML给微信,微信将XML解析后发给用户。

    相应的源文件如下:
    可以点击这里下载:http://pan.baidu.com/s/1pKfkQEZ

    <?php
    /**
      * wechat php test
      */
    
    //define your token
    define("TOKEN", "weixin");
    $wechatObj = new wechatCallbackapiTest();
    $wechatObj->responseMsg();
    
    class wechatCallbackapiTest
    {
        public function valid()
        {
            $echoStr = $_GET["echostr"];
    
            //valid signature , option
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
    
        public function responseMsg()
        {
            //get post data, May be due to the different environments
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    
            //extract post data
            if (!empty($postStr)){
                    /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                       the best way is to check the validity of xml by yourself */
                    libxml_disable_entity_loader(true);
                    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                    $fromUsername = $postObj->FromUserName;
                    $toUsername = $postObj->ToUserName;
                    $keyword = trim($postObj->Content);
                    $time = time();
                    $textTpl = "<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Content><![CDATA[%s]]></Content>
                                <FuncFlag>0</FuncFlag>
                                </xml>";             
                    if(!empty( $keyword ))
                    {
                        $msgType = "text";
                        $contentStr = "Welcome to wechat world!";
                        
                        if($keyword == '1'){
                            $contentStr = "你输入的是1";
                        }elseif($keyword == '1'){
                            $contentStr = "你输入的是2";
                        }
                        
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        echo $resultStr;
                    }else{
                        echo "Input something...";
                    }
    
            }else {
                echo "";
                exit;
            }
        }
            
        private function checkSignature()
        {
            // you must define TOKEN by yourself
            if (!defined("TOKEN")) {
                throw new Exception('TOKEN is not defined!');
            }
            
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
                    
            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            // use SORT_STRING rule
            sort($tmpArr, SORT_STRING);
            $tmpStr = implode( $tmpArr );
            $tmpStr = sha1( $tmpStr );
            
            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }
    }
    
    ?>
    

    测试

    这时候我们可以开始测试了,向测试号发送任意字符,将回复“Welcome to wechat world!",发送数字1,回复"你输入的是1"

    OK,本节写完了。

    相关文章

      网友评论

          本文标题:一起学微信公众平台开发(零)

          本文链接:https://www.haomeiwen.com/subject/tzbllttx.html