详解使用php调用微信接口上传永久素材

功能需求

公司新开的公众号需要将公司平台现在的所有精品文章都导入,手动导入会有很多的工作量,所以采用自动化同步文章的方式来达到效果

开发说明

微信open api提供了新增永久素材的接口,本次功能是基于这个接口进行数据同步的

使用到的接口

  1. 获取永久素材列表接口:material/batchget_material
  2. 新增永久素材接口:material/add_news
  3. 新增媒体文件接口:material/add_material
  4. 图文类型
  5. 单图文(要求有认的封面,需要提前上传到微信公众号后台

环境要求

PHP版本:5.5以下(因为下面代码中的上传媒体文件必须要求在此环境,否则会调用微信接口失败)

开发流程

1、从公司平台获取所有的文章列表 2、遍历文章列表,查看文章是否有图片附件,若有进行第三步,否则进行第四步 3、检测所有的附件,取出第一个图片附件,并调用新增媒体文件接口上传图片获得返回后的media_id 4、调用素材列表接口获取认的封面图片,并从中得到的数据中获取media_id 5、根据返回获取到的media_id开始调用上传图文接口上传素材 6、记录返回信息

接口设计

获取微信素材列表接口

此接口是用于获取认的图片media_id同步平台数据接口

此接口是用户同步我们自己的文章数据到微信功能实现

接口常量

rush:PHP;"> private $app_id = 'wx189ae9fa8816b131'; private $app_secret = '36f5f430c591acbae3505fe877733283'; const API_URL_PREFIX = 'https://api.weixin.qq.com/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/

get_access_token(); $list = $this->getForeverList($token,'image',20); echo json_encode($list); } get_access_token方法

private function get_access_token() {
$access_token = AWS_APP::cache()->get('access_token');
if(!$access_token){
error_log('get access_token from weixin ');
$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('get access_token from cache ');
}
error_log('access_token is :'.$access_token);
return $access_token;
}

调用微信素材接口方法

说明:该方法调用微信获取永久素材列表接口方法

$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('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/

model('article')->get_articles_list(null,1,18,'add_time DESC'); $access_token = $this->get_access_token(); $base_url = 'http://wenda.qiezilife.com/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 '
';
$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_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($access_token,$data);
echo self::json_encode($result);
error_log('upload_article result is : '.json_encode($result));
error_log('============================upload end============================');

}
}

uploadForeverArticles方法

说明:该方法调用微信上传永久素材接口方法

'.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('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方法

说明:该方法调用微信上传永久素材接口方法

"@{$real_path}",'form-data'=>$file_info); curl_setopt ( $ch1,CURLOPT_URL,$url ); curl_setopt ( $ch1,CURLOPT_POST,1 ); curl_setopt ( $ch1,CURLOPT_RETURNTRANSFER,CURLOPT_CONNECTTIMEOUT,$timeout ); curl_setopt ( $ch1,CURLOPT_SSL_VERIFYPEER,FALSE ); curl_setopt ( $ch1,CURLOPT_SSL_VERIFYHOST,false ); curl_setopt ( $ch1,CURLOPT_POSTFIELDS,$data ); $result = curl_exec ( $ch1 ); echo '
'; 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请求方法

$val){ $aPOST[] = $key."=".urlencode($val); } $strPOST = join("&",$aPOST); } curl_setopt($oCurl,$url); curl_setopt($oCurl,1 ); curl_setopt($oCurl,true); curl_setopt($oCurl,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } }

遇到的问题

在开发的过程中,在调用微信上传媒体文件时候始终得到的返回数据为

rush:plain;"> {"errcode":41005,"errmsg":"media data missing hint: [3fSt_0048e297]"}

原因:PHP版本的问题,我本机的版本5.6,而带有@识别的PHP方法必须是5.5以下才能识别,5.5以上的版本将这个特性去除了。

解决方法:更换PHP的版本到5.5或者5.5以下,不更换PHP的版本的方法暂时没有找到

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用