在SAE搭建微信公眾賬號服務


讓我們回到2014年11月,從公司請假回成都,在天府軟件園B區旁邊的小區里,那個10多平米的出租屋里,閑來無事,我想找個事情做一做,好讓我這漂浮的心靜下來。大約在半年前就申請了微信的一個公眾賬號,一直閑置着,終於決定再次着手搭建一個微信公眾賬號。SAE(Sina App Engine)是國內最早開始提供雲服務的平台之一,而且幾乎是免費的。所以希望能夠通過SAE平台快速的搭建好一個微信公眾賬號,花了小半天就搭好了一個簡易的微信公眾平台。今天,就利用SAE搭建微信公眾平台的過程和大家一起分享。

一、注冊微信公眾賬號

首先注冊微信公眾賬號:http://mp.weixin.qq.com,點擊注冊,通過很簡單的幾步就能快速注冊好公眾賬號,需要注意的是這里是需要注冊一個新的微信號,而不是通過已有的私人微信號綁定。可能需要注冊一個專用的郵箱。注冊過程很簡單,不贅述。

二、注冊新浪SAE服務

注冊SAE,訪問http://sae.sina.com.cn,SAE整個的文檔都比較完整,很好上手。注冊完成后會送500雲豆,合人民幣5元。再申請實名認證,送雲豆2000。對於一個剛上手的開發者來說完全夠了。等應用開發好后,還可以申請開發者認證。每月有固定額度的雲豆贈送,基本就不用花錢了。另外還有教育機構認證,公益組織認證等。同樣十分簡單,不贅述。

三、開啟微信開發模式

登錄公眾平台后,點擊高級功能。首先要關閉編輯模式,才能進入開發模式。我們需要一個網址作為接口,Token呢,就是相當於我們和微信之間約定的“密碼”,以驗證是微信平台的訪問。

網址接入

公眾平台用戶提交信息后,微信服務器將發送GET請求到填寫的URL上,並且帶上四個參數:

參數 描述
signature 微信加密簽名
timestamp 時間戳
nonce 隨機數
echostr 隨機字符串

開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,否則接入失敗。signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數:

加密/校驗流程:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信 

那么很明確我們接下來需要做的事情了:為微信提供一個接口。

四、在SAE創建應用

填好二級域名和應用名稱等,選擇好語言。這里我們使用PHP開發選擇web應用。創建好應用之后,在代碼管理中創建一個新的版本。而后我們可以選擇編輯代碼。能夠實現在線編輯,根據個人喜好,可以通過SVN在本地開發然后CI到SAE服務,我個人就是這樣做的。

在SAE創建好應用后,需要到微信公眾賬號開發者中心將應用信息進行授權配置!

假設我創建的應用名稱為personal_app,則svn的地址為https://svn.sinaapp.com/personal_app,用戶名和密碼分別為SAE安全郵箱和安全密碼

五、干貨 

<?php

define("TOKEN", "xxxxxxxx");
$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;
        }
    }

    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;
        }
    }

    public function responseMsg()
    {}
}
?>
responseMsg函數詳細如下:
 1 function responseMsg()
 2 {
 3     $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 4 
 5     if (!empty($postStr)) {
 6         $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
 7         $fromUsername = $postObj->FromUserName;
 8         $toUsername = $postObj->ToUserName;
 9         $keyword = trim($postObj->Content);
10         $time = time();
11         $textTpl = "<xml>
12                     <ToUserName><![CDATA[%s]]></ToUserName>
13                     <FromUserName><![CDATA[%s]]></FromUserName>
14                     <CreateTime>%s</CreateTime>
15                     <MsgType><![CDATA[%s]]></MsgType>
16                     <Content><![CDATA[%s]]></Content>
17                     <FuncFlag>0</FuncFlag>
18                     </xml>";
19         if ($keyword == "date" || $keyword == "時間") {
20             $msgType = "text";
21             $contentStr = "現在時間是:\n".date("Y-m-d H:i:s", time());
22             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
23             echo $resultStr; 
24         } elseif (preg_match("/^0?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/", $keyword)){
25             $msgType = "text";
26             $phone_res = $this->mobilephone($keyword);
27             $contentStr = "號碼歸屬地查詢結果:"
28                     ."\n".$keyword
29                     ."\n歸屬地:".$phone_res->retData->province
30                     ."\n運營商:".$phone_res->retData->carrier;
31 
32             $contentStr = $contentStr
33                     ."\n-------------------\nProvided by API store.";
34 
35             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
36             echo $resultStr;
37         } else {
38             $msgType = "text";
39             $contentStr = "感謝您關注【XXXXXXXXXX】"."\n"."微信號:XXXXXX"."\n"
40                     ."目前平台功能如下:"
41                     ."\n"."1. 當前時間,如輸入:時間/date"
42                     ."\n"."2. 手機號歸屬地查詢,如輸入13800138000"
43                     ."\n"."更多內容,敬請期待...";
44             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
45             echo $resultStr;
46         }
47     }else{
48         echo "";
49         exit;
50     }
51 }

其中mobilephone函數用來完成手機號碼歸屬地查詢功能。這是經過精簡的一部分代碼,目前公眾賬號已經實現了大大小小6個功能,后續還會繼續改進!

感謝大家的閱讀,Published by MarsEdit!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM