詳解使用php調(diào)用微信接口上傳永久素材
功能需求
公司新開(kāi)的公眾號(hào)需要將公司平臺(tái)現(xiàn)在的所有精品文章都導(dǎo)入,手動(dòng)導(dǎo)入會(huì)有很多的工作量,所以采用自動(dòng)化同步文章的方式來(lái)達(dá)到效果
開(kāi)發(fā)說(shuō)明
微信open api提供了新增永久素材的接口,本次功能是基于這個(gè)接口進(jìn)行數(shù)據(jù)同步的
使用到的接口
- 獲取永久素材列表接口:material/batchget_material
- 新增永久素材接口:material/add_news
- 新增媒體文件接口:material/add_material
- 圖文類(lèi)型
- 單圖文(要求有默認(rèn)的封面,需要提前上傳到微信公眾號(hào)后臺(tái))
環(huán)境要求
php版本:5.5以下(因?yàn)橄旅娲a中的上傳媒體文件必須要求在此環(huán)境,否則會(huì)調(diào)用微信接口失?。?/p>
開(kāi)發(fā)流程
1、從公司平臺(tái)獲取所有的文章列表
2、遍歷文章列表,查看文章是否有圖片附件,若有進(jìn)行第三步,否則進(jìn)行第四步
3、檢測(cè)所有的附件,取出第一個(gè)圖片附件,并調(diào)用新增媒體文件接口上傳圖片獲得返回后的media_id
4、調(diào)用素材列表接口獲取默認(rèn)的封面圖片,并從中得到的數(shù)據(jù)中獲取media_id
5、根據(jù)返回獲取到的media_id開(kāi)始調(diào)用上傳圖文接口上傳素材
6、記錄返回信息
接口設(shè)計(jì)
獲取微信素材列表接口
此接口是用于獲取默認(rèn)的圖片media_id同步平臺(tái)數(shù)據(jù)接口
此接口是用戶同步我們自己的文章數(shù)據(jù)到微信功能實(shí)現(xiàn)
接口常量
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接口方法
說(shuō)明:該方法為此接口的入口方法
調(diào)用方式: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;
}
調(diào)用微信素材接口方法
說(shuō)明:該方法為調(diào)用微信獲取永久素材列表接口方法
/**
* 獲取永久素材列表
* @param $token
* @param $type 類(lèi)型有image,vedio和audio
* @param $offset 起始位置,0表示從第一個(gè)
* @param $count 個(gè)數(shù),區(qū)間為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方法
說(shuō)明:該方法為此接口的入口方法
調(diào)用方式:http://${domain}/weixin/upload_article/
/**
* 同步問(wèn)答的文章到訂閱號(hào)上接口
*/
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){
//過(guò)濾獲取第一張圖片
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', //文件類(lèi)型
'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();
//上傳圖片成功了就開(kāi)始上傳圖文
$upload_article_data = array(
'title' => $article['title'],
'thumb_media_id' => $media_id,
'author' => '茄子營(yíng)養(yǎng)師',
'digest' => '茄子生活,你的品質(zhì)生活指南',
'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方法
說(shuō)明:該方法為調(diào)用微信上傳永久素材接口方法
/**
* 上傳永久圖文素材(認(rèn)證后的訂閱號(hào)可用)
* 新增的永久素材也可以在公眾平臺(tái)官網(wǎng)素材管理模塊中看到
* @param array $data 消息結(jié)構(gòu){"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方法
說(shuō)明:該方法為調(diào)用微信上傳永久素材接口方法
/**
* 請(qǐng)注意該方法必須保證php的版本在5.6以下,否則會(huì)爆40015錯(cuò)誤
*/
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方法
說(shuō)明:該方法為調(diào)http post請(qǐng)求方法
/**
* POST 請(qǐng)求
* @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;
}
}
遇到的問(wèn)題
在開(kāi)發(fā)的過(guò)程中,在調(diào)用微信上傳媒體文件時(shí)候始終得到的返回?cái)?shù)據(jù)為
{"errcode":41005,"errmsg":"media data missing hint: [3fSt_0048e297]"}
原因:php版本的問(wèn)題,我本機(jī)的版本5.6,而帶有@識(shí)別的php方法必須是5.5以下才能識(shí)別,5.5以上的版本將這個(gè)特性去除了。
解決方法:更換php的版本到5.5或者5.5以下,不更換php的版本的方法暫時(shí)沒(méi)有找到
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 微信小程序開(kāi)發(fā)之獲取用戶手機(jī)號(hào)碼(php接口解密)
- ThinkPHP框架實(shí)現(xiàn)的微信支付接口開(kāi)發(fā)完整示例
- php獲取微信基礎(chǔ)接口憑證Access_token
- PHP封裝的微信公眾平臺(tái)接口開(kāi)發(fā)操作類(lèi)完整示例
- thinkPHP微信分享接口JSSDK用法實(shí)例
- PHP實(shí)現(xiàn)微信JS-SDK接口選擇相冊(cè)及拍照并上傳的方法
- php微信高級(jí)接口調(diào)用方法(自定義菜單接口、客服接口、二維碼)
- PHP配合微信小程序?qū)崿F(xiàn)獲取手機(jī)號(hào)碼詳解
- 微信小程序結(jié)合ThinkPHP5授權(quán)登陸后獲取手機(jī)號(hào)
- PHP請(qǐng)求微信接口獲取用戶電話號(hào)功能示例
相關(guān)文章
PHP 傳輸會(huì)話curl函數(shù)的實(shí)例詳解
這篇文章主要介紹了PHP 傳輸會(huì)話curl函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
Laravel5.5 實(shí)現(xiàn)后臺(tái)管理登錄的方法(自定義用戶表登錄)
今天小編就為大家分享一篇Laravel5.5 實(shí)現(xiàn)后臺(tái)管理登錄的方法(自定義用戶表登錄),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
在laravel-admin中列表中禁止某行編輯、刪除的方法
今天小編就為大家分享一篇在laravel-admin中列表中禁止某行編輯、刪除的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
ThinkPHP獨(dú)立分組使用的注意事項(xiàng)
這篇文章主要介紹了ThinkPHP獨(dú)立分組使用的注意事項(xiàng),針對(duì)獨(dú)立分組的目錄結(jié)構(gòu)與分組之間的相互調(diào)用進(jìn)行了較為深入的分析,并指出了使用時(shí)的注意事項(xiàng),需要的朋友可以參考下2014-11-11
php生成靜態(tài)頁(yè)面并實(shí)現(xiàn)預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了php生成靜態(tài)頁(yè)面并實(shí)現(xiàn)預(yù)覽功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
在 Laravel 中 “規(guī)范” 的開(kāi)發(fā)短信驗(yàn)證碼發(fā)送功能
Laravel是一套簡(jiǎn)潔、優(yōu)雅的PHP Web開(kāi)發(fā)框架(PHP Web Framework)。接下來(lái)通過(guò)本文給大家分享在 Laravel 中 “規(guī)范” 的開(kāi)發(fā)短信驗(yàn)證碼發(fā)送功能,需要的朋友參考下吧2017-10-10
laravel接管Dingo-api和默認(rèn)的錯(cuò)誤處理方式
今天小編就為大家分享一篇laravel接管Dingo-api和默認(rèn)的錯(cuò)誤處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
PHP用FTP類(lèi)上傳文件視頻等的簡(jiǎn)單實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇PHP用FTP類(lèi)上傳文件視頻等的簡(jiǎn)單實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09

