详解使用php调用微信接口上传永久素材
发布时间 - 2026-01-11 00:36:52 点击率:次功能需求

公司新开的公众号需要将公司平台现在的所有精品文章都导入,手动导入会有很多的工作量,所以采用自动化同步文章的方式来达到效果
开发说明
微信open api提供了新增永久素材的接口,本次功能是基于这个接口进行数据同步的
使用到的接口
- 获取永久素材列表接口:material/batchget_material
- 新增永久素材接口:material/add_news
- 新增媒体文件接口:material/add_material
- 图文类型
- 单图文(要求有默认的封面,需要提前上传到微信公众号后台)
环境要求
php版本:5.5以下(因为下面代码中的上传媒体文件必须要求在此环境,否则会调用微信接口失败)
开发流程
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.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/
/**
* 获取图片素材接口
*/
public function get_articles_action(){
$token = $this->get_access_token();
$list = $this->getForeverList($token,'image',0,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;
}
调用微信素材接口方法
说明:该方法为调用微信获取永久素材列表接口方法
/**
* 获取永久素材列表
* @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.'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/
/**
* 同步问答的文章到订阅号上接口
*/
public function index_action(){
$article_list = $this->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 '<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_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方法
说明:该方法为调用微信上传永久素材接口方法
/**
* 上传永久图文素材(认证后的订阅号可用)
* 新增的永久素材也可以在公众平台官网素材管理模块中看到
* @param array $data 消息结构{"articles":[{...}]}
* @return boolean|array
*/
public function uploadForeverArticles($access_token,$data){
error_log('post data is=======> '.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方法
说明:该方法为调用微信上传永久素材接口方法
/**
* 请注意该方法必须保证php的版本在5.6以下,否则会爆40015错误
*/
function upload_meterial($file_info,$access_token){
$url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={$access_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_setopt ( $ch1, CURLOPT_URL, $url );
curl_setopt ( $ch1, CURLOPT_POST, 1 );
curl_setopt ( $ch1, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch1, 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 '<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_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($param as $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{
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的版本的方法暂时没有找到
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# php
# 微信上传永久素材
# 上传永久图文素材
# 微信上传永久图片素材
# 微信小程序开发之获取用户手机号码(php接口解密)
# ThinkPHP框架实现的微信支付接口开发完整示例
# php获取微信基础接口凭证Access_token
# PHP封装的微信公众平台接口开发操作类完整示例
# thinkPHP微信分享接口JSSDK用法实例
# PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
# php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
# PHP配合微信小程序实现获取手机号码详解
# 微信小程序结合ThinkPHP5授权登陆后获取手机号
# PHP请求微信接口获取用户电话号功能示例
# 上传
# 第一个
# 则会
# 文章列表
# 上传图片
# 自己的
# 会有
# 在此
# 遍历
# 新开
# 请注意
# 若有
# 本机
# 没有找到
# 第一张
# 解决方法
# 并从
# 第三步
# 官网
# 大家多多
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Vite进行前端资源打包?(配置示例)
Laravel如何实现多对多模型关联?(Eloquent教程)
Internet Explorer官网直接进入 IE浏览器在线体验版网址
大连 网站制作,大连天途有线官网?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何快速搭建高效服务器建站系统?
如何用美橙互联一键搭建多站合一网站?
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
如何快速完成中国万网建站详细流程?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
如何安全更换建站之星模板并保留数据?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel怎么判断请求类型_Laravel Request isMethod用法
WordPress 子目录安装中正确处理脚本路径的完整指南
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
微信小程序 require机制详解及实例代码
大型企业网站制作流程,做网站需要注册公司吗?
Android 常见的图片加载框架详细介绍
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
使用豆包 AI 辅助进行简单网页 HTML 结构设计
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
网站制作免费,什么网站能看正片电影?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
网站建设保证美观性,需要考虑的几点问题!
JavaScript Ajax实现异步通信
如何快速搭建二级域名独立网站?
如何在企业微信快速生成手机电脑官网?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel怎么使用Intervention Image库处理图片上传和缩放
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel如何实现数据库事务?(DB Facade示例)
微信小程序 配置文件详细介绍
历史网站制作软件,华为如何找回被删除的网站?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
北京的网站制作公司有哪些,哪个视频网站最好?
如何快速登录WAP自助建站平台?
Android okhttputils现在进度显示实例代码
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
如何在万网自助建站中设置域名及备案?
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
php485函数参数是什么意思_php485各参数详细说明【介绍】
Android GridView 滑动条设置一直显示状态(推荐)
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】

