我们知道,每个微信用户都有一个openid,只有他关注我们的公众号,我们就可以轻松得拿到他的基本信息。
public function synchronous()//同步公众号用户的信息
{
set_time_limit(0);//设置超时
$token = get_token();//获取公众号的token(以这样开头的gh_xxxxxxx)
$access_token = get_access_token();//这个方法我就不介绍了,官网上有例子
$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=".$access_token;
$res = $this->http_get($url);
$ress = json_decode($res,true);
$openidLists = $ress['data']['openid'];
$total = $ress['total'];
foreach($openidLists as $r){
$url2 = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$r."&lang=zh_CN";
$resa = http_get($url2);
$res2 = json_decode($resa,true);
$result = M("ucenter_member")->where(array('token'=>$token,'openid'=>$r))->find();
if(!$result)//数据库没有存在该用户就添加
{
static $_email_int = 0;
$email = time () . rand ( 01, 99 ) . $_email_int . '@weiphp.cn';
$nickname = uniqid () . rand ( 01, 99 ) . $_email_int;
$data=array(
'username'=>$nickname,
'password'=>md5('123456'),
'email'=>$email,
'mobile'=>'',
'reg_time'=>time(),
'reg_ip'=>get_client_ip(),
'last_login_time'=>time(),
'last_login_ip'=>get_client_ip(),
'update_time'=>time(),
'status'=>1,
'openid'=>$r,
'token'=>$token
);
$uid=M("ucenter_member")->add($data);
//第二步,同步follow表数据
if($uid > 0){
//删除不需要的数据
unset($res2['subscribe']);
unset($res2['remark']);
unset($res2['groupid']);
$res2['uid']=$uid;
$res2['token']=$token;
//M("follow")->where(array('token'=>$token,'openid'=>$r))->save($res2);
$rr = M("follow")->where(array('token'=>$token,'openid'=>$r))->find();
if(!$rr){
M("follow")->add($res2);
}else{
M("follow")->where(array('token'=>$token,'openid'=>$r))->save($res2);
}
//第三步,同步member表数据
$userinfo = array(
'nickname'=>$res2['nickname'],
'sex'=>$res2['sex'],
'uid'=>$result['id']
);
$rr2 = M("member")->where(array('uid'=>$result['id']))->find();
if(!$rr2){
M("member")->add($userinfo);
}else{
M("member")->where(array('uid'=>$result['id']))->save($userinfo);
}
}
}
else{//存在才更新一下
//删除不需要的数据
unset($res2['subscribe']);
unset($res2['remark']);
unset($res2['groupid']);
$res2['uid'] = $result['id'];
$res2['token'] = $token;
$rr = M("follow")->where(array('token'=>$token,'openid'=>$r))->find();
if(!$rr){
M("follow")->add($res2);
}else{
M("follow")->where(array('token'=>$token,'openid'=>$r))->save($res2);
}
//更新member表
$userinfo = array(
'nickname'=>$res2['nickname'],
'sex'=>$res2['sex'],
'uid'=>$result['id']
);
$rr2 = M("member")->where(array('uid'=>$result['id']))->find();
if(!$rr2){
M("member")->add($userinfo);
}else{
M("member")->where(array('uid'=>$result['id']))->save($userinfo);
}
}
}
echo json_encode(array('msg'=>"更新成功,本次更新".$total."条用户数据!",'status'=>1));
}
/**
* GET 请求
* @param string $url
*/
public function http_get($url){
$oCurl = curl_init();
if(stripos($url,"https://")!==FALSE){
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
}
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
$sContent = curl_exec($oCurl);
$aStatus = curl_getinfo($oCurl);
curl_close($oCurl);
if(intval($aStatus["http_code"])==200){
return $sContent;
}else{
return false;
}
}目前我上面的方法有个弊端就是同步的时候老是卡断,比如公众号有5000以上的用户,就不行了,同步的时候会经常卡断,要多运行几次,才能同步完整,不知道大家有啥好的办法,解决这个问题。欢迎指导!最后我把数据据给大家加上,方便使用。
另外附上QQ群:515187709
test.rar
( 1.53 KB 下载:50 次 )
