微信公众号开发PHP示例
最近开发一个公众号的小脚本,在开发的过程中遇到一些问题,原本都是小问题,只因官方文档不够详细(对于小白来说需要更细致的文档说明),折腾了不少时间。
获取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