您的位置:首页 > 移动开发 > 微信开发

PHP7.0微信公众平台开发6: 实例三:群发预览消息

2017-08-29 11:36 656 查看

PHP7.0微信公众平台开发6: 实例三:群发预览消息

1. API接口的声明

2. PHP脚本代码

3. 运行结果

4. “群发”与“接收普通消息”的区别

本文给出根据用户openID群发图文消息的实例。

1. API接口的声明

1)新增永久图片素材

要构成一个图文消息,首先得先向微信服务器上传图文消息中的图片素材,然后微信服务器会返回所上传的图片的media_id, 使用这个media_id将图片插入图文消息中。



media就是我们上传的图片的路径,又返回说明可知,该接口最终返回上传的图片的media_id.

-2) 新增永久图文素材

上传完图片,就可以利用图片的meida_id将图片插入图文中了。同样,整理好的图文还需要当做素材上传到微信服务器中,然后微信服务器返回该图文的media_id,最后在群发接口中使用这个media_id发送该图文。



返回的media_id就是新增的图文素材。

3)预览接口

获取到图文消息素材的media_id之后,就可以将该图文根据用户的openID群发。由于群发接口一个月只能调用4次,而且该接口订阅号不可用,只能用于服务号,所以为了测试,我选用预览接口,预览接口每日可调用100次。



预览接口和群发接口的差别在于:预览接口中的“touser”只有一个,而群发接口中可以是一个用户openID的列表,也就是说预览接口只能发送给一个人。

“touser”中的用户openID可以用上一篇文章中的方法获得!对于测试号,也可直接在测试号管理平台上查看。

2. PHP脚本代码

<?php
define("TOKEN", "peng");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->sendMsgAll();    //调用sendMsgAll()群发预览图文消息
}else{
$wechatObj->valid();    //其实已经不再调用
}

class wechatCallbackapiTest
{
private $access_token;

public function __construct(){    //构造函数,初始化access_token
$this->access_token = $this->getAccessToken();
}

public function valid(){
//略,本系列第一篇中有代码
}

private function checkSignature(){
//略,本系列第一篇中有代码
}

public function https_request($url,$type,$res,$arr){
//略,本系列第二篇中有代码
}

public function getAccessToken(){
//略,本系列第二篇中有代码
}

//可用于上传除图文素材以外的其他素材(图片,文本,视频,语音等),获得素材的meida_id
public function addMaterial($imageName) {
$type='image';    //定义该素材为图片素材
$url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$this->access_token."&type=".$type;

//获取图片路径,对于php7.0,路径格式得用if中的方法,对于php5得用else中的方法获得
if(class_exists('\CURLFile')){
$data = array('media' => new \CURLFile(realpath($imageName)));
}
else{
$data = array('media' => '@'.realpath($imageName));
}

$res=$this->https_request($url ,'post', 'json', $data);
return $res['media_id'];
}

//上传图文素材
public function addMpnews(){
$thumb_media_id1 = $this->addMaterial('/home/peng/http/baidu.jpg'
4000
);
$thumb_media_id2 = $this->addMaterial('/home/peng/http/amazon_cn.png');
$thumb_media_id3 = $this->addMaterial('/home/peng/http/amazon_co_uk.png');
$thumb_media_id4 = $this->addMaterial('/home/peng/http/amazon_fr.png');

$url = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=".$this->access_token;

$array = array(
"articles" => array(
array(
"title"               => urlencode('百度'),
"thumb_media_id"      => $thumb_media_id1,
"author"              => urlencode('Peng'),
"digest"             => urlencode('百度的描述'), //单图文显示,多图文不显示描述
"show_cover_pic"      => 1,

"content"             => urlencode("百度很棒!"), //图文消息的文字,可以是字符串,也可是用html的标签写
"content_source_url" => urlencode("http://www.baidu.com")    //点击阅读原文后跳转的链接
),
array(
"title"               => urlencode('中国亚马逊'),
"thumb_media_id"      => $thumb_media_id2,
"author"              => urlencode('Peng'),
"digest"             => urlencode('中国亚马逊的描述'),
"show_cover_pic"      => 1,
"content"             => urlencode("<div>你好,亚马逊!</div>"),
"content_source_url" => urlencode("https://www.amazon.cn/")
),
array(
"title"               => urlencode('Amazon in UK'),
"thumb_media_id"      => $thumb_media_id3,
"author"              => urlencode('Peng'),
"digest"             => urlencode('The description of Amazon of the UK'),
"show_cover_pic"      => 1,
"content"             => urlencode("<div>Hello,amazon!</div>"),
"content_source_url" => urlencode("https://www.amazon.co.uk/")
),
array(
"title"               => urlencode('Amazon en France'),
"thumb_media_id"      => $thumb_media_id4,
"author"              => urlencode('Peng'),
"digest"             => urlencode('La description d\'Amazon de la France'),
"show_cover_pic"      => 1,
"content"             => urlencode("<div>Bonjour,amazon!</div>"),
"content_source_url" => urlencode("https://www.amazon.fr/")
)
)
);

$postJson = urldecode( json_encode( $array ) );

$res = $this->https_request($url ,'post', 'json', $postJson);
return $res['media_id'];
}

//调用群发接口将上面的图文消息群发给所有用户
public function sendMsgAll(){
$url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=".$this->access_token;
$array = array(
'touser' => 'o637_wEU************iyo-REa4',  //用户的openID
'mpnews'=>array("media_id"=>$this->addMpnews()),
'msgtype'=>'mpnews'
);

$postJson = json_encode($array);
$res = $this->https_request($url,'post','json',$postJson);
var_dump($res);
}
}
?>


3. 运行结果

在浏览器中运行php脚本,http://www.peng.com/wechat.php,结果如图:



此图代表没有任何错误,已经发送到用户的微信上。

查看手机微信,结果如图:



比如点开“中国亚马逊”这条消息,结果如右图所示,上面的蓝色提醒就说明我们正在使用“预览接口”,点击下方的“阅读原文”即可打开我们定义在”content_source_url”中的连接。

4. “群发”与“接收普通消息”的区别

在第一个实例中,我介绍了接收普通消息的例子,最终的界面和这个差不多,但是二者的差别在于如下几点:

1) 群发是微信服务器主动发送消息给用户,而接收普通消息必须是用户先给用户发送一个请求,如第一篇中的“tuwen”就是个请求,然后微信服务器才发送消息给用户;

2) 群发可以发给多个用户,而接收普通消息只能发给单个用户;

3) 二者都定义了亚马逊的URL地址,但是群发要想打开亚马逊,必须点击图文消息,然后进去后点击下方的“阅读原文”才能打开,但是接收普通消息的话,用户点击图文消息后可直接打开网页。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息