預備篇
1、申請微信公衆賬號:
微信公衆平臺地址:https://mp.weixin.qq.com/
微信開發官方說明文檔:http://mp.weixin.qq.com/wiki/home/
微信開發測試公衆賬號申請:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login (打開後點擊登錄,用自己的微信號掃一掃就會發放一個相應的測試公衆賬號,此賬號擁有所有接口權限,僅供程序員測試使用)
2、網站空間
如果自己有的話就忽略,沒有的可以使用阿里雲,領券地址:死戳這裏
配置篇
1、代碼上傳
將下列代碼保存到一個index.php的文件中,並將此文件示例文件上傳到SAE代碼管理庫中(代碼下載)
<?php
/**
* 作者:smalle
* 網址:http://blog.csdn.net/oldinaction
* 微信公衆號:smallelife
*/
//定義 TOKEN(要與開發者中心配置的TOKEN一致)
define("TOKEN", "smalle");
//實例化對象
$wechatObj = new wechatCallbackapiTest();
//調用函數
if (isset($_GET['echostr'])) {
$wechatObj->valid();
}else{
$wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
// $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; // 虛擬機可能禁止register_globals導致無法獲取body數據
$postStr = file_get_contents("php://input");
if (!empty($postStr)){
libxml_disable_entity_loader(true);//安全防護
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$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>";
if(!empty( $keyword ))
{
$msgType = "text";
//用戶給公衆號發消息後,公衆號被動(自動)回覆的消息內容
$contentStr = "歡迎來到微信公衆平臺開發世界!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
private function checkSignature()
{
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$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 );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
2、開發者中心服務器配置
進入公衆平臺後點擊開發者中心,在服務器配置欄按如下圖進行配置(URL改爲自己SAE項目的URL地址),配置完成後保存並點擊啓用(注意:一定要先上傳以上代碼到空間再來配置,否則無法通過驗證就提示配置失敗)
3、示例結果展示
上面的代碼實現的是一個發送任意文本消息後,公衆號都會回覆一句“歡迎來到微信公衆平臺開發世界!”
4、代碼結構分析
- 第9行【define("TOKEN", "smalle");】:定義了一個TOKEN(令牌),其值與在開發者中心服務器配置的Token要保持一致。
- 第11行【$wechatObj = new wechatCallbackapiTest();】 :示例化一個wechatCallbackapiTest類對象,wechatCallbackapiTest類中包含三個函數,valid()、responseMsg()迴應消息、checkSignature()檢查簽名。我們剛開始需要關注的就是responseMsg()中的內容。
- 第40-51行【$textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName>......</xml>";】:是我們自己的服務器發給微信服務器的一個xml數據格式,裏面的%s在第56行中動態附加。
- 第56行【$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);】:第一個參數$textTpl指的即時第40行定義的變量,後面的參數依次是上述xml數據格式中的%s。
收發消息原理
1、文字概述
當用戶發送消息給公衆號時(或某些特定的用戶操作引發的事件推送時),會產生一個POST請求,微信服務器將POST消息的XML數據包到開發者填寫的URL上,開發者可以在響應包(Get)中返回特定XML結構,來對該消息進行響應(現支持回覆文本、圖片、圖文、語音、視頻、音樂)。
2、接收消息XML數據包介紹
以接收文本消息的XML數據包爲例。接收文本消息時XML數據格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
相關參數:
參數 描述
ToUserName 開發者微信號
FromUserName 發送方帳號(一個OpenID)
CreateTime 消息創建時間 (整型)
MsgType 消息類型(text)
Content 文本消息內容
MsgId 消息id,64位整型
3、被動回覆消息XML數據包介紹
以被動回覆文本消息的XML數據包爲例。回覆文本消息時XML數據格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
相關參數:
參數 是否必須 描述
ToUserName 是 接收方帳號(收到的OpenID)
FromUserName 是 開發者微信號
CreateTime 是 消息創建時間 (整型)
MsgType 是 text
Content 是 回覆的消息內容(換行:在content中能夠換行,微信客戶端就支持換行顯示)
4、圖解
微信用戶給公衆號發送一條"this is a test"消息,微信服務器和我的服務器之間以xml格式在後臺進行數據傳輸,最終將"你好"返回給用戶。
======================================================================
關注【Smalle】【微信公衆號:smallelife】 捐贈【Smalle】【微信公衆號:smallelife】
關注就有豪禮相送哦,源碼、工具、文檔應有盡有 你的掃碼便是我前進的動力,掃碼、掃碼、掃碼
======================================================================