1. 程式人生 > >微信公眾號開發完整教程(一) PHP7.0版本,TP5.0框架

微信公眾號開發完整教程(一) PHP7.0版本,TP5.0框架

因為工作的需要,這一兩年對微信公眾號和小程式,專案製作的比較多。所以我才打算寫一篇全面的製作教程,當然了,最好的教程是微信工作平臺的文件。我這裡只是講述一下我的工作中的製作流程。所有相關文章的原始碼,我託管在我自己的github上面,歡迎關注:地址點選開啟連結。接下來開始我們的教程。

1.微信與公眾平臺的區別:

微信:即時聊天的軟體,屬於一對一的關係

微信公眾平臺:屬於一對多的關係。

2.訂閱號與服務號的區別:

訂閱號:針對個人或媒體每天可以群發1條資訊,預設不具有自定義選單。伺服器號:針對企業或銀行每月可以群發4條資訊,預設具有自定義選單。運營主體是組織(比如企業、媒體、公益組織)的,可以申請服務號。運營主體是組織和個人的可以申請訂閱號,但是個人不能申請服務號。

3.公眾平臺的兩種模式:

1、編輯模式:直接使用微信公眾平臺所提供的後臺操作進行使用者互動。編輯模式可以使用在如下的場景:不具備開發能力的運營者,主要是進行品牌宣傳、新聞媒體、自助客服的公眾賬號,運營初期,不需要特別多的功能,開發模式系統升級,故障等特殊情況

2、開發者模式:直接使用介面程式碼實現使用者的交流

4.微信公眾平臺前期準備:

註冊公眾平臺,擁有線上伺服器

5.認識一下編輯模式:

原理:

5.1訊息群發:

選擇物件選擇素材進行群發:


5.2:自定義選單:

啟用自定義選單,並開啟:


點選檢視,進入設定介面:



5.3自動回覆:


上述講述的主要是編輯模式的使用,我想很多人應該都會使用,其實和我們平常在論壇編輯文章和帖子差不多。

6.開發者模式

原理:


6.1第一步我們要開啟開發者模式:

注意:在開啟開發者模式之後編輯模式中部分功能不能正常使用。即開發者模式跟編輯模式存在衝突。進入設定介面:


修改配置:


設定結果如下圖:填寫上你的伺服器檔案地址,token,點選提交,驗證即可。如果提交併驗證通過,就進入到開發者模式



6.2我線上的驗證程式碼如下:

public function valid(){ //獲取隨機字串 $echoStr = input("echostr"); if($echoStr){ // 驗證介面的有效性,由於介面有效性的驗證必定會傳遞echostr 引數 if
($this ->checkSignature()){ echo $echoStr; exit; } }else{ $this->responseMsg(); } } protected function checkSignature() { // 微信加密簽名 $signature = input("signature"); $timestamp = input("timestamp");//時間戳 $nonce =input("nonce");//隨機數 $token = "weixin"; //token值,必須和你設定的一樣 $tmpArr =array($token,$timestamp,$nonce); sort($tmpArr,SORT_STRING); $tmpStr = implode($tmpArr); $tmpStr =sha1($tmpStr); if($tmpStr == $signature){ return true; }else{ return false; } }

關於上述程式碼中的變數來源,微信都有詳細的說明,我搭建的公眾號使用的是PHP7.0版本,TP5.0框架。在這裡說明一下。

上述程式碼只會執行一次,開啟開發者模式之後,就不會在執行,只會執行上述程式碼中的

responseMsg

方法。

我們先上傳一段測試程式碼試試,回覆文字訊息,是否有回覆,程式碼如下:

public function responseMsg() {        //get post data, May be due to the different environments        $postStr = file_get_contents('php://input');       //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; } }

結果如下:

,由於微信的網頁授權的限制,所以我們可以申請測試賬號,我這裡使用的就是測試賬號。上述的開啟開發者模式是一樣的。只需要去申請一個測試賬號就好。申請的地方:


如果出現上述的程式碼,說明我們已經測試成功。接下來,我們開始獲取access_token的值,這個引數對於我們來說很重要。因為

access_token是公眾號的全域性唯一介面呼叫憑據,公眾號呼叫各介面時都需使用access_token。開發者需要進行妥善儲存。access_token的儲存至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時重新整理,重複獲取將導致上次獲取的access_token失效。access_token是身份認證 其他介面基本上都需要使用該值進行驗證。

7.access_token獲取:(可以在本地測試)

7.1檢視介面說明:


獲取access_token方式一:


結果如下:


獲取access_token方式二:


結果如下:


我們開始對上述的程式碼進行封裝,因為access_token,每天只能呼叫2000次,所以我們要快取起來,這樣才能達到複用的效果,

7.2:curl封裝傳送請求和獲取access_token封裝:

// 獲取請求的地址的方法if(!function_exists("http_curl")){ function http_curl($url,$data =array(),$method ="get",$returnType ="json") { //1.開啟會話 $ch = curl_init(); //2.設定引數 curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); if($method!="get"){ curl_setopt($ch,CURLOPT_POST,TRUE); curl_setopt($ch,CURLOPT_POSTFIELDS,$data); } curl_setopt($ch,CURLOPT_URL,$url); //執行會話 $json = curl_exec($ch); curl_close($ch); if($returnType == "json"){ return json_decode($json,true); } return $json; }}if(!function_exists('get_access_token')){ function get_access_token() { $appid = "wx1ba8f59d9e2c0be0"; //微信的appid $secret ="9e65155599fb9ec047455e197ff6e121"; //微信的開發者金鑰 // 讀取快取中的內容 include_once "MyMemcache.php"; //引入快取方法檔案 $obj = new \MyMemcache("47.104.71.253"); $value = $obj ->get($appid); if(!$value){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret; $result = http_curl($url); $value = $result['access_token']; $obj->set($appid,$value,7000); } return $value; }}

上述程式碼就是我對這兩個方法的封裝,其中我們用到了快取技術:快取的方法如下:

// memcache操作類class MyMemcache{ public $conn; public $isMemcache =true; public function __construct($host="127.0.0.1",$port='11211') { // 建立連線 if(class_exists('MyMemcache')){ $obj =new \Memcache(); }else{ $this ->isMemcache =false; $obj =new \Memcached(); } $obj ->addServer($host,$port); $this ->conn =$obj; } //獲取資料 public function get($key) { return $this->conn->get($key); } //設定資料 public function set($key,$value,$expire=0) { if($this->isMemcache){ $this->conn->set($key,$value,0,$expire); }else{ // Memcached擴充套件的操作方式 $this->conn->set($key,$value,$expire); } }}

結合上述的三個方法,我們就可以實現獲取access_token的值,並儲存在快取系統,7000s去重新獲取一次。

上述的步驟完成,我們就算是對微信公眾號的開發的基本準備全部準備完畢,接下來就開始對著微信開發者文件進行開發和資料的替換了。第一節先講述到這裡.....