微信公众号接受用户图片视频并存储到服务器 php、sql

此功能是为了完成一个影像大赛的小项目,客户在公众号内发送影像大赛字样或点击影像大赛按钮即可按照要求输入个人信息参加比赛。
微信公众号都需要一个重要的配置文件,用于管理收发用户信息,与客户交互,这个不多说。
直接上代码。

功能图

功能图

wx.php页面

<?php
header('Content-type:text');
define("TOKEN", "weixin");
//此处引入数据库配置文件
include("php/dbconfig.php");
$_SERVER['$conn']=mysqli_connect($host,$db_user,$db_pass,$db_name);
date_default_timezone_set($timezone); //北京时间
//此公众号的appid与APPsecret
$_SERVER['$appid'] = "wxxxxxxxxxxxxxxx00";
$_SERVER['$appsecret'] = "9xxxxxxxxxxxxxxxxxxxxxxxxxxxe";

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

class wechatCallbackapiTest
{   
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

        if($tmpStr == $signature){
            return true;
        }else{
            return false;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//$postStr = file_get_contents('php://input');
        if (!empty($postStr)){
            $this->logger("R ".$postStr);
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            switch ($RX_TYPE)
            {
                case "event":
                    $result = $this->receiveEvent($postObj);
                    break;
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
                //接受图片信息处理事件
                case "image":
                    $this->logger("R "."处理图片消息");
                    $result = $this->receiveImage($postObj);
                    break;
                //接受视频处理事件
                case "video":
                    $this->logger("R "."处理视频消息");
                    $result = $this->receiveVideo($postObj);
                    break;
            }
            $this->logger("T ".$result);
            echo $result;
        }else {
            echo "";
            exit;
        }
    }

    public function mkThumbnail($src, $width, $filename) {
        if (!isset($width) && !isset($height))
            return false;
        if (isset($width) && $width <= 0)
            return false;
        //if (isset($height) && $height <= 0)
        //    return false;

        $size = getimagesize($src);
        if (!$size)
            return false;

        list($src_w, $src_h, $src_type) = $size;
        $src_mime = $size['mime'];
        switch($src_type) {
            case 1 :
                $img_type = 'gif';
                break;
            case 2 :
                $img_type = 'jpeg';
                break;
            case 3 :
                $img_type = 'png';
                break;
            case 15 :
                $img_type = 'wbmp';
                break;
            default :
                return false;
        }

        //if (!isset($width))
        //    $width = $src_w * ($height / $src_h);
        //if (!isset($height))
            $height = $src_h * ($width / $src_w);

        $imagecreatefunc = 'imagecreatefrom' . $img_type;
        $src_img = $imagecreatefunc($src);
        $dest_img = imagecreatetruecolor($width, $height);
        imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $width, $height, $src_w, $src_h);

        $imagefunc = 'image' . $img_type;

        if ($filename) {
            $imagefunc($dest_img, $filename);
        } 
        else {
        //    header('Content-Type: ' . $src_mime);
        //    $imagefunc($dest_img);
        }
        imagedestroy($src_img);
        imagedestroy($dest_img);
        return true;
    }

    // 接收图片信息
    private function receiveImage($object)
    {   
        // $mediaid=$object->MediaId;
        //获取用户在公众号的唯一标志符openID
        $fromusername=$object->FromUserName;
        $picurl=$object->PicUrl;

        function downloadWeixinFile($url){
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_HEADER,0);
            curl_setopt($ch, CURLOPT_NOBODY, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $package=curl_exec($ch);
            curl_close($ch);
            return $package;
        }

        function saveWeixinFile($filename,$filecontent){
            $local_file=fopen($filename,'w');
            if(false!==$local_file){
                if(false!==fwrite($local_file, $filecontent)){
                    fclose($local_file);
                }
            }
        }
        echo "success";
        $sql3 = "SELECT * from 表名    WHERE openId='$fromusername' and mark='0' and isDeleted=0 order by createTime desc limit 1";

        $query3 = mysqli_query($_SERVER['$conn'], $sql3);
        $row3=mysqli_fetch_array($query3);

        $time=time();
        if($row3!=null){
            $id=$row3['id'];
            $url=$picurl;
            $fileInfo=downloadWeixinFile($url);
            //源文件
            $filename="img/".$fromusername.$time.".jpg";
            //压缩图片
            $filename2="img/".$fromusername.$time."_s".".jpg";
            saveWeixinFile($filename,$fileInfo);

            $this->mkThumbnail($filename, 484, $filename2);
//判断用户姓名,手机,作品名是否已全部填完            
if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""&&$row3['imgsrc']==""){
                $sql2 = "UPDATE 表名   SET imgsrc='$filename2',mark='1',kind='1' WHERE id='$id'";
                $query2 = mysqli_query($_SERVER['$conn'], $sql2);
                $content ="感谢您提交作品参赛!现在您可以<a href='http://www.xxxxxx.com/xxxx/index.html'>去欣赏参赛作品</a>。";
            }else if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""&&$row3['img']!=""){
                $content ="观迎关注";
            }else{
                $content ="观迎关注";
            }
        }else{
            $content ="观迎关注";
        }



        $result = $this->transmitText($object, $content);
        return $result;
    }

    // 接收视频信息
    private function receiveVideo($object)
    {   
        $mediaid=$object->MediaId;
        $thumbmediaid=$object->ThumbMediaId;
        $fromusername=$object->FromUserName;
        // $content=$thumbmediaid;

        function downloadWeixinFile($url){
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_HEADER,0);
            curl_setopt($ch, CURLOPT_NOBODY, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $package=curl_exec($ch);
            curl_close($ch);
            return $package;
        }

        function saveWeixinFile($filename,$filecontent){
            $local_file=fopen($filename,'w');
            if(false!==$local_file){
                if(false!==fwrite($local_file, $filecontent)){
                    fclose($local_file);
                }
            }
        }

        $appid=$_SERVER['$appid'];
        $appsecret=$_SERVER['$appsecret'];
        //Get access_token
        $access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $access_token_url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl,  CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($curl);
        if (curl_errno($curl)){
            return 'ERROR'.curl_error($curl);
        }
        curl_close($curl);
        $access_token_array = json_decode($data,1);//对 JSON 格式的字符串进行解码,转换为 PHP 变量,自带函数
        //获取access_token
        $access_token = $access_token_array['access_token'];//获取access_token对应的值

        $url="http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$access_token&media_id=$thumbmediaid";
        $url2="http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$access_token&media_id=$mediaid";
        $time=time();

        echo "success";

        $sql3 = "SELECT * from 表名    WHERE openId='$fromusername' and mark='0' and isDeleted=0 order by createTime desc limit 1";

        $query3 = mysqli_query($_SERVER['$conn'], $sql3);
        $row3=mysqli_fetch_array($query3);

        if($row3!=null){
            $id=$row3['id'];
            $fileInfo=downloadWeixinFile($url);
            //视频缩略图
            $filename="video/".$fromusername.$time.".jpg";
            saveWeixinFile($filename,$fileInfo);

            $fileInfo2=downloadWeixinFile($url2);
            //视频源文件
            $filename2="videosrc/".$fromusername.$time.".mp4";
            saveWeixinFile($filename2,$fileInfo2);

            if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""&&$row3['video_img']==""){
                $sql2 = "UPDATE 表名   SET video_img='$filename',videosrc='$filename2',mark='1',kind='0' WHERE openId='$fromusername' and id='$id'";
                $query2 = mysqli_query($_SERVER['$conn'], $sql2);
                $content ="感谢您提交作品参赛!现在您可以<a href='http://www.xxxxx.com/xxxxx/index.html'>去欣赏参赛作品</a>";
            }else if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""&&$row3['video_img']!=""){
                $content ="观迎关注";
            }else{
                $content ="观迎关注";
            }

        }else{
            $content ="观迎关注";
        }


        $result = $this->transmitText($object, $content);
        return $result;
    }

    private function receiveEvent($object)
    {   
        $fromusername=$object->FromUserName;
        $content = "";
        switch ($object->Event)
        {
            case "subscribe":
                $content = "欢迎关注";
                break;
            case "unsubscribe":
                $content = "取消关注";
                break;
            case "CLICK":
                if($object->EventKey =="yxds_submit"){
                    $sql6 = "DELETE from  表名   where openId='$fromusername' and mark = 0";
                    $query6 = mysqli_query($_SERVER['$conn'], $sql6);

                    $createTime=date('Y-m-d H:i:s', time());
                    $sql="INSERT into 表名   (openId,createTime,isDeleted,mark,clicks,praise,frost) values ('$fromusername','$createTime','0','0','0','0','0')";
                    $query=mysqli_query($_SERVER['$conn'], $sql);
                    if(!$query){
                        $this->logger("失败");
                        $content = "记录失败";
                    }else{
                        $content = "欢迎参赛,作品提交完成前,您可以随时发送“取消”一词(不含引号)退出报名。请输入并发送您的姓名";
                    }
                }else{
                    $content = "欢迎关注";
                }
                break;
        }
        $result = $this->transmitText($object, $content);
        return $result;
    }

    //接收文本消息
    private function receiveText($object)
    {
        $keyword = trim($object->Content);
        $fromusername=$object->FromUserName;

        if($keyword=="影像大赛"){
            $sql6 = "DELETE from  表名   where openId='$fromusername' and mark = 0";
            $query6 = mysqli_query($_SERVER['$conn'], $sql6);

            $createTime=date('Y-m-d H:i:s', time());
            $sql="INSERT into 表名   (openId,createTime,isDeleted,mark,clicks,praise,frost) values ('$fromusername','$createTime','0','0','0','0','0')";
            $query=mysqli_query($_SERVER['$conn'], $sql);
            if(!$query){
                $this->logger("失败");
                $content = "记录失败";
            }else{
                $content = "欢迎参赛,作品提交完成前,您可以随时发送“取消”一词(不含引号)退出报名。请输入并发送您的姓名";
            }

        }else  if($keyword=="作品欣赏"){
            $content ="http://www.xxxxxxx.com/xxxxx/index.html";
        }else if(strpos($keyword,'取消')!== false){
                $sql7="SELECT COUNT(*) FROM 表名   where openId='$fromusername' and mark=0 and isDeleted = 0";
                $count=mysqli_fetch_array(mysqli_query($_SERVER['$conn'], $sql7))[0];
                if($count>0){
                    $sql4 = "DELETE from  表名   where openId='$fromusername' and mark = 0";
                    $query4 = mysqli_query($_SERVER['$conn'], $sql4);
                    $content = "已经退出报名,期待您下次提交作品。";
                }else{
                    $content ="欢迎关注";
                }

        }else{
            $sql3 = "SELECT * from 表名    WHERE openId='$fromusername' and mark=0 and isDeleted = 0  order by createTime desc ";
            $query3 = mysqli_query($_SERVER['$conn'], $sql3);
            $row3=mysqli_fetch_array($query3);
            if($row3==null){
                $content ="欢迎关注";
            }else{
                $id=$row3['id'];

                if($row3['name']==""){
                    $sql2 = "UPDATE 表名   SET name='$keyword' WHERE openId='$fromusername' and id='$id'";
                    $query2 = mysqli_query($_SERVER['$conn'], $sql2);
                    $content ="请输入并发送您的手机号码。";

                }else if($row3['phone']==""){
                    $sql2 = "UPDATE 表名   SET phone='$keyword' WHERE openId='$fromusername' and id='$id'";
                    $query2 = mysqli_query($_SERVER['$conn'], $sql2);
                    $content ="请输入并发送您参赛作品的标题。";

                }else if($row3['title']==""){
                    $sql2 = "UPDATE 表名   SET title='$keyword' WHERE openId='$fromusername' and id='$id'";
                    $query2 = mysqli_query($_SERVER['$conn'], $sql2);
                    $content ="请发送您的参赛作品(单张照片或视频)。";

                }else if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""){
                    $content ="欢迎关注";
                }
            }
            mysqli_close($_SERVER['$conn']);

        }

        $result = $this->transmitText($object, $content);
        return $result;
    }


    private 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);
        return $result;
    }

    private function transmitNews($object, $arr_item)
    {
        if(!is_array($arr_item))
            return;

        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($arr_item as $item)
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);

        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
        return $result;
    }

    private function transmitMusic($object, $musicArray)
    {
        $itemTpl = "<Music>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <MusicUrl><![CDATA[%s]]></MusicUrl>
    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";

        $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    private function logger($log_content)
    {
        if(isset($_SERVER['HTTP_APPNAME'])){   //SAE
            //sae_set_display_errors(false);
            //sae_debug($log_content);
            //sae_set_display_errors(true);
        }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL
            $max_size = 10000;
            $log_filename = "log.xml";
            if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
            file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);
        }
    }
}


?>

如有疑问可在下方评论——

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值