2016年06月18日 (图片无法上传,只能通过上传附件)
1:创建用户组
微信跟QQ一样可以创建组名,删除组名,修改组名,查询组名,这些操作都是一系列的接口,只需要调用相关的接口,并以curl的形式进行发送,便可以获得相关的结果
创建分组
一个公众账号,最多支持创建100个分组。
接口调用请求说明
http请求方式: POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN
POST数据格式:json
POST数据例子:{"group":{"name":"test"}}
参数说明
参数 说明
access_token 调用接口凭证
name 分组名字(30个字符以内)
返回说明 正常时的返回JSON数据包示例:
{
"group": {
"id": 107,
"name": "test"
}
}
下面是相关代码的实现
我们需要通过curl的形式将数据包发送过去,返回的结果是一个StdClass形式的json数据,我们需要将stdClass进行转换为数组形式,所以我们创建一个func.php文件,后面的组的相关操作都基于这些函数
<?php
//设定appID 和secret
define ("APPID","wx70fe852945a945b6",true);
define ("SECRET",‘d05c2fc161d71c8317331a39044a7d93‘,true);
$APPID="wx70fe852945a945b6";
$SECRET="d05c2fc161d71c8317331a39044a7d93";
function curl($url,$data=null)
{
//初始化
$curl=curl_init();
curl_setopt($curl, CURLOPT_URL, $url);//设置传输链接
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);//设置SSL凭证
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//是否显示在浏览器上
if(!empty($data))
{
//进行post数据
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
}
$result=curl_exec($curl);//执行curl
curl_close($curl);//关闭curl
return $result;
}
function transition ($data)
{
if(is_object($data))
{
$data=(array)$data;
}
if(is_array($data))
{
foreach($data as $key=>$value)
{
$data[$key]=transition($value);
}
}
return $data;
}
//将多维数组转成字符串
function recount($result)
{
if(is_array($result))
{
foreach($result as $key=>$value)
{
recount($value);
return $value;
}
}
}
//access_token链接地址
$access_token_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$APPID&secret=$SECRET";
//获取access_token.将返回的json格式转成数组,返回一个数组形式的access_token
$access_token=(array)json_decode(curl($access_token_url));
$access_token=$access_token[‘access_token‘];
?>
利用上面的access_token我们便可以做我们想做的任何事了
首先我们进行组的创建,我们将文件命名为creategroup.php
1 界面展示
看起来很简单的HTML的代码,相信有HTML基础的都能写出
那么如何创建组呢?很简单,我们只需将创建组的API链接提交过去就可以了
相关的代码
<?php echo ‘<meta http-equiv="content-type" content="text/html; charset=utf-8">‘;
?>
<!doctype html>
<html>
<head>
<title>无标题文档</title>
</head>
<body>
<form action="#" method="post">
<p>新建分组</p>
<input type="text" name="tag" placeholder="新建一个分组">
<input type="submit" name="-1" id="sub" value="提交">
</form>
<?php
//如果提交成功,那么进行组的创建
if(isset($_POST[-1]))
{
function create_group()
{ require "func.php";
$create_url="https://api.weixin.qq.com/cgi-bin/tags/create?access_token=$access_token";
$tag=$_POST[‘tag‘];//获取组名
$poststr="
{
\"tag\":
{
\"name\":\"$tag\";
}
}
";
if($result=curl($create_url,$poststr))
{
echo "<script type=\"text/javascript\">alert(‘执行成功,三秒之后将自动跳回主页‘)</script>";
//设置跳转回主页
echo "<script type=\"text/javascript\">setTimeout(window.navigate(\"getgroup.php\"),3000)</script>";
}
else
{echo "<script type=\"text/javascript\">alert(‘执行失败‘)</script>";}
}
create_group();
}
?>
</body>
</html>
2:接下来是展示所有的组名,我们先看看微信官方的文档
查询所有分组
接口调用请求说明
http请求方式: GET(请使用https协议)https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN
参数说明
参数 说明
access_token 调用接口凭证
返回说明 正常时的返回JSON数据包示例:
{
"groups": [
{
"id": 0,
"name": "未分组",
"count": 72596
},
{
"id": 1,
"name": "黑名单",
"count": 36
},
{
"id": 2,
"name": "星标组",
"count": 8
},
{
"id": 104,
"name": "华东媒",
"count": 4
},
{
"id": 106,
"name": "★不测试组★",
"count": 1
}
]
}
参数说明
参数 说明
groups 公众平台分组信息列表
id 分组id,由微信分配
name 分组名字,UTF8编码
count 分组内用户数量
错误时的JSON数据包示例(该示例为AppID无效错误):
官方文档对于返回的json数据已经很明了了,一个组名里边包含了基本的信息,组id,组名以及组内的用户数量。我们无法直接将返回的json数据直接显示到页面上,那么我们如何解析json呢?微信给我们返回的是一个stdclass类型的json,所以第一步我们需要将json转为数组,php中有一个json_decode()函数,此函数能够将json数据转为stdclass的数组,stdclass并不等于数组,所以我们还要讲stdclass转化为array形式,在func.php中transition()函数就有这样的功能。
我们先看看页面显示样子,看看我们通过curl从腾讯上获取的数据是什么样的
上图我们创建了一个表,第一行是一个创建新组的功能,在以下的行中,我们能够看到组编号,组名,以及组内人数。那么这个是如何做到的呢?很简单,当我们已经获取到返回回来的json数据之后,我们对json进行数据包装,把json做成数组形式。那么如何实现数据包装呢?也很简单,我们不断的调用解析函数,将它最终变为数组的形式,然后遍历这个数组就行了。
展示源代码:getGroup.php
<body>
<div id="box">
<div id="group">
<?php
require "func.php";
$groupurl="https://api.weixin.qq.com/cgi-bin/groups/get?access_token={$access_token}";
$result=json_decode(curl($groupurl));//获取包装之后的数据,以数组的形式存储
//$result=curl($groupurl);
//将STDclass类型转为数组类型
function G_transition ($data)
{
if(is_object($data))
{
$data=(array)$data;
}
if(is_array($data))
{
foreach($data as $key=>$value)
{
$data[$key]=G_transition($value);
}
}
return $data;
}
$result=G_transition($result);
function G_recount($result)
{
if(is_array($result))
{
foreach($result as $key=>$value)
{
G_recount($value);
return $value;
}
}
}
$resultG=G_recount($result);
echo "<table border=\"1px dashed\" bordercolor=\"#FF3333\">";
echo "<tr><th colspan=\"3\"><a href=\"createGroup.php\">创建一个新组</a></th></tr>";
echo "<th>编号</th><th>组名</th><th>人数</th>";
for($i=0;$i<count($resultG);$i++)
{
echo "<tr>";
foreach ($resultG[$i] as $key=>$value)
{
if($key==‘id‘)
{
echo "<td align=\"center\"title=\"\">[$value]<a href=\"delete.php?num=$value\">删除</a><a href=\"modify.php?num=$value\">修改</a></td>";
}
else
{
echo "<td> $value</td>";
}
}
echo "</tr>";
}
echo "</table>";
?>
</div>
<hr/>
<div>
<hr/>
3:我们如何修改分组名
修改分组名
接口调用请求说明
http请求方式: POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN
POST数据格式:json
POST数据例子:{"group":{"id":108,"name":"test2_modify2"}}
参数说明
参数 说明
access_token 调用接口凭证
id 分组id,由微信分配
name 分组名字(30个字符以内)
返回说明 正常时的返回JSON数据包示例:
{"errcode": 0, "errmsg": "ok"}
错误时的JSON数据包示例(该示例为AppID无效错误):
官方文档提供了修改分组名的接口,所以我们可以做一个修改的链接和一个修改组的modify.php文件
根据官方文档,我们需要通过组id才能进行修改,根据我们在创建组的时候传输过来的json数据中我们可以获取到组id,所有我们可以通过创建链接的方式,当点击链接的时候,会把组id以get的方式传送到modify文件中,而modify.php可以通过$_GET的形式接收组id.
我们先写好这个传送组id的链接,
for($i=0;$i<count($resultG);$i++)
{
echo "<tr>";
foreach ($resultG[$i] as $key=>$value)
{
if($key==‘id‘)
{
echo "<td align=\"center\"title=\"\">[$value]<a href=\"delete.php?num=$value\">删除</a><a href=\"modify.php?num=$value\">修改</a></td>";
}
else
{
echo "<td> $value</td>";
}
}
echo "</tr>";
}
代码中,我们对返回的数组进行遍历,如果发现key值是id,那么我们将值获取过来并且加入到链接尾部,注意get方式的写法
echo "<td align=\"center\"title=\"\">[$value]<a href=\"delete.php?num=$value\">删除</a><a href=\"modify.php?num=$value\">修改</a></td>";
跳转到modify.php页面后,我们进行相关的处理,在该页面上,我们仍然有一个HTML输入框
代码如下:
<form action="#" method="post">
<p>更新组名</p>
<input type="hidden" name="num" value="<?php echo $_GET[‘num‘]?>">
<input type="text"id="modify" name="name">
<input type="submit" value="修改" name="-1">
</form>
<?php
//此程序用于修改标签组
function modify()
{ $num=$_POST[‘num‘];
$name=$_POST[‘name‘];
require "func.php";
$modify_url="https://api.weixin.qq.com/cgi-bin/tags/update?access_token=$access_token";
//post过去的数据
$poststr="
{
\"tag\":
{
\"id\":\"$num\",
\"name\":\"$name\"
}
}
";
$result=(array)json_decode(curl($modify_url,$poststr));
$result=$result[‘errmsg‘];
if($result==‘ok‘)
{
echo "<script type=\"text/javascript\">
alert(\"$result\");
</script>";
//进行页面跳转
echo "<script type=\"text/javascript\">
setTimeout(window.location.href=\"getgroup.php\",3000);
</script>";
}
else
{
echo "<script type=\"text/javascript\">
alert(‘wrong‘);
</script>";
}
}
if(isset($_POST[‘-1‘]))
{
modify();
}
?>
如果执行成功,那么会进行弹出提醒框,等待五秒后自动跳转回getGroup.php页面
4:删除组
组名一般不允许删除,但是微信平台仍然给出了相关的删除接口
注意本接口是删除一个用户分组,删除分组后,所有该分组内的用户自动进入默认分组。 接口调用请求说明
http请求方式: POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/groups/delete?access_token=ACCESS_TOKEN
POST数据格式:json
POST数据例子:{"group":{"id":108}}
参数说明
参数 说明
access_token 调用接口凭证
group 分组
id 分组的id
返回说明 正常时的返回JSON数据包示例:
通过传递的json数据,我们只需要将组id进行传递到delete.php页面并进行相关的删除操作即可
代码显示:
<?php
//该段程序用来删除组标签,成功之后会给予提示,并且跳转回getgroup.php页面
function delete()
{
$num=$_GET[‘num‘];//接收来自getgroup页面的编号
require "func.php";
$delete_url="https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=$access_token";
$data=json_encode(array("tag"=>array("id"=>$num)));
//如果curl函数执行成功,那么会返回一个状态值
if($result=curl($delete_url,$data))
{
echo "<script type=\"text/javascript\">alert(‘执行成功,三秒之后将自动跳回主页‘)</script>";
//设置跳转回主页
echo "<script type=\"text/javascript\">setTimeout(window.history.back(-1),8000)</script>";
}
else
{echo "<script type=\"text/javascript\">alert(‘执行失败‘)</script>";}
}
delete();
?>
5:对组成员进行批量移动
有时候我们需要对组内的成员进行移动到其他的组里面,在这点上,微信平台也给出了相应的接口我们先看官方的文档说明
批量移动用户分组
接口调用请求说明
http请求方式: POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/groups/members/batchupdate?access_token=ACCESS_TOKEN
POST数据格式:json
POST数据例子:{"openid_list":["oDF3iYx0ro3_7jD4HFRDfrjdCM58","oDF3iY9FGSSRHom3B-0w5j4jlEyY"],"to_groupid":108}
参数说明
参数 说明
access_token 调用接口凭证
openid_list 用户唯一标识符openid的列表(size不能超过50)
to_groupid 分组id
返回说明 正常时的返回JSON数据包示例:
{"errcode": 0, "errmsg": "ok"}
从传递的json数据可以看到,具有一个open_list和一个to_groupid,分别表示要移动的组成员的openid和将要移动的组id.那么我们如何开始移动呢?现在已基本清楚了,只需要把openid传递到open_list,将组id传递到to_groupid中,然后将包装好的json数据通过curl函数post过去.在批量分组之前,我们还要知道一件事,如何获取用户的相关信息,这个信息指的是用户微信上设置的性别,省份,国家,语言,所属组等等的相关信息,同样,微信提供了获取用户信息的接口,参照上述解决方法就可以获取到用户的相关的信息
以下是获取到的用户表
通过第一列的选择之后,在选择要分的组,点击移动就可以将用户移动到想要的组里面,下图是移动后的展示
所属组编号发生了变化
源代码展示
<form action="move.php" method="post">
<table border="1px">
<th>选择移动</th>
<th>昵称</th>
<th>性别</th>
<th>语言</th>
<th>所在城市</th>
<th>省份</th>
<th>国家</th>
<th>头像</th>
<th>加入时间</th>
<th>备注名</th>
<th>所属组</th>
<th rowspan="10">
<?php
echo " <select name=\"group\">";
$count=count($resultG);
foreach($resultG as $key)//遍历包装好的json数据,已经转成了多维数组
{
echo "<option value=\"$key[id]\" >$key[name] </option>"; $count--; //获取组ID
}
echo "</select>";
echo "<input type=\"submit\" name=\"-1\" value=\"移动\">";
?>
</th>
<?php
foreach($list[‘data‘] as $key)
{
//$list[‘data‘]是已经包装好的json数据,将原来的stdclass转为了多维数组
// $result=count($key);
//var_dump($result);
foreach($key as $value)
{
echo "<tr>";
$info_url="https://api.weixin.qq.com/cgi-bin/user/info?access_token=$access_token&openid=$value&lang=zh_CN";
$info=transition(json_decode(curl($info_url))); //var_dump($info);
//echo "<hr>";
// global $userinfo;
//$userinfo=$info;
//var_dump($userinfo);
foreach($info as $key=>$value)
{
//对表格进行相关的修饰,进行相关的判断
switch($key)
{
//如果是id,那么做成一个复选框
case "openid":
echo "<td align=\"center\">
<input type=\"checkbox\" value=\"$value\"name=\"openid[]\"/>
</td>";
case "subscribe"://忽略相关的描述,不对这个字段生成列
break;
//如果是性别,性别值1代表男,0代表女,2代表并未填写
case "sex":
if($value==1)
{
echo "<td>男</td>"; }
else if($value==0)
{
echo "<td>女</td>"; }
else
{
echo "<td>暂未填写</td>"; }
break;
//如果是头像链接,那么生成一个50*50像素的图片
case "headimgurl";
echo "<td>
<img src=\"$value\" height=\"50px\" width=\"\50px\">
</td>";
break;
//以下是默认列
case "nickname":
case "language":
case "city":
case "province":
case "country":
case "subscribe_time":
echo "<td>$value</td>";
break;
//如果remark的值为空,那么备注名是空值
case "remark":
if(empty($value))
{
echo "<td>暂无</td>";
}
else
{
echo "<td>$value</td>";
}
break;
case "groupid":
echo"<td>$value</td>";
break;
}
}
echo "</tr>";
}
}
?>
</table>
</form>
</div>
<hr / color=\"#9900CCd\">
</div>
</body>
move.php的代码
<?php
//此程序用于移动分组
$member=array();
$member=$_POST[‘openid‘];//获取选中的openid
$groupid=$_POST[‘group‘];//获取组id
require "func.php";
$move_url="https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=$access_token";
for($i=0;$i<count($member);$i++)
{
$poststr="{\"openid\":\"$member[$i]\",\"to_groupid\":$groupid}";
$result=curl($move_url,$poststr);
}
$result=(array)json_decode($result);
if($result[‘errmsg‘]==‘ok‘)
{
echo "
<script type=\"text/javascript\">window.alert(‘移动成功‘)</script>
<script type=\"text/javascript\">
setTimeout(\"window.location.href=‘getgroup.php‘\",5000);
</script>
";
}
?>