程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 模擬測試微信接口暨微信開發試驗代碼

模擬測試微信接口暨微信開發試驗代碼

編輯:關於PHP編程

要成為微信公眾號(訂閱號或服務號)的開發者,需要首先驗證接口,這個可以在登錄微信https://mp.weixin.qq.com後台後設置。但是我嫌麻煩,於是開發個接口類,包含驗證函數(還有回復文本信息和圖文信息的功能)。其實接口驗證在成為開發者之後就沒用了。
上代碼,微信基類:weixin.class.php
class Weixin
{
public $token = '';//token
public $debug = false;//是否debug的狀態標示,方便我們在調試的時候記錄一些中間數據
public $setFlag = false;
public $msgtype = 'text'; //('text','image','location')
public $msg = array();
public function __construct($token,$debug)
{
$this->token = $token;
$this->debug = $debug;
}
//獲得用戶發過來的消息(消息內容和消息類型 )
public function getMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if ($this->debug)
{
$this->write_log($postStr);
}
if (!empty($postStr))
{
$this->msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$this->msgtype = strtolower($this->msg['MsgType']);
}
}
//回復文本消息
public function makeText($text='')
{
$CreateTime = time();
$FuncFlag = $this->setFlag ? 1 : 0;
$textTpl = "
msg['FromUserName']}]]>
msg['ToUserName']}]]>
{$CreateTime}


%s
";
return sprintf($textTpl,$text,$FuncFlag);
}
//根據數組參數回復圖文消息
public function makeNews($newsData=array())
{
$CreateTime = time();
$FuncFlag = $this->setFlag ? 1 : 0;
$newTplHeader = "
msg['FromUserName']}]]>
msg['ToUserName']}]]>
{$CreateTime}


%s";
$newTplItem = "
<![CDATA[%s]]>



";
$newTplFoot = "
%s
";
$Content = '';
$itemsCount = count($newsData);
$itemsCount = $itemsCount < 10 ? $itemsCount : 10;//微信公眾平台圖文回復的消息一次最多10條
if ($itemsCount)
{
foreach ($newsData as $key => $item)
{
if ($key<=9)
{
$Content .= sprintf($newTplItem,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
}
}
}
$header = sprintf($newTplHeader,$newsData['content'],$itemsCount);
$footer = sprintf($newTplFoot,$FuncFlag);
return $header . $Content . $footer;
}
public function reply($data)
{
if ($this->debug)
{
$this->write_log($data);
}
echo $data;
}
public function valid()
{
if ($this->checkSignature())
{
//if( $_SERVER['REQUEST_METHOD']=='GET' )
//{
echo $_GET['echostr'];
exit;
//}
}
else
{
write_log('認證失敗');
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$tmpArr = array($this->token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature )
return true;
else
return false;
}
private function write_log($log)
{
//這裡是你記錄調試信息的地方 請自行完善 以便中間調試
}
}
?>

微信接口的代碼:weixin.php
header("Content-Type: text/html;charset=utf-8");
include_once('weixin.class.php'); //引用剛定義的微信消息處理類
define("TOKEN", "itwatch"); //mmhelper
define('DEBUG', false);
$weixin = new Weixin(TOKEN, DEBUG); //實例化
//$weixin->valid();
$weixin->getMsg();
$type = $weixin->msgtype; //消息類型
$username = $weixin->msg['FromUserName']; //哪個用戶給你發的消息,這個$username是微信加密之後的,但是每個用戶都是一一對應的
if ($type==='text')
{
//if ($weixin->msg['Content']=='Hello2BizUser')
if ($weixin->msg['Content']=='你好')
{ //微信用戶第一次關注你的賬號的時候,你的公眾賬號就會受到一條內容為'Hello2BizUser'的消息
$reply = $weixin->makeText('歡迎你關注網眼視界威信公眾平台');
}
else
{ //這裡就是用戶輸入了文本信息
$keyword = $weixin->msg['Content']; //用戶的文本消息內容
//include_once("chaxun.php"); //文本消息 調用查詢程序
//$chaxun= new chaxun(DEBUG, $keyword, $username);
//$results['items'] =$chaxun->search(); //查詢的代碼
//$reply = $weixin->makeNews($results);
$arrayCon = array(
array(
"Title"=>"電腦學習網",
"Description"=>"十萬個為什麼-電腦學習網",
"PicUrl"=>"http://www.veryphp.cn/datas/userfiles/8bd108c8a01a892d129c52484ef97a0d/images/website13.jpg",
"Url"=>"http://www.why100000.com/"
),
array(
"Title"=>"非常PHP學習網",
"Description"=>"大型PHP學習分享社區",
"PicUrl"=>"http://www.veryphp.cn/datas/userfiles/8bd108c8a01a892d129c52484ef97a0d/images/php01.jpg",
"Url"=>"http://www.veryphp.cn/"
)
);
$results = $arrayCon;
$reply = $weixin->makeNews($results);
}
}
elseif ($type==='location')
{
//用戶發送的是位置信息 稍後處理
}
elseif ($type==='image')
{
//用戶發送的是圖片 稍後處理
}elseif ($type==='voice')
{
//用戶發送的是聲音 稍後處理
}
//
$weixin->reply($reply);
?>

驗證微信接口的代碼,用 curl 函數完成,需要打開PHP的 curl 擴展。把 weixin.php 文件中的 //$weixin->valid(); 一句的注釋去掉即可驗證,完了把這句注釋掉即可。






//header("Content-Type: text/html;charset=utf-8");
//准備數據
define('TOKEN', 'itwatch');//自己定義的token 就是個通信的私鑰
$echostr = '返回此數據表明正確。';
$timestamp = (string)time(); //本身為整數,必須轉換為字符串
$nonce = 'my-nonce';
$signature = signature(TOKEN, $timestamp, $nonce);


function signature($token, $timestamp, $nonce)
{
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
return $tmpStr;
}
//提交
$post_data = array(
"signature=$signature",
"timestamp=$timestamp",
"nonce=$nonce",
"echostr=$echostr"
);
$post_data = implode('&',$post_data);
$url='http://www.veryphp.cn/tools/weixin/weixin.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url.'?'.$post_data); //模擬GET方法
ob_start();
curl_exec($ch);
$result = ob_get_contents();
ob_end_clean();
echo $result;
?>

以上的核心代碼是 weixin.class.php 和 weixin.php 兩個文件,是我調試成功的,已經部署在我的服務器上了。你要測試的話,用手機微信收聽微信號:itwatch,然後輸入“你好”,會返回字符串:歡迎你關注網眼視界威信公眾平台。隨便輸入,會打開一個圖文消息。

好吧,我承認以上代碼寫的非常凌亂,因為我十分瞌睡了, 要睡覺了。但以上代碼確實是能工作的,是典型的原理實現性測試代碼。希望給微信開發者提供個思路,看明白之後可以結合數據庫寫一個功能完善的微信信息後台管理程序。。
有微信服務號的,可以在此基礎上開發個菜單,然後調用仿照以上代碼開發的消息回復系統。其實很簡單。
這才是真正的網絡通信程序,比你寫企業站,把數據輸進去,再按順序檢索出來分頁顯示,要有意思的多。

網眼-張慶
2013-12-3 ?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved