微信开发同步粉丝是一个特别重要的功能,它可以把关注这个微信号的粉丝的一些资料取出来,并存入数据库。但有一点要注意在本地用同步粉丝这个按钮,然后在你的云虚拟主机上在调用同步粉丝这个按钮,会写不进数据库,因为这样会让access_token立刻过期。
这是我同步粉丝前台网页
<extend name="Common:base" />
<block name="body">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md9">
<a href="{:U('addfans')}" id="getAllFriend" class="layui-btn">同步粉丝</a>
</div>
<div class="layui-col-md3">
<form class="layui-form">
<div class="layui-form-item">
<select name="tag" lay-filter="tag">
<option value="">请选择标签</option>
<volist name="tag" id="row">
<option value="{$row.tag_id}">{$row.tag}({$row.tag_id})</option>
</volist>
</select>
</div>
</form>
</div>
</div>
</div>
<table class="layui-table" lay-skin="line">
<colgroup>
<col width="150">
<col width="100">
<col width="200">
<col width="200">
<col>
</colgroup>
<thead>
<tr>
<th>头像</th>
<th>昵称</th>
<th>关注时间</th>
<th>OPENID</th>
<th>标签</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<volist name="data" id="v">
<tr>
<td>
<div style="padding: 5px; border: #e6e6e6 solid 1px; width:35px; float: left; ">
<img class="form_logo" src="{$v.headimgurl}" width="35" height="35">
</div>
</td>
<td>{$v.nickname}</td>
<td>{$v.subscribe_time|date="Y-m-d",###}</td>
<td>{$v.openid}</td>
<td>{$v.tagid_list}</td>
<td><a class="rha-bt-a" href="{:U('Message/replyMsg',['openid'=>$v.openid])}">发送消息</a></td>
</tr>
</volist>
</tbody>
</table>
<script>
// layui.use('layer', function(){
// var $ = layui.jquery, layer = layui.layer;
// var lastOpenid='';
// var page='1';
// $(function () {
// $('#getAllFriend').click(function () {
// layer.open({
// type: 2,
// title: '同步全部粉丝',
// shadeClose: true,
// shade: 0.5,
// area: ['680px', '200px'],
// content: '{:U("mp/Friends/SynFriends")}',
// cancel: function(index, layero){
// window.location.reload();
// }
// });
// });
// })
// });
layui.use('form', function(){
var form = layui.form;
//各种基于事件的操作,下面会有进一步介绍
form.on('select(tag)', function(data){
// console.log(data.elem); //得到select原始DOM对象
// console.log(data.value); //得到被选中的值
// console.log(data.othis); //得到美化后的DOM对象
window.location.href="{:U(index)}"+"?tagid="+data.value;
});
});
</script>
</block>
这是我控制器的代码
<?php
namespace Home\Controller;
use Think\Controller;
use LaneWeChat\Core\UserManage;
class FansController extends Controller {
private $mp;
public function _initialize(){
$mp=getCurrentMp();
if(empty($mp)){
$this->error('无使用公众号',U('index'));
}else{
$this->mp=$mp;
}
}
public function index($tagid=''){
// $data=M('mp_friends')->distinct('openid')->select();
// $this->assign('data',$data);
// $this->display();
$mp=$this->mp;
$where['mp_id']=$mp['id'];
if(!empty($tagid)){
$where['tagid_list']=array('like',"%{$tagid}%");
}
$data=M('mp_friends')->where($where)->select();
$tag=M('tags')->where($where)->select();
$this->assign('tag',$tag);
$this->assign('data',$data);
$this->display('index');
}
public function addfans(){
$mp = $this->mp;
$where['mp_id'] = $mp['id'];
M('mp_friends')->where($where)->delete();
include APP_PATH . 'LaneWeChat/lanewechat.php';
$ret = UserManage::getFansList();
// print_r($ret);
// exit();
$openids = $ret['data']['openid'];
$arr = array();
foreach ($openids as $value) {
$row = array();
$row['openid'] = $value;
$row['lang'] = 'zh_CN';
$arr[] = $row;
// print_r($arr);
// exit;
}
$ret = UserManage::getManyUserInfo($arr);
// print_r($ret);
if(isset($ret['user_info_list'])){
$data = $ret['user_info_list'];
foreach ($data as &$value) {
$value['mp_id'] = $mp['id'];
$value['tagid_list'] = implode(',',$value['tagid_list']);
}
M('mp_friends')->addAll($data);
// dump($model);
// exit;
}
$this->success('同步完成',U('index'));
}
}
注意我后台代码有tag的字眼,是我在创建二维码的时候,写入一些数据,这些暂时可以不用管,可以把这些删了,在稍微改造一下就可以用。我这个代码是批量获取粉丝。所以要处理一下数据。
下面代码是我在后台调用的一些方法
public static function getManyUserInfo($openid){
$accessToken = getAccess_token();
$queryUrl="https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=$accessToken";
$json=json_encode(array('user_list'=>$openid));
// return $json;
return CUrl::callWebServer($queryUrl,$json,'post');
}
/**
* @descrpition 获取关注者列表
* @param $next_openid 第一个拉取的OPENID,不填默认从头开始拉取
* @return JSON {"total":2,"count":2,"data":{"openid":["OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
*/
public static function getFansList($next_openid=''){
//获取ACCESS_TOKEN
$accessToken = getAccess_token();
if(empty($next_openid)){
$queryUrl = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token='.$accessToken;
}else{
$queryUrl = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token='.$accessToken.'&next_openid='.$next_openid;
}
return Curl::callWebServer($queryUrl, '', 'GET');
}