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

2016-03-23  本文已影响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,本节写完了。

上一篇下一篇

猜你喜欢

热点阅读