背景:因公司业务需求,需通过企业微信的推送应用消息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; //将结果返回
     }