測試結果圖
零、需要的知識
1、php基礎知識和常用函數
2、XML格式和php對XML的處理
3、php面向對象相關知識
4、擁有服務器並配置好php所需運行的環境
一、開發前準備工作
1、註冊微信公共平臺賬號,然後成爲開發者,網址:https://mp.weixin.qq.com/
2、註冊之後當然要創建一個公衆號了,有三種(訂閱號,服務號,企業號),本人選擇的是訂閱號
二、稍作修改
1、訂閱號創建之後就可以做一些小事情了,比如別人關注之後,就可以羣發一篇圖文的文章了,如下圖所示
2、然後還有其他的一些功能,自定義菜單啊,按關鍵字回覆消息啊,什麼的,都是操作性,看一遍就會了的東西
3、對公衆號的資料稍作修改,完善一下,如下圖所示,這是我的公衆號設置
4、開發者驗證
就是微信服務器發送加密的數據給你指定的服務器,你正確的響應,就可以驗證開發者了,這樣證明你擁有服務器,知道如何處理微信服務器給你發的數據和正確發送xml數據返回給微信服務器
下面是微信官方的php演示程序,本人修改了TOKEN,把它放在服務器指定文件夾下即可,當然你的服務器得正在跑着php解釋程序和apache或nginx等
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "jtahstu");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;//這裏你把它正確輸出了,就完成了開發者驗證
exit;
}
}
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)){
$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;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
5、其他的自己看看吧,講重點
三、動真格的了,正式開發了
1、首先你得有個服務器,最好有個數據庫,然後你就可以處理用戶發送的消息了,這裏的消息有文字,圖片,視頻,地理位置等等,本人恰巧有阿里雲服務器,來配置下服務器信息
解釋一下,url是你處理用戶消息的php腳本,這是我的目錄;第二個Token是一個自定義的祕鑰,下面的是一個消息祕鑰,隨機生成即可;消息加密方式直接就採用明文吧,實際上這個會很容易被攔截,實用的話還是選安全模式爲好
2、到這裏用戶就可以發送消息給服務器,然後服務器也能接收到數據了,下面就是返回數據。
下面代碼去掉了驗證部分,只保留了回覆消息得函數
回覆不同類型的消息,得按不同的xml格式,這裏返回的都是text,其他的請參考官方文檔
<?php
// define your token
define ( "TOKEN", "jtahstu" );
$wechatObj = new wechatCallbackapiTest ();
$wechatObj->responseMsg (); // 調用回覆消息的函數
class wechatCallbackapiTest {
public function responseMsg() {
// get post data, May be due to the different environments
$postStr = $GLOBALS ["HTTP_RAW_POST_DATA"];
$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim ( $postObj->Content );
$time = time ();
$msgType0 = $postObj->MsgType;
if ($msgType0 == 'text') { // 輸入的是文本消息
$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 ($keyword == "info") {
$msgType = "text";
$contentStr = "這是jtashtu的微信公衆平臺測試賬號,歡迎關注!";
$resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
echo $resultStr;
} else if (is_numeric ( $keyword )) {
$msgType = "text";
require 'menu.php';
$contentStr = $res;
$resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
echo $resultStr;
} else {
$msgType = "text";
$contentStr = $keyword;
$resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
echo $resultStr;
}
} else if ($msgType0 == 'image') {//輸入的是圖片
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
$contentStr = "不要對我發黃圖哦";
$resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $contentStr );
echo $resultStr;
}else{
echo "";
}
}
}
?>
還有一個外部程序menu.php,也就是防止寫一起太混亂了
<?php
$menu0=" 101、jtahstu的個人主頁
102、jtahstu的博客
103、ACOJ
201、軟件創新實驗室官網
202、AKOJ -- 在線評測系統
";
$menu00=array(
"101"=>"www.jtahstu.com",
"102"=>"www.jtahstu.com/blog",
"103"=>"www.jtahstu.com/acoj",
"201"=>"www.jtahstu.com/turing",
"202"=>"183.167.205.82:8081/JudgeOnline/userlist"
);
if(!empty($menu00["$keyword"])){
$res=$menu00["$keyword"];
}else{
$res=$menu0;
}
?>
本人就不細解釋代碼了,懂的人一看就懂,不懂的人也不是隨便解釋下就立馬學會的
運行結果就如一開始那樣
四、總結
以上我們就完成了一個簡單的公衆號回覆消息得程序,很簡單,還沒有涉及數據庫和其它的技術,畢竟先入門,然後慢慢挖掘。這個內涵還是有的,本人實際上並不怎麼玩微信,感覺並沒有QQ來着方便,公衆號也用過,像安科小團啊什麼的,本來是不會來接觸這個的,但是大勢所趨嘛,以後工作需要,學習一下。然後今天自己弄了一下,基本上也沒看教程,看了下官方文檔,網址:微信公衆平臺開發者文檔 然後也沒怎麼看懂,實際上需要看的也不多。
下一次看能不能做一些更加深入的功能,什麼查成績,查課表,查這查那,還得再好好看看,加油。
-- 作者jtahstu寫於2016年1月20日晚的安科寢室,室外氣溫1℃,小雪
本文章首發在本人博客jtahstu的博客
鏈接 http://www.jtahstu.com/blog/post-70.html
歡迎關注