<?php
/**
* wechat php test
*/php
//define your token
//定義TOKEN密鑰
define("TOKEN", "weixin");
//實例化微信對象
$wechatObj = new wechatCallbackapiTest();
//驗證成功後,註釋掉valid方法
$wechatObj->valid();
//開啓自動回覆功能
$wechatObj->responseMsg();git
//定義類文件
class wechatCallbackapiTest
{
//實現valid驗證方法:實現對接微信公衆平臺
public function valid()
{
//接收隨機字符串
$echoStr = $_GET["echostr"];算法
//valid signature , option
//進行用戶數字簽名驗證
if($this->checkSignature()){
//若是成功,則返回接收到的隨機字符串
echo $echoStr;
//退出
exit;
}
}json
//定義自動回覆功能
public function responseMsg()
{
//get post data, May be due to the different environments
//接收用戶端發送過來的XML數據
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];api
//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);
//接收用戶消息類型
$msgType = $postObj->MsgType;
//定義$longitude與$latitude接收用戶發送的經緯度信息
$latitude = $postObj->Location_X;
$longitude = $postObj->Location_Y;
//時間戳
$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>";
//音樂發送模板
$musicTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>
</xml>";
//圖文發送模板
$newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>%s</ArticleCount>
%s
</xml>";
if($msgType=='text') {
//判斷用戶發送關鍵詞是否爲空
if(!empty( $keyword ))
{
if($keyword=='文本') {
//回覆類型,若是爲「text」,表明文本類型
$msgType = "text";
//回覆內容
$contentStr = "您發送的是文本消息";
//格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//把XML數據返回給手機端
echo $resultStr;
} elseif($keyword=='?' || $keyword=='?') {
//定義回覆類型
$msgType=='text';
//回覆內容
$contentStr = "【1】特種服務號碼\n【2】通信服務號碼\n【3】銀行服務號碼\n您能夠經過輸入【】方括號的編號獲取內容哦!";
//格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//返回數據到微信客戶端
echo $resultStr;
} elseif ($keyword=='1') {
//定義回覆類型
$msgType=='text';
//回覆內容
$contentStr = "經常使用特種服務號碼:\n匪警:110\n火警:119";
//格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//返回數據到微信客戶端
echo $resultStr;
} elseif ($keyword=='2') {
//定義回覆類型
$msgType=='text';
//回覆內容
$contentStr = "經常使用通信服務號碼:\n中移動:10086\n中電信:10000";
//格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//返回數據到微信客戶端
echo $resultStr;
} elseif ($keyword=='3') {
//定義回覆類型
$msgType=='text';
//回覆內容
$contentStr = "經常使用銀行服務號碼:\n工商銀行:95588\n建設銀行:95533";
//格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//返回數據到微信客戶端
echo $resultStr;
} elseif ($keyword=='音樂') {
//定義回覆類型
$msgType='music';
//定義音樂標題
$title = '冰雪奇緣';
//定義音樂描述
$desc = '《冰雪奇緣》原聲大碟...';
//定義音樂連接
$url = 'http://czbk888.duapp.com/music.mp3';
//定義高清音樂連接
$hqurl = 'http://czbk888.duapp.com/music.mp3';
//格式化字符串
$resultStr = sprintf($musicTpl, $fromUsername, $toUsername, $time, $msgType, $title, $desc, $url, $hqurl);
//返回XML數據到微信客戶端
echo $resultStr;
} elseif ($keyword=='圖文') {
//定義回覆類型
$msgType='news';
//定義返回圖文數量
$count = 4;
//組裝Articles節點信息
$str = '<Articles>';
for($i=1;$i<=$count;$i++) {
$str .= "<item>
<Title><![CDATA[微信開發教程{$i}]]></Title>
<Description><![CDATA[傳智播客微信開發教程...]]></Description>
<PicUrl><![CDATA[http://czbk888.duapp.com/images/{$i}.jpg]]></PicUrl>
<Url><![CDATA[http://www.itcast.cn]]></Url>
</item>";
}
$str .= '</Articles>';
//格式化字符串
$resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, $msgType, $count, $str);
//輸出XML數據並返回到微信客戶端
echo $resultStr;
} else {
//定義回覆類型
$msgType='text';
//定義url連接操做
$url = "http://www.tuling123.com/openapi/api?key=9009fc44f168cfc7055c8a469821ce9b&info={$keyword}";
//模擬發送http中的get請求
$str = file_get_contents($url);
//格式化json字符串爲對象或數組
$json = json_decode($str);
//定義回覆內容
$contentStr = $json->text;
//格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//返回數據到微信客戶端
echo $resultStr;
}
}else{
echo "Input something...";
}
} elseif($msgType=='image') {
//回覆類型,若是爲「text」,表明文本類型
$msgType = "text";
//回覆內容
$contentStr = "您發送的是圖片消息";
//格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//把XML數據返回給手機端
echo $resultStr;
} elseif($msgType=='location') {
//回覆類型
$msgType='text';
//定義接口請求地址
$url = "http://api.map.baidu.com/telematics/v3/reverseGeocoding?location={$longitude},{$latitude}&coord_type=gcj02&output=json&ak=2pReiGS2nQV9Gi7tslO9r2UZ";
//模擬http中的get請求
$str = file_get_contents($url);
//轉化json格式數據爲數組或對象
$json = json_decode($str);
//回覆內容
$contentStr = "您發送的是地理位置信息,您的位置:{$json->description}";
//格式化字符串
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//返回XML數據到微信客戶端
echo $resultStr;
}數組
}else {
echo "";
exit;
}
}
//定義checkSignature
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 ){
return true;
}else{
return false;
}
}
}微信
?>微信開發