为了方便学习,我将方倍工作室的一个简单的代码段进行了详细的注释,里边能够实现接收到用户发送的“?”,然后回复给用户一个当前时间。
功能简单,但里边涉及了非常常见的一些微信应用开发的基础知识,供大家参考。
由于水平有限,注释内容难免有错误,还望大家见谅!
<?php
/*
方倍工作室 http://www.cnblogs.com/txw1958/
CopyRight 2013 www.doucube.com All Rights Reserved
*/
define("TOKEN", "weixin"); //定义常量
$wechatObj = new wechatCallbackapiTest();//实例化类
if (isset($_GET['echostr'])) { //如果随机字符串存在
$wechatObj->valid(); //执行wechatObj类下的valid函数
}else{
$wechatObj->responseMsg(); //如果未得到随机字符串,执行wechatObj类下的responseMsg函数
}
class wechatCallbackapiTest //定义类
{
public function valid() //定义valid函数
{
$echoStr = $_GET["echostr"]; //定义变量$echoStr 为获得的字符串
if($this->checkSignature()){ //调用当前类里的chekSignature函数
echo $echoStr; //输出echoStr的值
exit;
}
}
private function checkSignature() //定义checkSignature函数
{
$signature = $_GET["signature"]; //定义变量signature为获得的signature
$timestamp = $_GET["timestamp"]; //获取时间戳
$nonce = $_GET["nonce"]; //获取随机数
$token = TOKEN; //获得token
$tmpArr = array($token, $timestamp, $nonce);//定义数组tmpArr包含token值、时间戳、随机数
sort($tmpArr, SORT_STRING); //对数组进行升序排列
$tmpStr = implode( $tmpArr ); //将数组组合为字符串
$tmpStr = sha1( $tmpStr ); //计算字符串的sha1散列
if( $tmpStr == $signature ){ //如果计算的散列与获取的加密签名一致
return true; //返回真
}else{
return false; //不一致,返回假
}
}
public function responseMsg() //定义函数 responseMsg
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //首先接收上述原始POST数据
if (!empty($postStr)){ //如果接收到的数据不为空
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); //将数据载入对象中,对象名为SimpleXMLElement,将CDATA合并为文本节点
$fromUsername = $postObj->FromUserName; //取得XML数据包中FromUserName的值,赋给变量fromUsername
$toUsername = $postObj->ToUserName; //取得XML数据包中ToUsername的值,赋给变量toUsername
$keyword = trim($postObj->Content); //取得XML数据包中content的值,并移除字符串两侧的值
$time = time(); //取得XML数据包中的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>";//将变量依次赋给新的XML变量textTpl,注意里边将to和from调换 为什么多个%s?
if($keyword == "?" || $keyword == "?") //判断用户发送的关键词是不是问号
{
$msgType = "text"; //数据类型为文本方式text
$contentStr = date("Y-m-d H:i:s",time()); //回复的内为未当前时间
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); //sprintf是把前边字符串里的%作为参数传递,第一个textTpl是前边定义的一串xml,接下来5个参数是要填充进XML中进行替换的内容
echo $resultStr; //输出XML,这时候微信服务器就会获得结果,并展示给用户
}
}else{ //如果接收到的数据是空的
echo ""; //返回一个空值即可
exit;
}
}
}
?>
完整的代码下载链接:http://pan.baidu.com/s/1c1cjDKW
网友评论