/** * 实现的init_ucuser钩子方法,对公众号粉丝进行初始化,在需要初始化粉丝信息的地方通过 hook('init_ucuser',$params); 调用 * @params string $mp_id 公众号在系统中的唯一标识,member_public表的id,必填 * @params string $weObj 公众号实例 * @return void hook函数木有返回值 * 注意: */ public function init_ucuser($params) { if ($params['mp_id'] && $params['weObj'] instanceof TPWechat) { //带有公众号在系统中唯一ID,存在公众号实例,例如weixincontroller中的被动响应 $map['openid'] = get_openid(); $map['mp_id'] = $params['mp_id']; $ucuser = D('Ucuser'); $data = $ucuser->where($map)->find(); if (!$data) { //公众号没有这个粉丝信息,就注册一个 //先在Member表注册会员,使系统中uid统一,公众号粉丝在绑定手机后可登录网站 $aUsername = $aNickname = $map['openid']; //substr(,20); //以openid作为默认UcenterMember用户名和Member昵称 $aPassword = UCenterMember()->create_rand(); //随机密码,用户未通过公众号注册,就不可登录网站 $email = $aUsername . '@mp_id' . $map['mp_id'] . '.com'; //以openid@mpid123.com作为默认邮箱 $mobile = arr2str(UCenterMember()->rand_mobile()); //生成随机手机号已通过model校验,不实际使用,准确手机以微信绑定的为准 $aUnType = 5; //微信公众号粉丝注册 $aRole = 3; //默认公众号粉丝用户角色 /* 注册用户 */ $uid = UCenterMember()->register($aUsername, $aNickname, $aPassword, $email, $mobile, $aUnType); if (0 < $uid) { //注册成功 initRoleUser($aRole, $uid); //初始化角色用户 set_user_status($uid, 1); //微信注册的用户状态直接设置为1 } else { //注册失败,显示错误信息 } $uid = $ucuser->registerUser($uid, $map['mp_id'], $map['openid']); //用注册member获取的统一uid注册微信粉丝 get_ucuser_uid($uid); //设置session中uid } else { get_ucuser_uid($data['uid']); //设置session中uid } } else { //不存在公众号实例或没显式传mp_id参数,例如分享到朋友圈的内容,访问参数中必须带有公众号在系统中唯一标识mp_id $umap['openid'] = get_openid(); //只存在公众号信息的,在get_openid中通过oauth获取用户openid $umap['mp_id'] = I('mp_id'); //从controller的访问请求中获取mp_id if (!empty($umap['mp_id'])) { $ucuser = D('Ucuser'); $data = $ucuser->where($umap)->find(); if (!$data) { //公众号没有这个粉丝信息,就注册一个 //先在Member表注册会员,使系统中uid统一,公众号粉丝在绑定手机后可登录网站 $aUsername = $aNickname = $umap['openid']; //以openid作为默认UcenterMember用户名和Member昵称 $aPassword = UCenterMember()->create_rand(); //随机密码,用户未通过公众号注册,就不可登录网站 $email = $aUsername . '@mp_id' . $umap['mp_id'] . 'com'; //以openid@mpid123.com作为默认邮箱 $mobile = arr2str(UCenterMember()->rand_mobile()); //生成随机手机号已通过model校验,不实际使用,准确手机以微信绑定的为准 $aUnType = 5; //微信公众号粉丝注册 $aRole = 3; //默认公众号粉丝用户角色 /* 注册用户 */ $uid = UCenterMember()->register($aUsername, $aNickname, $aPassword, $email, $mobile, $aUnType); if (0 < $uid) { //注册成功 initRoleUser($aRole, $uid); //初始化角色用户 set_user_status($uid, 1); //微信注册的用户状态直接设置为1 } else { //注册失败,显示错误信息 } $uid = $ucuser->registerUser($uid, $umap['mp_id'], $umap['openid']); //用注册member获取的统一uid注册微信粉丝 get_ucuser_uid($uid); //设置session中uid } else { get_ucuser_uid($data['uid']); //设置session中uid } } else { //没有公众号信息,未能初始化粉丝 } } }
function get_ucuser_uid($uid = 0) { $mp_id = get_mpid(); if ($uid !== NULL) { session('uid_' . $mp_id, $uid); } elseif (!empty($_REQUEST['uid'])) { session('uid_' . $mp_id, $_REQUEST['uid']); } //以上是带uid参数调用函数时设置session中的uid $uid = session('uid_' . $mp_id); $isWeixinBrowser = isWeixinBrowser(); if (!$isWeixinBrowser) { //非微信浏览器返回false,调用此函数必须对false结果进行判断,非微信浏览器不可访问调用的controller return false; } //下面这段应该逻辑没问题,如果公众号配置信息错误或者没有snsapi_base作用域的获取信息权限可能会出现死循环,注释掉以下if可治愈 if ($uid <= 0 && $isWeixinBrowser) { $map['openid'] = get_openid(); $map['mp_id'] = $mp_id; $ucuser = D('Ucuser'); $data = $ucuser->where($map)->find(); if (!$data) { //公众号没有这个粉丝信息,就注册一个 //先在Member表注册会员,使系统中uid统一,公众号粉丝在绑定手机后可登录网站 //先在Member表注册会员,使系统中uid统一,公众号粉丝在绑定手机后可登录网站 $aUsername = $aNickname = $map['openid']; //以openid作为默认UcenterMember用户名和Member昵称 $aPassword = UCenterMember()->create_rand(); //随机密码,用户未通过公众号注册,就不可登录网站 $email = $aUsername . '@mp_id' . $map['mp_id'] . '.com'; //以openid@mpid123.com作为默认邮箱 $mobile = arr2str(UCenterMember()->rand_mobile()); //生成随机手机号以通过model校验,不实际使用,准确手机以微信绑定的为准 $aUnType = 5; //微信公众号粉丝注册 $aRole = 3; //默认公众号粉丝用户角色 /* 注册用户 */ $uid = UCenterMember()->register($aUsername, $aNickname, $aPassword, $email, $mobile, $aUnType); if (0 < $uid) { //注册成功 initRoleUser($aRole, $uid); //初始化角色用户 set_user_status($uid, 1); //微信注册的用户状态直接设置为1 } else { //注册失败,显示错误信息 } $uid = $ucuser->registerUser($uid, $map['mp_id'], $map['openid']); //用注册member获取的统一uid注册微信粉丝 session('uid_' . $mp_id, $uid); } else { $uid = $data['uid']; session('uid_' . $mp_id, $uid); } } if (empty($uid)) { return -1; } return $uid; }