最近一個月都在寫Android NDK開發之旅 , 從C語言基礎到JNI再到NDK , 一路寫下來 , 都是在寫C代碼 , 有些枯燥乏味 , 故新開一個系列微信開發系列 。
前言
微信是一個非常好的產品 , 幾億人用的產品 , 依托于微信的產品更加多 , 如多如牛毛的微信公眾號 , 有各類公眾號應用 , O2O 、外賣、企業官網 等等 。微信開發主要由后端與前端組合開發, 本系列使用到的技術棧是,html5 + css + javascript + php 。
微信開發模式
做微信開發的時候 , 需要一個公眾號帳號 , 個人的話 , 目前只能申請訂閱號 ,需要實名認證 。
基本配置
注冊完微信公眾平臺帳號,在微信公眾平臺左下角 , 找到開發,進行基本配置
配置服務器環境
點擊修改配置
在修改配置頁面 ,可以看到接入指南
進入接入指南
下載PHP示例代碼
修改代碼
修改完之后 , 上傳到服務器。
微信公眾平臺,服務器配置
配置完成 , 點擊啟用
啟動成功之后 , 這樣我們的微信配置服務器就完成了 。
修改服務器端代碼
將.php文件中的驗證代碼注釋掉 , 調用responseMsg()方法
//define your token
define("TOKEN", "zenoWecaht");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();
$wechatObj->responseMsg();
微信消息響應機制
響應代碼分析
從responseMsg()
這個方法名稱就可以看出 , 這個是響應消息的一個方法 , 將微信服務器傳遞過來的消息進行解析 , 并進行處理 , 然后按照一定的格式返回 。
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);
$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 = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
從上述代碼可以看出 , $keyword
這個變量就是微信服務器傳給我們用戶輸入的內容的值了 。我們可以將他進行一些改造 。
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);
$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 ))
{
if($keyword == "zeno"){
$contentStr = "簡單的微信開發";
}else{
$contentStr = "sorry ! 未能識別您的指令";
}
$msgType = "text";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
我們自定義了一個指令消息 , 當用戶在聊天界面輸入zeno
就會返回簡單的微信開發
, 我們通過簡單的字符指令進行判斷 , 然后返回響應的結果 。
響應代碼分析
得到微信傳遞過來的消息對象,解析xml格式。
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
得到消息解析的內容。
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
構建響應消息的模版,$textTpl
是微信消息響應的消息格式 , 按照這個模版 , 然后將
$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 ))
{
if($keyword == "zeno"){
$contentStr = "簡單的微信開發";
}else{
$contentStr = "sorry ! 未能識別您的指令";
}
$msgType = "text";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
結語
微信開發結合了服務器端開發前端開發 , 微信開發本身比較簡單 , 就是微信提供的一些接口的調用 , 復雜之處在于 , 在微信外部 , 也就是我們服務器上搭建的web系統 , 和一般的web應用開發沒什么區別 。 微信開發系列 , 屬于閑暇之作 , 不定期更新 。