热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要介绍了详解使用php调用微信接口上传永久素材,
这篇文章主要介绍了详解使用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同步平台数据接口

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

接口常量


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 '
'; $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 '
'; 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中文网其它相关文章!


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 大连微软技术社区举办《.net core始于足下》活动,获得微软赛百味和易迪斯的赞助
    九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • jmeter实践:从csv中获取带引号的数据详情的技巧和运行全部数据的方法
    本文分享了jmeter实践中从csv中获取带引号的数据的解决办法,包括设置CSV Data Set Config和运行脚本获取数据的方法。另外还介绍了循环运行csv中全部数据的解决方法,避免每次修改csv用例都需要修改脚本的麻烦。通过了解和掌握工具的细节点,可以更好地解决问题和提高技术水平。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 企业数据应用挑战及元数据管理的重要性
    本文主要介绍了企业在日常经营管理过程中面临的数据应用挑战,包括数据找不到、数据读不懂、数据不可信等问题。针对这些挑战,通过元数据管理可以实现数据的可见、可懂、可用,帮助业务快速获取所需数据。文章提出了“灵魂”三问——元数据是什么、有什么用、又该怎么管,强调了元数据管理在企业数据治理中的基础和前提作用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
author-avatar
心雨00937
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有