編輯:關於Android編程
微信公眾號開發者中心提供了使用代碼開發微信微應用的功能,使用代碼開發微應用需要用到服務器,以存放編寫的代碼,因此我們需要一個服務器。那麼在微信那裡設置服務器呢?在微信公眾號管理界面,點擊【基本配置】
將會看到基本配置信息,在【服務器配置】選項<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxociAvPg0KPHA+PGltZyBhbHQ9"基本配置" src="/uploadfile/Collfiles/20160603/20160603094343260.jpg" title="\" />
啟用並設置服務器後,用戶發送給公眾號的信息將被轉發給此服務器,這樣我們就可以通過代碼靈活的實現各種微應用。
首先,我們要去新浪雲計算 申請一個空間,為什麼使用SAE?因為可以免費申請啊。
點擊【開發者由此進入】鏈接
使用微博賬號登陸SAE雲計算
進入新浪雲控制台後,創建新應用(即服務器),填寫二級域名、應用名稱、運行環境。
點擊【創建】,進入代碼管理界面,選擇SVN版本管理工具,為什麼選擇SVN?雲空間收費,不考慮,GIT適合高級用戶,SVN適合一般用戶。
選擇好SVN後,創建版本。版本的好處就是,當你完成一個具有基本功能的代碼後(此版本號為M),交給老板。老板突發靈感說再添加一個功能,你鄙視他後還是老老實以M版本的基礎創建一個N版本,然後就是無窮無盡的錯誤,代碼被弄得亂七八糟。此時你該感激版本這個東西,讓你有機會穿越回M版本。
總而言之,以每個階段做作為一個版本,等回頭看或者出問題的時候,可以查看或者從某個版本重新開始。
創建完版本後,將會看到應用的鏈接信息
點擊【編輯代碼】,進入SAE編輯器,默認情況下有【config.yaml】配置信息文件和【index.php】文件,
Hello, SAE!';
在浏覽器中我們可以輸入: http://wlvsoft.applinzi.com/ 或 http://1.wlvsoft.applinzi.com/ 訪問應用服務器,浏覽器將會顯示echo輸出的語句。
申請成功服務器後,就可以在微信公眾號管理界面進行服務器配置,點擊【修改配置】鏈接。
填寫基本配置信息:
URL:應用服務器鏈接 Token:任意字符,記住此值,應用服務器需要Token進行驗證 EncodingAESkey:隨機生成即可 消息加解密方式:測試階段選擇【明文模式】此時點擊提交,將會提示token驗證失敗。
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:
開發者通過檢驗signature,對請求進行校驗。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則服務器配置生效,否則提示token驗證失敗。
下面是微信公眾平台開發者文檔提供的驗證代碼:
private function checkSignature()
{
//獲取微信服務器提交到應用服務器的參數
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
//獲取token,與服務器配置中的一致
$token = TOKEN;
//將參數組裝成數組
$tmpArr = array($token, $timestamp, $nonce);
//對參數進行排序
sort($tmpArr, SORT_STRING);
//將數組轉換為字符串
$tmpStr = implode( $tmpArr );
//加密
$tmpStr = sha1( $tmpStr );
//加密後與$signature進行對比
//如果相同,表示請求來自微信服務器
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
下面是修改後的index.php代碼:
valid();
}else{
//如果是用戶發送信息,返回空
echo '';
exit;
}
class wechatCallbackapiTest
{
//有效驗證
public function valid()
{
$echoStr = $_GET["echostr"];
//調用驗證方法
if($this->checkSignature()){
header('content-type:text');
//如果驗證成功,返回echoStr
echo $echoStr;
exit;
}
}
//驗證方法,如果來自微信服務器返回true
private function checkSignature()
{
//獲取微信服務器提交到應用服務器的參數
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
//獲取token,與服務器配置中的一致
$token = TOKEN;
//將參數組裝成數組
$tmpArr = array($token, $timestamp, $nonce);
//對參數進行排序
sort($tmpArr, SORT_STRING);
//將數組轉換為字符串
$tmpStr = implode( $tmpArr );
//加密
$tmpStr = sha1( $tmpStr );
//加密後與$signature進行對比
//如果相同,表示請求來自微信服務器
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
此時,再次提交,服務器配置成功。
點擊【啟動】,手工配置的自動回復和自定義菜單將失效,全部將由應用服務器代碼進行管理。
打開手機微信查看公眾號,發現菜單和自動回復功能已經不能使用了。
提示(注意:不建議如此,不知道後續有沒有錯誤,在這裡列出僅供娛樂測試)
按照微信驗證原理,其實可以直接返回驗證參數【echostr】,跳過token驗證。將index.php改為:
3 應用服務器向用戶發送消息
當我們在公眾號中輸入信息時,提示“該公眾號暫時無法提供服務器,請稍後再試”。原因是我們在index.php中沒有對用戶的消息進行響應。
//獲取echostr,存在表示提交驗證,否則為用戶發送的一般消息
if (isset($_GET['echostr'])) {
//如果提交為驗證,進行有效驗證
$wechatObj->valid();
}else{
//如果是用戶發送信息,返回空
echo '';
exit;
}
如果是用戶在公眾號輸入的信息,我們直接返回為空。但是,微信公眾號要求發送的信息是有標准格式的。簡單的文本消息如下:
12345678
參數作用如下:
因此,用戶要接收到應用服務器返回的信息,應用服務器必須按照微信公眾號文本消息格式要求返回。
我們可以使用方倍工作室提供的微信調試器 對我們發送的信息進行測試。
接收用戶指公眾號原始ID 可在公眾號設置中查詢。
當輸入:你好 ;發送給應用服務器的信息如下:
1464855763
1234567890abcdef
應用服務器可以獲取提交的文本信息,進而獲得公眾號ID【ToUserName】、用戶ID【FromUserName】和發送的文本信息【Content】。依據這些信息,應用服務器可以自動回復信息給用戶。修改index.php:
valid();
}else{
//如果是用戶發送信息,調用responseMsg方法
$wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
//有效驗證
public function valid()
{
$echoStr = $_GET["echostr"];
//調用驗證方法
if($this->checkSignature()){
header('content-type:text');
//如果驗證成功,返回echoStr
echo $echoStr;
exit;
}
}
//驗證方法,如果來自微信服務器返回true
private function checkSignature()
{
//獲取微信服務器提交到應用服務器的參數
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
//獲取token,與服務器配置中的一致
$token = TOKEN;
//將參數組裝成數組
$tmpArr = array($token, $timestamp, $nonce);
//對參數進行排序
sort($tmpArr, SORT_STRING);
//將數組轉換為字符串
$tmpStr = implode( $tmpArr );
//加密
$tmpStr = sha1( $tmpStr );
//加密後與$signature進行對比
//如果相同,表示請求來自微信服務器
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
//返回文本消息
public function responseMsg()
{
//獲取用戶提交的XML格式數據
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//如果用戶提交的信息不為空
if (!empty($postStr)){
//將用戶提交的XML轉換為對象
$postObj = simplexml_load_string($postStr,
'SimpleXMLElement', LIBXML_NOCDATA);
//獲取用戶提交的類型(文本、圖文、音頻、視頻等)
$RX_TYPE = trim($postObj->MsgType);
//不同的類型返回的結果不同
switch ($RX_TYPE)
{
//用戶發送類型為文本
case "text":
//公眾號ID
$fromUsername = $postObj->FromUserName;
//用戶ID
$toUsername = $postObj->ToUserName;
//用戶發送內容
$keyword = trim($postObj->Content);
//獲得系統當前時間
$time = time();
//按照微信格式要求編寫返回格式
$textTpl = "
%s
0
";
//應用服務器返回給用戶的類型為文本
$msgType = "text";
//返回的北榮
$contentStr = date("Y-m-d H:i:s",
time())."\n".'歡迎關注河源萬綠軟件工作室!';
// sprintf() 函數把格式化的字符串寫入一個變量中
// $toUsername位置和用戶發送的互換
$resultStr = sprintf($textTpl, $fromUsername,
$toUsername, $time, $msgType, $contentStr);
break;
//非文本信息,默認不處理
default:
$resultStr = "";
break;
}
//應用服務器返回信息給用戶
echo $resultStr;
}else{
echo "";
exit;
}
}
}
完成後,測試如下:
本文實例講述了Android中自定義一個View的方法。分享給大家供大家參考,具體如下:Android中自定義View的實現比較簡單,無非就是繼承父類,然後重載方法,即便
BaseAdapterBaseAdapter是實現了ListAdapter和SpinnerAdapter兩個接口,當然它也可以直接給ListView和Spinner等UI
titlebargithub地址一個簡單易用的導航欄TitleBar,可以輕松實現IOS導航欄的各種效果整個代碼全部集中在TitleBar.java中,所有控件都動態生成
Android中所有控件都繼承自android.view.View,其中android.view.ViewGroup是View的一個重要子類,絕大部分的布局都繼承自Vie