背景:因公司業務需求,需通過企業微信的推送應用消息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; //將結果返回
}