企業微信上傳臨時素材API,並通過企業微信應用消息推送API推送出去

背景:因公司業務需求,需通過企業微信的推送應用消息API推送一張.jpg格式的圖片;查閱企業微信API文檔後,得知想要發送圖片消息,需先將要發送的圖片素材通過企業微信的上傳臨時素材接口,將其上傳至企業微信服務器上纔可通過media_id發送該圖片;在此期間受到的坑很多,也在網上查找了很多資料,但結果還是不太滿意,爲了以後的自己和有着同樣困惑的碼友們再遇到同類的問題,故在此做一個記錄,希望可以幫助到大家,其中有什麼不合適的地方,還請諸位碼友,指出教導,謝謝!


<?php
echo "<pre/>";

$info = array(); //定義一個空數組;
$info["media"] = '@'.__DIR__."/image.jpg"; //將要上傳的素材文件存入$info數組;

uploadMedia($info,"image");  //訪問uploadMedia函數;


//上傳臨時素材文件

function uploadMedia($data,$type)
{
    $token = $this->token(); //引入token
    $url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={$token}&type=" . $type; //上傳臨時素材API

    $result = http_post($url, $data, true); //構造訪問企業微信的API發送指定文本

    $rs = json_decode($result,true); //將返回的json串轉成數組
    //var_dump($result);
    //die;

//設置文本消息內容
        $notice = '{

       "touser" : "UserID1|UserID2|UserID3",

       "toparty" : "PartyID1|PartyID2",

       "totag" : "TagID1 | TagID2",

       "msgtype" : "image",

       "agentid" : 1,

       "image" : {

                 "media_id" : "'.$rs['media_id'].'"

                  },

       "safe":0

}';

        $data = $notice; //要發送的文本數據
        $url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=".$this->token(); //消息推送API
        $res = $this->https_request($url, $data); //訪問企業微信的API發送指定文本

}


/**
     * 獲取access_token
     **/
    public function token(){
        $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=企業ID&corpsecret=應用SECRET"; //獲取access_token的url
        $res = $this->https_request($url); //將要訪問的url傳入https_request
        $result = json_decode($res, true); //將$res返回的json結果轉成php數組格式
        $this->access_token = $result["access_token"]; //從轉義的數組中,取出access_token
        return $this->access_token;
    }


/**
       * 構造企業微信上傳臨時素材的請求鏈接
       **/
        function http_post($url,$param,$post_file=false){
            $oCurl = curl_init(); //初始化curl

            if(stripos($url,"http://")!==FALSE){ //判斷$url中是否存在"https://";如果存在的話就執行以下代碼
                curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); //關閉CURLOPT_SSL_VERIFYPEER服務-禁用後cURL將終止從服務端進行驗證
                curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); //不設置CURLOPT_SSL_VERIFYPEER服務-禁用後cURL將終止從服務端進行驗證
                curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //使用的SSL版本
            }
            if(PHP_VERSION_ID >= 50500 && class_exists('\CURLFile')){
                $is_curlFile = true;
            }else {
                $is_curlFile = false;
                if (defined('CURLOPT_SAFE_UPLOAD')) {
                    curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, false);
                }
            }

            if($post_file) {
                if($is_curlFile) {
                    foreach ($param as $key => $val) {
                        if(isset($val["tmp_name"])){
                            $param[$key] = new \CURLFile(realpath($val["tmp_name"]),$val["type"],$val["name"]);
                        }else if(substr($val, 0, 1) == '@'){
                            $param[$key] = new \CURLFile(realpath(substr($val,1)));
                        }
                    }
                }
                $strPOST = $param;
            }else{
                $strPOST = json_encode($param); //將數值轉換成json數據存儲格式
            }

            curl_setopt($oCurl, CURLOPT_URL, $url); //獲取的URL地址
            curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); //在啓用CURLOPT_RETURNTRANSFER的時候,返回原生的(Raw)輸出。
            curl_setopt($oCurl, CURLOPT_POST,true); //發送一個常規的POST請求,類型爲:application/x-www-form-urlencoded,就像表單提交的一樣。
            curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); //全部數據使用HTTP協議中的"POST"操作來發送。
            curl_setopt($oCurl, CURLOPT_VERBOSE, 1); //彙報所有的信息,存放在STDERR或指定的CURLOPT_STDERR中

            //curl_setopt($oCurl, CURLOPT_HEADER,  array( 'Expect:' ));  //將其刪掉返回的爲json串
            $sContent = curl_exec($oCurl); //執行一個cURL會話
            curl_close($oCurl); //關閉一個cURL會話

            return $sContent; //返回結果
        }


/**
     * 提交跳轉API
     * curl_setopt--模仿用戶的一些行爲
     **/
    private function https_request($url,$data = null){
        $curl = curl_init(); //初始化url
        curl_setopt($curl, CURLOPT_URL, $url); //用PHP取回的URL地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); //終止cURL從服務端進行驗證
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); //檢查公用名是否存在,並且是否與提供的主機名匹配
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1); //發送一個常規的POST請求,類型爲:application/x-www-form-urlencoded
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //傳遞一個作爲HTTP "POST"操作的所有數據的字符串
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //將curl_exec()獲取的信息以文件流的形式返回
        $output = curl_exec($curl); //獲取返回值
        curl_close($curl); //關閉一個cURL會話
        return $output; //將結果返回
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章