Home >php教程 >PHP源码 >WeChat interface class

WeChat interface class

PHP中文网
PHP中文网Original
2016-08-22 10:13:321350browse


valid();
//开启自动回复功能
$wechatObj->responseMsg();


//定义类文件
class wechatCallbackapiTest
{
    //实现valid验证方法:实现对接微信公众平台
	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
        //接受用户端发送过来的xml数据
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      	//extract post data
        //判断xml数据是否为空
		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);
                //通过simplexml进行xml解析
              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                //接受微信的手机端
                $fromUsername = $postObj->FromUserName;
                //微信公众平台
                $toUsername = $postObj->ToUserName;
                //接受用户发送的关键词
                $keyword = trim($postObj->Content);
                //1.接受用户消息类型
                $msgType = $postObj -> MsgType;
                //时间戳
                $time = time();
                //文本发送模板
                $textTpl = "%s0"; 
                //////////////////////////////////////////////////////////////////////////////////
                //如果用户发送的是文本类型文件,执行以下
                if($msgType == 'text'){
                    if(!empty( $keyword ))
                    {
                        /*这是一个实例
                            //如果发送文本信息
                            $msgType = "text";
                            //回复内容
                            if($keyword == "李楠"){
                                $contentStr = "叫我干嘛";
                            }else{
                                $contentStr = "叫我干嘛";
                            }
                            //格式化xml模板,参数与上面的模板是一一对应的.fromUsername和头Username是相反的,只写带%s的
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

                            //将xml信息返回给客户端
                            echo $resultStr;
                        */
                       if($keyword == "?" || $keyword == "?"){
                            $msgType = "text";
                            $contentStr = "1.特种服务号码\n2.通讯服务号码";
                            $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                            echo $resultStr;
                       }elseif($keyword == 1){
                            $msgType = "text";
                            $contentStr = "1.匪警:110\n2.火警:119\n3.急救:120";
                            $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                            echo $resultStr;
                       }elseif($keyword == 2){
                            $msgType = "text";
                            $contentStr = "1.中国移动:10086\n2.中国联通:10010";
                            $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                            echo $resultStr;
                       }
                    }else{
                        echo "不能不说话";
                    }
                }
                ////////////////////////////////////////////////////////////////////////////////////
                //接受图片信息
                if($msgType == "image"){
                        //如果发送文本信息
                        $msgType = "text";
                        //回复内容
                        $contentStr = "你发送的是图片文件";
                        //格式化字符串
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        //将xml信息返回给客户端
                        echo $resultStr;
                }
                ////////////////////////////////////////////////////////////////////////////////////
                if($msgType == "voice"){
                        //如果发送文本信息
                        $msgType = "text";
                        //回复内容
                        $contentStr = "你发送的是语音文件";
                        //格式化字符串
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        //将xml信息返回给客户端
                        echo $resultStr;
                }
                ////////////////////////////////////////////////////////////////////////////////////
                if($msgType == "video"){
                        //如果发送文本信息
                        $msgType = "text";
                        //回复内容
                        $contentStr = "你发送的是视频文件";
                        //格式化字符串
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        //将xml信息返回给客户端
                        echo $resultStr;
                }
                ////////////////////////////////////////////////////////////////////////////////////
                if($msgType == "shortvideo"){
                        //如果发送文本信息
                        $msgType = "text";
                        //回复内容
                        $contentStr = "你发送的是小视频文件";
                        //格式化字符串
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        //将xml信息返回给客户端
                        echo $resultStr;
                }
                ////////////////////////////////////////////////////////////////////////////////////
                if($msgType == "location"){
                        //如果发送文本信息
                        $msgType = "text";
                        //回复内容
                        $contentStr = "你发送的是地理位置文件";
                        //格式化字符串
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        //将xml信息返回给客户端
                        echo $resultStr;
                }
                ////////////////////////////////////////////////////////////////////////////////////
                if($msgType == "link"){
                        //如果发送文本信息
                        $msgType = "text";
                        //回复内容
                        $contentStr = "你发送的是连接文件";
                        //格式化字符串
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        //将xml信息返回给客户端
                        echo $resultStr;
                }
                ////////////////////////////////////////////////////////////////////////////////////
                /*
                //判断用户发送关键词是否为空           
				
                if(!empty( $keyword ))
                {
                    //如果发送文本信息
              		$msgType = "text";
                    //回复内容
                	$contentStr = "大家好,我是hero";
                    //格式化字符串
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    //将xml信息返回给客户端
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }
                */
        }else {
        	echo "";
        	exit;
        }
    }
		
	private function checkSignature()
	{
        // you must define TOKEN by yourself
        //判断是否定义了TOKEN,如果没有就抛出一个异常
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }
        
        $signature = $_GET["signature"];//接受微信加密签名
        $timestamp = $_GET["timestamp"];//接受时间戳
        $nonce = $_GET["nonce"];//接受随机数
        		
		$token = TOKEN;//把TOKEN常量赋值给$token
        //把相关参数组装成数组
		$tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
        //排序
		sort($tmpArr, SORT_STRING);
        //把排序后的数组转换成字符串
		$tmpStr = implode( $tmpArr );
        //通过哈希算法加密
		$tmpStr = sha1( $tmpStr );
		//与加密签名进行对比
		if( $tmpStr == $signature ){
            //相同返回true
			return true;
		}else{
            //不同返回false
			return false;
		}
	}
}

?>


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn