企业微信上传临时素材API,并通过企业微信应用消息推送API推送出去

背景:因公司业务需求,需通过企业微信的推送应用消息API推送一张.jpg格式的图片;查阅企业微信API文档后,得知想要发送图片消息,需先将要发送的图片素材通过企业微信的上传临时素材接口,将其上传至企业微信服务器上才可通过media_id发送该图片;在此期间受到的坑很多,也在网上查找了很多资料,但结果还是不太满意,为了以后的自己和有着同样困惑的码友们再遇到同类的问题,故在此做一个记录,希望可以帮助到大家,其中有什么不合适的地方,还请诸位码友,指出教导,谢谢!


echo "

";

$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; //将结果返回
    }

你可能感兴趣的:(php)