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 相关文章推荐
Php注入点构造代码
Jun 14 PHP
PHP截断标题且兼容utf8和gb2312编码
Sep 22 PHP
分享一个超好用的php header下载函数
Jan 31 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
php常见的魔术方法详解
Dec 25 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
php接口技术实例详解
Dec 07 PHP
php 函数使用可变数量的参数方法
May 02 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 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
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
laravel 数据验证规则详解
2019/10/23 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
php图像生成函数之间的区别分析
2012/12/06 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
[00:10]神之谴戒
2019/03/06 DOTA
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
飞利浦美国官网:Philips美国
2020/02/28 全球购物
布达拉宫的导游词
2015/02/02 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript
Docker官方工具docker-registry案例演示
2022/04/13 Servers