微信公众平台 验证URL及简单设置
加密/校验流程如下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
<?php class Weixin extends My_Controller { public function __construct() { parent::__construct(); define(\'TOKEN\',\'123456\'); //定义常量 } public function test() { header("Content-type:text/html;charset=utf-8"); if (!isset($_GET[\'echostr\'])) { $this->responseMsg(); } else { $this->valid(); } } public function valid() { $echostr = $_GET["echostr"]; if($this->check()){ header("Content-type:text"); ob_clean(); echo $echostr; //开发者模式接收到$echostr,再输出回去 exit; } } public function check() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); //排序 $tmpStr = implode( $tmpArr ); //数组变成字符串 $tmpStr = sha1( $tmpStr ); //sha1加密 if( $tmpStr == $signature ){ return true; }else{ return false; } } public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_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->receiveText($postObj); break; case "event": $resultStr = $this->receiveEvent($postObj); break; default: $resultStr = ""; break; } echo $resultStr; }else { echo ""; exit; } } private function receiveText($object) { $funcFlag = 0; $contentStr = "你发送的内容为:".$object->Content; $resultStr = $this->transmitText($object, $contentStr, $funcFlag); return $resultStr; } private function receiveEvent($object) { $contentStr = ""; switch ($object->Event) { case "subscribe": $contentStr = "欢迎关注逍游"; case "unsubscribe": break; case "CLICK": switch ($object->EventKey) { case "company": $contentStr[] = array("Title" =>"公司简介", "Description" =>"逍游提供好玩的手游", "PicUrl" =>"http://gameapi.xiaoyou-game.com/images/example.jpg", "Url" =>"http://xiaoyou-game.com"); break; case "game": $contentStr[] = array("Title" =>"星座召唤", "Description" =>"八十八星座来袭,你是什么座?", "PicUrl" =>"http://gameapi.xiaoyou-game.com/images/example.jpg", "Url" =>"http://xzzh.xiaoyou-game.com"); break; case "dhm": $contentStr[] = array("Title" =>"礼包兑换码", "Description" =>"快点击领取游戏礼包兑换码吧~", "PicUrl" =>"http://gameapi.xiaoyou-game.com/images/example.jpg", "Url" =>"http://xzzh.xiaoyou-game.com/web/list/lbdhm.shtml"); break; default: $contentStr[] = array("Title" =>"默认菜单回复", "Description" =>"您正在使用的是自定义菜单测试接口", "PicUrl" =>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"weixin://addfriend/pondbaystudio"); break; } break; default: break; } if (is_array($contentStr)){ $resultStr = $this->transmitNews($object, $contentStr); }else{ $resultStr = $this->transmitText($object, $contentStr); } return $resultStr; } private function transmitText($object, $content, $funcFlag = 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, $funcFlag); return $resultStr; } private function transmitNews($object, $arr_item, $funcFlag = 0) { //首条标题28字,其他标题39字 if(!is_array($arr_item)) return; $itemTpl = " <item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item> "; $item_str = ""; foreach ($arr_item as $item) $item_str .= sprintf($itemTpl, $item[\'Title\'], $item[\'Description\'], $item[\'PicUrl\'], $item[\'Url\']); $newsTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <Content><![CDATA[]]></Content> <ArticleCount>%s</ArticleCount> <Articles> $item_str</Articles> <FuncFlag>%s</FuncFlag> </xml>"; $resultStr = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item), $funcFlag); return $resultStr; } }