最近开发一个公众号的小脚本,在开发的过程中遇到一些问题,原本都是小问题,只因官方文档不够详细(对于小白来说需要更细致的文档说明),折腾了不少时间。
获取access token
首先写一个函数来提交GET请求:
function bzg_weixin_get($url) { if ( function_exists('curl_exec') ) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $data = curl_exec($ch); curl_close($ch); return json_decode($data, true); } }
获取access token:
<?php $appid = ''; $secret = ''; $api_token = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $secret; $res_token = bzg_weixin_get($api_token); $access_token = $res_token['access_token']; ?>
其中,APP ID和APP Secret在微信公众平台获取。
微信公众平台开发上传图片示例
无论是新增临时素材还是永久素材,方法都是一样的,只是API地址有所不同而已。
首先写一个函数来提交POST请求:
function bzg_weixin_post($url, $files ) { if ( function_exists('curl_exec') ) { $ch = curl_init(); //curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); //php 5.6使用 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $files); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); return json_decode($data, true); } }
这里需要注意,如果你的PHP版本在5.6以上,需要使用:
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
否则会出现如下这样的错误:
media data missing hint: [fPSta0597e541]
接下来上传图片:
<?php $files = array( 'media' => '@' . $path, ); $api_material = 'https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=' . $access_token . '&type=image'; $res_upimg = bzg_weixin_post( $api_material, $files ); $imgurl = $res_upimg['url']; $media_id = $res_upimg['media_id']; ?>
$path为本地图片的绝对路径,官方的文档说明是这样的:
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
media | 是 | form-data中媒体文件标识,有filename、filelength、content-type等信息 |
微信公众平台开发添加图文素材示例
新增一个图文素材和新增一组图文素材方法是一样的:
<?php $api_post = 'https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=' . $access_token; $up_posts['articles'] = array( array( 'title' => '文章标题', 'thumb_media_id' => '上传图片时返回的media_id', 'author' => '', //可以为空 'digest' => '文章摘要', 'show_cover_pic' => false, //是否在文章里显示封面图片 'content' => '文章内容,支持HTML标签,不需要字符转义', 'content_source_url' => '原文链接', ), //如果是多图文,照上面的样子继续添加就可以了,最多8个 ); $up_posts = json_encode($up_posts, JSON_UNESCAPED_UNICODE); $res_post = bzg_weixin_post( $api_post, $up_posts); ?>
注意,直接POST数组过去是不行的,需要先将数组转换为JSON,为了防止中文变成问号,使用了JSON_UNESCAPED_UNICODE参数。
新增临时素材、新增永久素材区别
新增临时素材只在微信服务器保存3天,但是插入到图文素材推送后是不会失效的。
新增永久素材不会失效,但是数量是有上限的,图文消息素材和图片素材的上限为5000,其他类型为1000。
下面这个接口上传图片不占用5000个数量的限制,图片URL也是永久有效的,但是图片不会在素材库中显示,也不返回media_id
https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
下面这个上传图片的接口会返回media_id,但也占用5000个数量的限制,上传的图片会在素材库中显示。
https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=image