PHP微信开发——第二弹

  • 内容
  • 相关
<?php
/**
  * wechat php test
  */
//微信开发配置文件详细注释版

//define your token
    define("TOKEN", "weixin");
    $wechatObj = new wechatCallbackapiTest();//将第11行代码的一个类实例化;
    //$wechatObj->valid();//变量使用->访问类中的valid()方法,下文valid()方法为验证开发模式接口。这行作用就是验证接口,验证完可注释掉;
    $wechatObj->responseMsg();

class wechatCallbackapiTest//定义一个类,类为面向对象开发的封装方式;
{
public function valid()//定义一个公有的名为valid的方法,即验证接口的方法;
{
        $echoStr = $_GET["echostr"];//从微信用户端获取一个随机字符串赋予变量$echoStr;
        //valid signature , option
if($this->checkSignature()){
//访问checkSignature签名验证方法,若签名一致,输出变量$echoStr,完整验证配置接口的操作;
            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);//将$postStrl变量进行解析并赋予变量$postObj。simplexml_load_string()函数用于解析XML,参数SimpleXMLElement为新对象的类,LIBXML_NOCDATA表示将CDATA设置为文本节点,CDATA标签中的文本XML不进行解析。
                $fromUsername = $postObj->FromUserName;//将微信用户端的OpenID赋予变量$fromUsername;
                $toUsername = $postObj->ToUserName;//将公众号ID赋予变量$toUsername;
                $keyword = trim($postObj->Content);//将用户微信发来的文本内容去掉空格后赋予变量$keyword;
                $time = time();//将系统时间赋予变量$time;
                $Event = $postObj->Event;//这是一个事件获取;
                $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName><!--%s表示要转换成字符的数据类型,CDATA表示不转义-->
                            <FromUserName><![CDATA[%s]]></FromUserName><!--微信来源方-->
                            <CreateTime>%s</CreateTime><!--系统时间-->
                            <MsgType><![CDATA[%s]]></MsgType><!--回复微信的消息类型-->
                            <Content><![CDATA[%s]]></Content><!--回复微信的内容-->
                            <FuncFlag>0</FuncFlag><!--是否为星标微信-->
                            </xml>";    //构建XML格式的文本赋予变量$textTpl。注意XML中的格式为微信内容固定格式。
                            if($Event=="subscribe")//subscribe是收到订阅信息,Event是事件类型,subscribe(订阅)、unsubscribe(取消订阅)
                {
                    $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>";  
                            $msgType ="text";
                            $contentStr = "谢谢关注,你可以回复点什么";
     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;    
                    }///关注后自动回复文本消息
                            //switch($keyword)
                            //case "";             
                if(!empty( $keyword ))
                {
                      $msgType = "text";//回复文本信息类型为text型,变量类型为$msgType;
                    $contentStr = "报修,快递查询,饭卡挂失,失物招领,校园街景,新生报到,成绩查询";//$contentStr为回复的信息;
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);//sprintf()为变参函数,$textTpl由于有5个%s,需要5个变量进行赋值。此行代码为关键,sprintf()函数要深入理解。
                    echo $resultStr;//输出回复信息,即发送微信;
                }else{
                    echo "Input something...";//输入内容,此消息不会发送到微信端,只是测试时使用。
                }

        }else {
            echo "";//微信端没有消息时,回复为空,无意义,测试用;
            exit;//退出;
        }
    }
        
    private function checkSignature()//传说中的签名验证程序,此行建立私有方法验证签名,这个私有的checkSignature方法,被第18行代码调用,官方文档为加密/校验流程:将token,timestamp,nonce这三个参数进行字典序排序,将这三个参数字符串拼接成一个字符串进行shal加密,开发者获得加密后字符串可与signature对比,标示该请求来源于微信;
    {
        // you must define TOKEN by yourself
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }
        
        $signature = $_GET["signature"];//从用户端获取签名赋予变量$signature;
        $timestamp = $_GET["timestamp"];//从用户端获取时间戳赋予变量$timestamp;
        $nonce = $_GET["nonce"];//从用户端获取随机数赋予变量$nonce;
                
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);//建立数组变量$tmpArr;
        // use SORT_STRING rule
        sort($tmpArr, SORT_STRING);//新建名排序;
        $tmpStr = implode( $tmpArr );//字典排序;
        $tmpStr = sha1( $tmpStr );//shal加密;
        
        if( $tmpStr == $signature ){//$tmpStr与$signature变量同值,返回真,否则返回假;
            return true;
        }else{
            return false;
        }
    }
}

?>

 您阅读这篇文章共花了:

上一篇:大学——你一定要养成这五个好习惯

下一篇:HTML | 图片底部文字添加效果——css实现

本文标签:    

版权声明:本文依据CC-BY-NC-SA 3.0协议发布,若无特殊注明,本文皆为《fishyoung》原创,转载请保留文章出处。

本文链接:PHP微信开发——第二弹 - http://www.fishyoung.com/post-25.html