如何使用php调用微信接口上传永久素材
这篇文章主要介绍如何使用php调用微信接口上传永久素材,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
功能需求
公司新开的公众号需要将公司平台现在的所有精品文章都导入,手动导入会有很多的工作量,所以采用自动化同步文章的方式来达到效果
开发说明
微信open api提供了新增永久素材的接口,本次功能是基于这个接口进行数据同步的
使用到的接口
获取永久素材列表接口:material/batchget_material
新增永久素材接口:material/add_news
新增媒体文件接口:material/add_material
图文类型
单图文(要求有默认的封面,需要提前上传到微信公众号后台)
环境要求
php版本:5.5以下(因为下面代码中的上传媒体文件必须要求在此环境,否则会调用微信接口失败)
开发流程
1、从公司平台获取所有的文章列表2、遍历文章列表,查看文章是否有图片附件,若有进行第三步,否则进行第四步3、检测所有的附件,取出第一个图片附件,并调用新增媒体文件接口上传图片获得返回后的media_id4、调用素材列表接口获取默认的封面图片,并从中得到的数据中获取media_id5、根据返回获取到的media_id开始调用上传图文接口上传素材6、记录返回信息
接口设计
获取微信素材列表接口
此接口是用于获取默认的图片media_id同步平台数据接口
此接口是用户同步我们自己的文章数据到微信功能实现
接口常量
private$app_id='wx189ae9fa8816b131'; private$app_secret='36f5f430c591acbae3505fe877733283'; constAPI_URL_PREFIX='https://api.weixin.qq.com/cgi-bin'; constMEDIA_FOREVER_UPLOAD_URL='/material/add_material?'; constMEDIA_FOREVER_NEWS_UPLOAD_URL='/material/add_news?'; constMEDIA_FOREVER_NEWS_UPDATE_URL='/material/update_news?'; constMEDIA_FOREVER_GET_URL='/material/get_material?'; constMEDIA_FOREVER_DEL_URL='/material/del_material?'; constMEDIA_FOREVER_COUNT_URL='/material/get_materialcount?'; constMEDIA_FOREVER_BATCHGET_URL='/material/batchget_material?';
获取微信素材列表接口
action接口方法
说明:该方法为此接口的入口方法
调用方式:http://${domain}/weixin/get_articles/
/** *获取图片素材接口 */ publicfunctionget_articles_action(){ $token=$this->get_access_token(); $list=$this->getForeverList($token,'image',0,20); echojson_encode($list); } get_access_token方法 privatefunctionget_access_token(){ $access_token=AWS_APP::cache()->get('access_token'); if(!$access_token){ error_log('getaccess_tokenfromweixin'); $appId=$this->app_id; $appSecret=$this->app_secret; $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$appSecret"; $res=json_decode($this->httpGet($url)); $access_token=$res->access_token; AWS_APP::cache()->set('access_token',$access_token,time()+3600); }else{ error_log('getaccess_tokenfromcache'); } error_log('access_tokenis:'.$access_token); return$access_token; }
调用微信素材接口方法
说明:该方法为调用微信获取永久素材列表接口方法
/** *获取永久素材列表 *@param$token *@param$type类型有image,vedio和audio *@param$offset起始位置,0表示从第一个 *@param$count个数,区间为0~20 */ publicfunctiongetForeverList($token,$type,$offset,$count){ $data=array( 'type'=>$type, 'offset'=>$offset, 'count'=>$count, ); $result=$this->http_post( self::API_URL_PREFIX.self::MEDIA_FOREVER_BATCHGET_URL.'access_token='.$token, self::json_encode($data) ); error_log('foreverlistis:'.$result); if($result) { $json=json_decode($result,true); if(isset($json['errcode'])){ $this->errCode=$json['errcode']; $this->errMsg=$json['errmsg']; returnfalse; } return$json; } returnfalse; }
同步文章到微信接口
action方法
说明:该方法为此接口的入口方法
调用方式:http://${domain}/weixin/upload_article/
/** *同步问答的文章到订阅号上接口 */ publicfunctionindex_action(){ $article_list=$this->model('article')->get_articles_list(null,1,18,'add_timeDESC'); $access_token=$this->get_access_token(); $base_url='http://wenda.qiezilife.com/article/'; foreach($article_listas$key=>$article){ if($article['has_attach']){ $attaches=$this->model('publish')->get_attach('article',$article['id'],'max'); foreach($attachesas$i=>$a){ //过滤获取第一张图片 if($a['is_image']){ $attache=$a; break; } } $img=$attache['path']; $size=filesize($img); echo$img.',sizeis:'.$size; echo'<br/>'; $file_info=array( 'filename'=>$img, 'content-type'=>'image/jpg',//文件类型 'filelength'=>$size ); $upload_img_result=$this->upload_meterial($file_info,$access_token); $media_id=$upload_img_result; error_log('media_idis===============>'.$media_id); }else{ $media_id='1PoTp0SqruwWu_HX0HR_jUp4STX5HSpYkibb1Ca8ZQA'; } $articles=array(); //上传图片成功了就开始上传图文 $upload_article_data=array( 'title'=>$article['title'], 'thumb_media_id'=>$media_id, 'author'=>'茄子营养师', 'digest'=>'茄子生活,你的品质生活指南', 'show_cover_pic'=>1, 'content'=>$article['message'], 'content_source_url'=>$base_url.$article['id'] ); $articles[]=$upload_article_data; $data=array( 'articles'=>$articles ); $result=$this->uploadForeverArticles($access_token,$data); echoself::json_encode($result); error_log('upload_articleresultis:'.json_encode($result)); error_log('============================uploadend============================'); } }
uploadForeverArticles方法
说明:该方法为调用微信上传永久素材接口方法
/** *上传永久图文素材(认证后的订阅号可用) *新增的永久素材也可以在公众平台官网素材管理模块中看到 *@paramarray$data消息结构{"articles":[{...}]} *@returnboolean|array */ publicfunctionuploadForeverArticles($access_token,$data){ error_log('postdatais=======>'.self::json_encode($data)); $url=self::API_URL_PREFIX.self::MEDIA_FOREVER_NEWS_UPLOAD_URL.'access_token='.$access_token; $result=HTTP::request($url,'POST',self::json_encode($data)); error_log('weixinreturnresultis=====>'.$result); if($result) { $json=json_decode($result,true); if(!$json||!empty($json['errcode'])){ $this->errCode=$json['errcode']; $this->errMsg=$json['errmsg']; returnfalse; } return$json; } returnfalse; }
upload_meterial方法
说明:该方法为调用微信上传永久素材接口方法
/** *请注意该方法必须保证php的版本在5.6以下,否则会爆40015错误 */ functionupload_meterial($file_info,$access_token){ $url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={$access_token}&type=image"; $ch2=curl_init(); $timeout=5; $real_path="{$file_info['filename']}"; //$real_path=str_replace("/","\\",$real_path); $data=array("media"=>"@{$real_path}",'form-data'=>$file_info); curl_setopt($ch2,CURLOPT_URL,$url); curl_setopt($ch2,CURLOPT_POST,1); curl_setopt($ch2,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch2,CURLOPT_CONNECTTIMEOUT,$timeout); curl_setopt($ch2,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch2,CURLOPT_SSL_VERIFYHOST,false); curl_setopt($ch2,CURLOPT_POSTFIELDS,$data); $result=curl_exec($ch2); echo'<br/>'; echo'reulstis==========>'.$result; curl_close($ch2); if(curl_errno()==0){ $result=json_decode($result,true); //var_dump($result); return$result['media_id']; }else{ returnfalse; } }
http_post方法
说明:该方法为调http post请求方法
/** *POST请求 *@paramstring$url *@paramarray$param *@paramboolean$post_file是否文件上传 *@returnstringcontent */ privatefunctionhttp_post($url,$param,$post_file=false){ $oCurl=curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($oCurl,CURLOPT_SSL_VERIFYHOST,false); curl_setopt($oCurl,CURLOPT_SSLVERSION,1);//CURL_SSLVERSION_TLSv1 } if(is_string($param)||$post_file){ $strPOST=$param; }else{ $aPOST=array(); foreach($paramas$key=>$val){ $aPOST[]=$key."=".urlencode($val); } $strPOST=join("&",$aPOST); } curl_setopt($oCurl,CURLOPT_URL,$url); curl_setopt($oCurl,CURLOPT_RETURNTRANSFER,1); curl_setopt($oCurl,CURLOPT_POST,true); curl_setopt($oCurl,CURLOPT_POSTFIELDS,$strPOST); $sContent=curl_exec($oCurl); $aStatus=curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return$sContent; }else{ returnfalse; } }
遇到的问题
在开发的过程中,在调用微信上传媒体文件时候始终得到的返回数据为
{"errcode":41005,"errmsg":"mediadatamissinghint:[3fSt_0048e297]"}
原因:php版本的问题,我本机的版本5.6,而带有@识别的php方法必须是5.5以下才能识别,5.5以上的版本将这个特性去除了。
解决方法:更换php的版本到5.5或者5.5以下,不更换php的版本的方法暂时没有找到
以上是“如何使用php调用微信接口上传永久素材”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!
推荐阅读
-
php字符串增加1如何实现
php字符串增加1如何实现这篇“php字符串增加1如何实现”文章的...
-
php如何判断字符串是否有中文
-
php如何实现字符串去掉头尾
-
php字符串的组成是什么
php字符串的组成是什么这篇文章主要讲解了“php字符串的组成是什...
-
php如何让Swoole/Pool进程池实现Redis持久连接
php如何让Swoole/Pool进程池实现Redis持久连接本篇...
-
php字符串长度不一致如何解决
-
php时区不正确如何解决
-
php+fread()乱码如何解决
php+fread()乱码如何解决本篇内容介绍了“php+frea...
-
php explode报错如何解决
-
linux Centos如何安装PHP7
linuxCentos如何安装PHP7今天小编给大家分享一下li...