php開發微信公衆號-消息自動回覆

我們配置好和微信交互的URL裏 我們就能接收到微信用戶發送的消息了 我只需要判斷消息的類型或者其他處理其他的業務邏輯 比如你可以根據他發的關鍵字來處理 他發訂單號 你收到後可以去數據庫查詢 然後在反饋給他

這裏我們就簡單回覆好了 比如他發送什麼消息 我們就返回什麼消息
封裝的微信類:weixin.class.php

<?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 './weixin.class.php';

$appid="";//這裏請填你真實的參數值
$appsecret="";//這裏請填你真實的參數值
$token="";//這裏請填你真實的參數值

$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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章