详解使用php调用微信接口上传永久素材
功能需求
公司新开的公众号需要将公司平台现在的所有精品文章都导入,手动导入会有很多的工作量,所以采用自动化同步文章的方式来达到效果
开发说明
微信open api提供了新增永久素材的接口,本次功能是基于这个接口进行数据同步的
使用到的接口
- 获取永久素材列表接口material/batchget_material
- 新增永久素材接口material/add_news
- 新增媒体文件接口material/add_material
- 图文类型
- 单图文(要求有默认的封面,需要提前上传到微信公众号后台)
环境要求
php版本5.5以下(因为狼蚁网站SEO优化代码中的上传媒体文件必须要求在此环境,否则会调用微信接口失败)
开发流程
1、从公司平台获取所有的文章列表
2、遍历文章列表,查看文章是否有图片附件,若有进行第三步,否则进行第四步
3、检测所有的附件,取出第一个图片附件,并调用新增媒体文件接口上传图片获得返回后的media_id
4、调用素材列表接口获取默认的封面图片,并从中得到的数据中获取media_id
5、根据返回获取到的media_id开始调用上传图文接口上传素材
6、记录返回信息
接口设计
获取微信素材列表接口
此接口是用于获取默认的图片media_id同步平台数据接口
此接口是用户同步我们自己的文章数据到微信功能实现
接口常量
private $app_id = 'wx189ae9fa8816b131'; private $app_secret = '36f5f430c591acbae3505fe877733283'; const API_URL_PREFIX = 'https://api.weixin.qq./cgi-bin'; const MEDIA_FOREVER_UPLOAD_URL = '/material/add_material?'; const MEDIA_FOREVER_NEWS_UPLOAD_URL = '/material/add_news?'; const MEDIA_FOREVER_NEWS_UPDATE_URL = '/material/update_news?'; const MEDIA_FOREVER_GET_URL = '/material/get_material?'; const MEDIA_FOREVER_DEL_URL = '/material/del_material?'; const MEDIA_FOREVER_COUNT_URL = '/material/get_materialcount?'; const MEDIA_FOREVER_BATCHGET_URL = '/material/batchget_material?';
获取微信素材列表接口
action接口方法
说明该方法为此接口的入口方法
调用方式http://${domain}/weixin/get_articles/
/ 获取图片素材接口 / public function get_articles_action(){ $token = $this->get_aess_token(); $list = $this->getForeverList($token,'image',0,20); echo json_encode($list); } get_aess_token方法 private function get_aess_token() { $aess_token = AWS_APP::cache()->get('aess_token'); if(!$aess_token){ error_log('get aess_token from weixin '); $appId = $this->app_id; $appSecret = $this->app_secret; $url = "https://api.weixin.qq./cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$appSecret"; $res = json_decode($this -> httpGet($url)); $aess_token = $res -> aess_token; AWS_APP::cache()->set('aess_token',$aess_token,time()+3600); }else{ error_log('get aess_token from cache '); } error_log('aess_token is :'.$aess_token); return $aess_token; }
调用微信素材接口方法
说明该方法为调用微信获取永久素材列表接口方法
/ 获取永久素材列表 @param $token @param $type 类型有image,vedio和audio @param $offset 起始位置,0表示从第一个 @param $count 个数,区间为0~20 / public function getForeverList($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.'aess_token='.$token, self::json_encode($data) ); error_log('forever list is :'.$result); if ($result) { $json = json_decode($result,true); if (isset($json['errcode'])) { $this->errCode = $json['errcode']; $this->errMsg = $json['errmsg']; return false; } return $json; } return false; }
同步文章到微信接口
action方法
说明该方法为此接口的入口方法
调用方式http://${domain}/weixin/upload_article/
/ 同步问答的文章到订阅号上接口 / public function index_action(){ $article_list = $this->model('article')->get_articles_list(null, 1, 18, 'add_time DESC'); $aess_token = $this->get_aess_token(); $base_url = 'http://wenda.qiezilife./article/'; foreach ($article_list as $key => $article){ if($article['has_attach']){ $attaches = $this->model('publish')->get_attach('article', $article['id'], 'max'); foreach ($attaches as $i => $a){ //过滤获取第一张图片 if($a['is_image']){ $attache = $a; break; } } $img = $attache['path']; $size = filesize($img); echo $img.',size is :'.$size; echo '<br/>'; $file_info = array( 'filename' => $img, 'content-type' => 'image/jpg', //文件类型 'filelength' => $size ); $upload_img_result = $this->upload_meterial($file_info,$aess_token); $media_id = $upload_img_result; error_log('media_id is ===============>'.$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($aess_token,$data); echo self::json_encode($result); error_log('upload_article result is : '.json_encode($result)); error_log('============================upload end============================'); } }
uploadForeverArticles方法
说明该方法为调用微信上传永久素材接口方法
/ 上传永久图文素材(认证后的订阅号可用) 新增的永久素材也可以在公众平台官网素材管理模块中看到 @param array $data 消息结构{"articles":[{...}]} @return boolean|array / public function uploadForeverArticles($aess_token,$data){ error_log('post data is=======> '.self::json_encode($data)); $url = self::API_URL_PREFIX.self::MEDIA_FOREVER_NEWS_UPLOAD_URL.'aess_token='.$aess_token; $result = HTTP::request($url, 'POST', self::json_encode($data)); error_log('weixin return result is =====>'.$result); if ($result) { $json = json_decode($result,true); if (!$json || !empty($json['errcode'])) { $this->errCode = $json['errcode']; $this->errMsg = $json['errmsg']; return false; } return $json; } return false; }
upload_meterial方法
说明该方法为调用微信上传永久素材接口方法
/ 请注意该方法必须保证php的版本在5.6以下,否则会爆40015错误 / function upload_meterial($file_info,$aess_token){ $url="https://api.weixin.qq./cgi-bin/material/add_material?aess_token={$aess_token}&type=image"; $ch1 = 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_set ( $ch1, CURLOPT_URL, $url ); curl_set ( $ch1, CURLOPT_POST, 1 ); curl_set ( $ch1, CURLOPT_RETURNTRANSFER, 1 ); curl_set ( $ch1, CURLOPT_CONNECTTIMEOUT, $timeout ); curl_set ( $ch1, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_set ( $ch1, CURLOPT_SSL_VERIFYHOST, false ); curl_set ( $ch1, CURLOPT_POSTFIELDS, $data ); $result = curl_exec ( $ch1 ); echo '<br/>'; echo 'reulst is ==========>'.$result; curl_close ( $ch1 ); if(curl_errno()==0){ $result=json_decode($result,true); //var_dump($result); return $result['media_id']; }else { return false; } }
http_post方法
说明该方法为调http post请求方法
/ POST 请求 @param string $url @param array $param @param boolean $post_file 是否文件上传 @return string content / private function http_post($url,$param,$post_file=false){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_set($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_set($oCurl, CURLOPT_SSL_VERIFYHOST, false); curl_set($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } if (is_string($param) || $post_file) { $strPOST = $param; } else { $aPOST = array(); foreach($param as $key=>$val){ $aPOST[] = $key."=".urlencode($val); } $strPOST = join("&", $aPOST); } curl_set($oCurl, CURLOPT_URL, $url); curl_set($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_set($oCurl, CURLOPT_POST,true); curl_set($oCurl, CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } }
遇到的问题
在开发的过程中,在调用微信上传媒体文件时候始终得到的返回数据为
{"errcode":41005,"errmsg":"media data missing hint: [3fSt_0048e297]"}
原因php版本的问题,我本机的版本5.6,而带有@识别的php方法必须是5.5以下才能识别,5.5以上的版本将这个特性去除了。
解决方法更换php的版本到5.5或者5.5以下,不更换php的版本的方法暂时没有找到
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程