在寫這功能的時候咱們須要先設計一張數據表,在用戶閱讀咱們公衆號時,將用戶信息保存到該表中,數據表以下所示:php
id自動增加mysql
openid表明微信客戶端的一個標識,也就是fromUsernamesql
hd_time是一個互動的時間(由於用戶在給咱們公衆號發送消息的48小時內咱們才能夠給用戶推送消息,因此咱們要記錄該用戶和咱們互動的時間是何時)數據庫
而後修改index.php的代碼,代碼以下:json
<?php /** * wechat php test */ //define your token require_once "common.php"; //這裏是引入curl發送函數的類 require_once 'WeChat.class.php'; define("TOKEN", "twgdh"); //這裏讓這個類繼承了curl發送參數的類 class wechatCallbackapiTest extends WeChat { public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //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 */ // 使用simplexml技術對xml進行解析 // libxml_disable_entity_loader(true), 是從安全性考慮,爲了防止xml外部注入, //只對xml內部實體內容進行解析 libxml_disable_entity_loader(true); //加載 postStr 字符串 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); global $tmp_arr; //根據接收到的消息類型,來進行分支處理(switch) switch($postObj->MsgType) { case 'event': if($postObj->Event == 'subscribe') { $contentStr = "歡迎關注leigood微信測試號噢"; $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr); echo $resultStr; //消息回覆後,咱們將該用戶加入qf_users表裏面 $connect = mysql_connect('localhost','root','root') or die('數據庫連接失敗'); mysql_select_db('wxdb',$connect); mysql_query('set names utf8'); $time = time(); $sql = "insert into qf_users (id,openid,hd_time) values(NULL,'{$fromUsername}','{$time}')"; mysql_query($sql,$connect); } break; case 'text': //回覆文本模塊 //這裏開始測試客服消息接口了 if($keyword == '文本'){ //獲取token require 'get_token.php'; $contentStr = '這是客服接口的回覆,咱們能夠幫助您什麼?'; //對發送的內容進行urlencode編碼,防止中文亂碼 $contentStr = urlencode($contentStr); //到時候咱們我發送的內容咱們放到一個數組裏面去了 $content_arr = array('content'=>"{$contentStr}"); //這裏的意思是未來我要發送消息給這個用戶 $reply_arr = array('touser'=>"{$fromUsername}",'msgtype'=>'text','text'=>$content_arr); //下一步就是將編碼轉成規定的json格式 $post = json_encode($reply_arr); //url解碼,若是不解碼他將會發來一段二進制代碼 $post = urldecode($post); $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={$access_token}"; //這裏咱們來使用類的繼承機制,來簡化代碼 $this -> http_request($url,$post); //這裏是能夠回覆多條消息的,只須要在執行下這個函數便可 //$this -> http_request($url,$post); }else{ $contentStr = '您輸入的格式有誤'; $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr); echo $resultStr; } break; case 'image': //處理用戶上傳圖片 $media_id = $postObj -> MediaId; //獲取到用戶上傳的圖片的mediaid $resultStr = sprintf($tmp_arr['image'], $fromUsername, $toUsername, $time, $media_id); echo $resultStr; //將圖片保存到本地服務器的文件系統 //1.先給圖片建立一個名字 $image_file_name = time().'.jpg'; //2.獲取該圖片的內容 $image_file = file_get_contents($postObj->PicUrl); //3.保存到本地服務器的文件系統 //提醒:必定要保證您建立的文件夾是www用戶可讀可寫,不然沒法保存該圖片到文件夾下 file_put_contents("./uploadimage/".$image_file_name,$image_file); //將圖片的路徑和相關信息入庫 //1.建立一張表 //2.連接mysql數據庫,而且添加圖片信息 $connect = mysql_connect('localhost','root','root'); mysql_select_db('wxdb',$connect); mysql_query('set names utf8'); $media_path = "./uploadimage/".$image_file_name; //路徑 $sql = "insert into keep_image_uploads (id,openid,media_id,media_path) values(NULL,'{$fromUsername}','{$media_id}','{$media_path}')"; mysql_query($sql,$connect); break; case 'voice': //處理用戶上傳語言的業務邏輯 $media_id = $postObj -> MediaId; //獲取media_id的id號 $resultStr = sprintf($tmp_arr['voice'], $fromUsername, $toUsername, $time, $media_id); echo $resultStr; break; case 'location': //處理用戶上傳的地理位置信息 $Location_X = $postObj -> Location_X; //獲取上傳地理位置的緯度 $Location_Y = $postObj -> Location_Y; //獲取上傳地地理位置經度 $contentStr = "您上報的地理位置是:\n經度是:{$Location_Y} \n緯度是: {$Location_X}"; $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr); echo $resultStr; break; case 'link': //接收並回復連接信息 //獲取到用戶上傳的連接信息 $Title = $postObj -> Title; $Url = $postObj -> Url; $contentStr = "<a href='{$Url}'>{$Title}</a>"; $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr); echo $resultStr; break; } }else { echo ""; exit; } } private function checkSignature() { // you must define TOKEN by yourself if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } //若是這段代碼放在上面,那程序將會報錯,由於繼承的問題,會顯示類沒有找到 $wechatObj = new wechatCallbackapiTest(); //當接入成功後,請註銷這句話,不然,會反覆驗證。 //$wechatObj->valid(); //添加響應請求的語句 $wechatObj->responseMsg(); ?>
核心代碼以下所示:api
而後咱們手機進行重新關注公衆號,若是關注成功後,手機端顯示」 歡迎關注leigood微信測試號噢 「 這裏證實成功一大半了,而後查看數據庫,看下數據有沒添加上去,若是成功則以下圖所示:數組