奪命雷公狗---微信開發28----微信羣發消息1

在寫這功能的時候咱們須要先設計一張數據表,在用戶閱讀咱們公衆號時,將用戶信息保存到該表中,數據表以下所示: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微信測試號噢 「 這裏證實成功一大半了,而後查看數據庫,看下數據有沒添加上去,若是成功則以下圖所示:數組

 

相關文章
相關標籤/搜索