在上一篇文章里 我們配置好和微信交互的URL里 我們就能接收到微信用戶發送的消息了 我只需要判斷消息的類型或者其他處理其他的業務邏輯 比如你可以根據他發的關鍵字來處理 他發訂單號 你收到后可以去數據庫查詢 然后在反饋給他
這里我們就簡單回復好了 比如他發送什么消息 我們就返回什么消息
首先是我封裝的微信類
<?php /** * 微信公眾平台操作類 */ class WeChat { private $_appid; private $_appsecret; //微信公眾平台請求開發者的服務器需要token private $_token; //標識qrcodeticket的類型,是永久還是臨時 const QRCODE_TYPE_TEMP = 1; const QRCODE_TYPE_TEMP_STR = 2; const QRCODE_TYPE_LIMIT = 3; const QRCODE_TYPE_LIMIT_STR = 4; /** * 構造函數 * @param string $id appid * @param string $secret app秘鑰 */ public function __construct($id,$secret,$token){ $this->_appid=$id; $this->_appsecret=$secret; $this->_token=$token; } /** * 用於第一次驗證URl合法性 */ public function firstValid(){ //校驗簽名的合法性 if($this->_checkSignature()){ //簽名合法,告知微信服務器 echo $_GET['echostr']; } } /** * 驗證簽名 * @return [type] [description] */ private function _checkSignature(){ //獲取由微信服務器發過來的數據 $signature = $_GET['signature']; $timestamp = $_GET['timestamp']; $nonce = $_GET['nonce']; //開始驗證數據 $tmp_arr = array($this->_token,$timestamp,$nonce); sort($tmp_arr,SORT_STRING); $tmp_str = implode($tmp_arr); $tmp_str = sha1($tmp_str); //對比數據 if ($signature == $tmp_str) { return true; } else { return false; } } /** * 消息類型判斷 * @return array */ public function responseMsg() { //因為很多都設置了register_globals禁止,不能用$GLOBALS["HTTP_RAW_POST_DATA"] 改用file_get_contents("php://input")即可 $postStr = file_get_contents("php://input"); if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $RX_TYPE = trim($postObj->MsgType); //用戶發送的消息類型判斷 switch ($RX_TYPE) { case "text": //文本消息 return array('type'=>'text','msg'=>'文本','obj'=>$postObj); break; case "image": //圖片消息 return array('type'=>'image','msg'=>'圖片','obj'=>$postObj); break; case "voice": //語音消息 return array('type'=>'voice','msg'=>'語音','obj'=>$postObj); break; case "video": //視頻消息 return array('type'=>'video','msg'=>'視頻','obj'=>$postObj); break; case "location"://位置消息 return array('type'=>'location','msg'=>'位置','obj'=>$postObj); break; case "link": //鏈接消息 return array('type'=>'link','msg'=>'鏈接','obj'=>$postObj); break; default: return array('type'=>'unknow msg type','msg'=>'未知','obj'=>$postObj); break; } }else { echo ""; exit; } } /** * 獲取 access_tonken值 * @param string $token_file 用來存儲的文件 * @return access_token */ public function getAccessToken($token_file='./access_token'){ //處理是否過期問題,將access_token存儲到文件 $life_time = 7200; if (file_exists($token_file) && time() - filemtime($token_file) < $life_time) { // 存在有效的access_token 直接返回文件內容 return file_get_contents($token_file); } //接口URL $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->_appid."&secret=".$this->_appsecret; //發送GET請求 $result = $this->_request('get',$url); if (!$result) { return false; } //處理數據 $result_obj = json_decode($result); //寫入到文件 file_put_contents($token_file, $result_obj->access_token); return $result_obj->access_token; } /** * 獲取Ticket * @param string $content 二維碼內容 * @param int $type 二維碼類型 1 臨時整形 2臨時字符串 3永久整形 4永久字符串 * @param int $expire 有效時間 * @return ticket */ public function getQRCodeTicket($content,$type=2,$expire=604800){ $access_token = $this->getAccessToken(); $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$access_token; $type_list = array( self::QRCODE_TYPE_TEMP => 'QR_SCENE', self::QRCODE_TYPE_TEMP_STR => 'QR_STR_SCENE', self::QRCODE_TYPE_LIMIT=>'QR_LIMIT_SCENE', self::QRCODE_TYPE_LIMIT_STR=>'QR_LIMIT_STR_SCENE' ); $action_name = $type_list[$type]; //post發送的數據 switch ($type){ case self::QRCODE_TYPE_TEMP: $data_arr['expire_seconds']=$expire; $data_arr['action_name'] = $action_name; $data_arr['action_info']['scene']['scene_id'] = $content; break; case self::QRCODE_TYPE_TEMP_STR: $data_arr['expire_seconds']=$expire; $data_arr['action_name'] = $action_name; $data_arr['action_info']['scene']['scene_str'] = $content; break; case self::QRCODE_TYPE_LIMIT: $data_arr['action_name'] = $action_name; $data_arr['action_info']['scene']['scene_id'] = $content; break; case self::QRCODE_TYPE_LIMIT_STR: $data_arr['action_name'] = $action_name; $data_arr['action_info']['scene']['scene_str'] = $content; break; } $data = json_encode($data_arr); $result = $this->_request('post',$url,$data); if(!$result){ return false; } $result_obj = json_decode($result); return $result_obj->ticket; } /** * 根據ticket獲取二維碼 * @param int|string $content qrcode內容標識 * @param [type] $file 存儲為文件的地址,如果null直接輸出 * @param integer $type 類型 * @param integer $expire 如果是臨時,標識有效期 * @return [type] */ public function getQRCode($content,$file=NULL,$type=2,$expire=604800){ //獲取ticket $ticket = $this->getQRCodeTicket($content,$type=2,$expire=604800); $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket"; //發送,取得圖片數據 $result = $this->_request('get',$url); if($file){ file_put_contents($file,$result); }else{ header('Content-Type:image/jpeg'); echo $result; } } /** * 封裝發送http請求 * @param string $method 請求方式 get/post * @param string $url 請求目標的url * @param array $data post發送的數據 * @param bool $ssl 是否為https協議 * @return 響應主體 */ private function _request($method='get',$url,$data=array(),$ssl=true){ //curl完成,先開啟curl模塊 //初始化一個curl資源 $curl = curl_init(); //設置curl選項 curl_setopt($curl,CURLOPT_URL,$url);//url //請求的代理信息 $user_agent = isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4'; curl_setopt($curl,CURLOPT_USERAGENT,$user_agent); //referer頭,請求來源 curl_setopt($curl,CURLOPT_AUTOREFERER,true); curl_setopt($curl, CURLOPT_TIMEOUT, 30);//設置超時時間 //SSL相關 if($ssl){ //禁用后,curl將終止從服務端進行驗證; curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false); //檢查服務器SSL證書是否存在一個公用名 curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2); } //判斷請求方式post還是get if(strtolower($method)=='post') { /**************處理post相關選項******************/ //是否為post請求 ,處理請求數據 curl_setopt($curl,CURLOPT_POST,true); curl_setopt($curl,CURLOPT_POSTFIELDS,$data); } //是否處理響應頭 curl_setopt($curl,CURLOPT_HEADER,false); //是否返回響應結果 curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); //發出請求 $response = curl_exec($curl); if (false === $response) { echo '<br>', curl_error($curl), '<br>'; return false; } //關閉curl curl_close($curl); return $response; } }
然后是index.php能接收
<?php header('Content-type:text/html;charset=utf8'); require './WeChat.class.php'; $appid="231321321321";//這里請填你真實的參數值 $appsecret="sdfsdfwerwedsfsdf";//這里請填你真實的參數值 $token="2131";//這里請填你真實的參數值 $wx=new WeChat($appid,$appsecret,$token); //驗證url // $wx->firstValid(); //判斷消息類型 $result=$wx->responseMsg(); if($result['type']=='text'){ //文本消息 transmitText($result['obj'], '你發送的是文本,內容為:'.$result['obj']->Content); } /* * 接收文本消息 */ function receiveText($object) { $content = "你發送的是文本,內容為:".$object->Content; $result = $this->transmitText($object, $content); return $result; } /* * 回復文本消息 */ function transmitText($object, $content) { $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content); file_put_contents('./test.txt',$result); echo $result;die; // return $result; }
效果如下