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