php微信公众平台开发之微信群发信息


Posted in PHP onSeptember 13, 2016

1、目的

完成在微信公众号中群发消息。这里只是完成简单的文字发送。也可以发送语音图片等,只是发送数据格式不同而已,下面有链接,可以查询数据类型的数据发送格式。

2、群发短信的流程

获取测试公众账号(有账号的可以不用测试账号,不过正式的账号限制比较多)用户关注上面的公众账号通过appid和appsecret获取我们的access_token通过access_token群发短信

3、获取测试公众账号 + 关注公众号

1)、公众测试账号获取

访问上面的连接,选择“接口测试号申请”获得直接打开http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index通过微信客户端扫码登录即可登录。

登录完即可获取到一个测试公众账号的信息。主要有appId和appsecret两个参数,这将唯一标示一个公众号,并且需要将他们作为参数获取用户的信息。、

php微信公众平台开发之微信群发信息

2)、配置接口信息

这一步可以参照微信接入说明,该页提供一个php的实例下载,很简单基本上修改一下自定义的TOKEN就好了,然后把验证页面放到自己的服务器上。

这里我提供我做的一个例子:

准备资源:

域名+空间(我的是sae空间+万网域名)、仅作验证的php文件

域名指向的空间根目录我创建了一个wx_sample.php

wx_sample.php

<?php
/**
* wechat php test
*/

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];

//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}

public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

//extract post data
if (!empty($postStr)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>"; 
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}

}else {
echo "";
exit;
}
}

private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}

$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];

$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}

}
}

?>

然后填写配置信息Token (一定要与上面的wx_sample.php中的token一致)、URL(wx_sample.php的地址)

php微信公众平台开发之微信群发信息

然后提交就可以了

如果提示失败,请检查Token与URL【如果是自己的域名和空间,请备案; 百度sae、新浪sae的需要自己申请而且认证通过(就是自己拍一个手握证件照上传,很简单的 最短2天就o了),这一步必须】

3)配置JS接口安全域名

填这个域名是一定不要带protocol的,比如说 http://www.sagosoft.com/ 这样是不对的,这是URL不是域名

域名应该是类似 www.sagosoft.com这样的 【否则在微信js-sdk接入时会提示invalid url domain】

php微信公众平台开发之微信群发信息

4)关注公众号

用户只有关注了这个公众号了,才能通过打开有公众号信息的链接去授权第三方登录,并获取用户信息的操作。故我们还需要用我们的微信关注微信号,操作如下:

还是刚刚那个登录成功后跳转的页面,我们可以看到,该页面有一个二维码,我们可以通过扫描该二维码进行关注,关注成功在右边的“用户列表”会多一个用户的信息。如下图所示:

php微信公众平台开发之微信群发信息

5)配置回调函数

我们在微信客户端访问第三方网页(即我们自己的网页)的时候,我们可以通过微信网页授权机制,我们不仅要有前面获取到的appid和appsecret还需要有当用户授权之后,回调的域名设置,即用户授权后,页面会跳转到哪里。具体的配置如下:

还是在刚刚的页面,有一个“网页授权获取用户基本信息”,点击后面的修改

php微信公众平台开发之微信群发信息

填写回调的域名:

域名是上面配置的根域名,假如你上面 “接口配置信息” 填写的url 为zcr.sinaaappc.com/wx_sample.php,这里只要填写zcr.sinaaappc.com 就可以了。

php微信公众平台开发之微信群发信息

如果你的网址没有被列入过黑名单,就会在顶部出现

php微信公众平台开发之微信群发信息

php微信公众平台开发之微信群发信息

注意:

1、这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;
2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权

到这里,我们就完成了公众号测试账号的获取和配置,已经用户关注微信公众号。

4、通过appid和appsecret获取我们的access_token

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

获取方法:

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数说明:

php微信公众平台开发之微信群发信息

返回说明

正常情况下,微信会返回下述JSON数据包给公众号:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

php微信公众平台开发之微信群发信息

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"}

例子:

获取access_token:

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx4d1cb8dbd827a16e9&secret=d462d4c36b116795d1d99dcf0547af5443d

返回数据:

{
"access_token": "qR5UK2vMf5aTHV8e-uB10FZW0caTZm_1kbkUe4OPK2ILVvNaoa7pLzYWqLUAmx6Sjq1E7pKHrVAtuG0_1MPkqmDfOkm2750kaLWNk59DS-iDOpjjxompJtXa3WhbN5FKRWNhADAVAR",
"expires_in": 7200
}

5、通过access_token群发短信

在公众平台网站上,为订阅号提供了每天一条的群发权限,为服务号提供每月(自然月)4条的群发权限。而对于某些具备开发能力的公众号运营者,可以通过高级群发接口,实现更灵活的群发能力。

请注意:

1、对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全部用户或某个分组;
2、对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败;
3、具备微信支付权限的公众号,在使用群发接口上传、群发图文消息类型时,可使用<a>标签加入外链;
4、开发者可以使用预览接口校对消息样式和排版,通过预览接口可发送编辑好的消息给指定用户校验效果。

1)根据分组进行群发【订阅号与服务号认证后均可用】

调用接口:

http请求方式: POSThttps://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN

在body添加如下数据(以JSON格式数据发送)——发送其他格式数据,只需要改里面参数信息即可,具体可查看微信官方文档:

{
"filter":{
"is_to_all":false,
"group_id":2
},
"text":{
"content":"CONTENT"
},
"msgtype":"text"
}

参数说明:

php微信公众平台开发之微信群发信息

例子:发送给所有人

url:

https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=KBoNONaJZ4-KhafQVJoQ6VBX0F-bls7nAsJBn8Fy7GLwav4Be1lRJcob1RHH6wW35IxxFwkJnZfnc-On9EQITg3oxEWUw7O2YyVW9naDknu6PQX9fnSmQcr8ojTK8Ug-HDTcAAABXN

发送的json数据:发送给所有人

{
"filter":{
"is_to_all":true
},
"text":{
"content":"CONTENT"
},
"msgtype":"text"
}

返回数据:

{
"errcode": 0,
"errmsg": "send job submission success",
"msg_id": 1000000003
}

参数意义:

php微信公众平台开发之微信群发信息

错误码及其以及查询:

全局错误码解析

使用postman模拟https请求发送如下图所示:

php微信公众平台开发之微信群发信息

2)根据OpenID列表群发【订阅号不可用,服务号认证后可用】

发送的http请求url:(注意:和上面的不同)

http请求方式: POSThttps://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=ACCESS_TOKEN

数据格式:

{"touser":["OPENID1","OPENID2"],"msgtype": "text","text": { "content": "hello from boxer."}}

其中OPENID1和OPENID2是我们要发送的微信用户openId(用户的唯一标示)。

例子:

发送"oF3PcsnsrMiJzEwalZZbAfWQpxCI","oF3PcshH1CUIhR_WYau6swUiPzlw" 两个用户。

内容为:hello from boxer.<a href='www.baidu.com'>欢迎来到百度</a>

url:

https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=wRyTbnsiu18ssEhMPLf4bDfeT-Bt6e6tgR4CQGVLBipRcyJPkdAKPYfM6-qkKuHUN8uRKJh6Xvm0OuAdFgqOo8Ru8hoDxl-cGc9bh-ezJb2ZUcJSnQk2s416zI8kbEOfOGYdAFARJB

json数据:

{
"touser":[
"oF3PcsnsrMiJzEwalZZbAfWQpxCI",
"oF3PcshH1CUIhR_WYau6swUiPzlw"
],
"msgtype": "text",
"text": { "content": "hello from boxer.<a href='http://www.seewoedu.com/'>欢迎希沃学院</a>"}
}

返回数据:

{
"errcode": 0,
"errmsg": "send job submission success",
"msg_id": 3147483654
}

使用postman模拟发送请求如下:

php微信公众平台开发之微信群发信息

微信号接收到的内容:

php微信公众平台开发之微信群发信息

致谢:感谢您的阅读!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
详细介绍:Apache+PHP+MySQL配置攻略
Sep 05 PHP
php入门小知识
Mar 24 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
第三章 php操作符与控制结构代码
Dec 30 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 PHP
详解PHP如何更好的利用PHPstorm的自动提示
Aug 18 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
Sep 11 #PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 #PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 #PHP
PHP入门教程之PHP操作MySQL的方法分析
Sep 11 #PHP
PHP入门教程之图像处理技巧分析
Sep 11 #PHP
PHP函数引用返回的实例详解
Sep 11 #PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 #PHP
You might like
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
一些常用的Javascript函数
2006/12/22 Javascript
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
同步文本框内容JS代码实现
2016/08/04 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
python aiohttp的使用详解
2019/06/20 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
django最快程序开发流程详解
2019/07/19 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
博士生入学考试推荐信
2013/11/17 职场文书
九华山导游词
2015/02/03 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
Redis特殊数据类型bitmap位图
2022/06/01 Redis