微信公众号开发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
阿里云