微信公共平台开发介绍

在尝试了几个小时之后,终于把这事搞定了。其实想法很简单,就是普通用户在关注公众后之后,输入一条消息,公众号能自动回复一条已经设计好的消息即可,其实也已经有很多网友做了这件事了,我就不在此大讲了,我碰到了问题竟然是测试代码的问题,所以我会把已经验证通过的php代码贴上来。(偷偷说一句,LZ不会php,倒是想用python写应用)


1、首先在BAE或SAE上搭建一个简单的应用。我是在BAE上搭的,貌似还0.4元/天,呃!应用语言倒是多样化,java-web,python-web,php-web,node-js都可以。在我这次验证中,选择了php-web。下图为添加部署后的列表:

微信公共平台开发介绍_第1张图片

我是选用了git方式,所以在windows本地用git客户端首先将服务端代码pull下来,然后修改index.php文件,此文件用来帮助微信平台验证服务器有效性,代码如下:

<?php
// 注意要将***改成你自己的token
define("TOKEN", "***");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
	public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
        	echo $echoStr;
        	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;
		}
	}
}

?>

2、接下来在微信开发者中心,设置好BAE中已经设置好的URL和index.php中的token,验证通过后就可以正式开发了

微信公共平台开发介绍_第2张图片


3、接下来上传真正的业务代码到BAE服务端,起名也可叫index.php,可以覆盖先前的index.php。新内容如下:

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "cshitest");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->responseMsg();
//$wechatObj->valid();

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)){
                
                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $RX_TYPE = trim($postObj->MsgType);

                switch($RX_TYPE)
                {
                    case "text":
                        $resultStr = $this->handleText($postObj);
                        break;
                    case "event":
                        $resultStr = $this->handleEvent($postObj);
                        break;
                    default:
                        $resultStr = "Unknow msg type: ".$RX_TYPE;
                        break;
                }
                echo $resultStr;
        }else {
            echo "";
            exit;
        }
    }

    public function handleText($postObj)
    {
        $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";

            if($keyword=="你好"){
                $contentStr = "hello";
            }elseif($keyword=="苏州"){
                $contentStr = "上有天堂,下有苏杭";
            }else{
                $contentStr = "感谢您关注【卓锦苏州】 微信号:zhuojinsz";
            }
            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
            echo $resultStr;
        }else{
            echo "Input something...";
        }
    }

    public function handleEvent($object)
    {
        $contentStr = "";
        switch ($object->Event)
        {
            case "subscribe":
                $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";
                break;
            default :
                $contentStr = "Unknow Event: ".$object->Event;
                break;
        }
        $resultStr = $this->responseText($object, $contentStr);
        return $resultStr;
    }
    
    public function responseText($object, $content, $flag=0)
    {
        $textTpl = "<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                    <FuncFlag>%d</FuncFlag>
                    </xml>";
        $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
        return $resultStr;
    }


    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;
        }
    }
}

?>

注意成功用git commit之后,要重新发布下应用。


4、用微信登陆,关注自己创建的微信号,当输入“你好”时,返回hello,即成功了!


参考链接

http://www1.phpchina.com/archives/view-43385-1.html

http://blog.csdn.net/zxianyong/article/details/9298963

http://www.jb51.net/article/41750.htm

http://www.php100.com/html/php/api/2013/0909/6115.html

你可能感兴趣的:(微信公共平台开发介绍)