| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330 |
- <?php
- /**
- * Created by PhpStorm.
- * Author: 芸众商城 www.yunzshop.com
- * Date: 17/2/28
- * Time: 上午5:16
- */
- namespace app\frontend\modules\member\services;
- use app\common\events\member\MergeMemberEvent;
- use app\common\exceptions\AppException;
- use app\common\exceptions\MemberErrorMsgException;
- use app\common\exceptions\MemberNotLoginException;
- use app\common\exceptions\ShopException;
- use app\common\facades\Setting;
- use app\common\helpers\Cache;
- use app\common\helpers\Client;
- use app\common\helpers\Url;
- use app\common\models\McMappingFans;
- use app\common\models\Member;
- use app\common\models\member\MemberChangeLog;
- use app\common\models\member\MemberDel;
- use app\common\models\member\MemberMarkLog;
- use app\common\models\member\MemberMerge;
- use app\common\models\MemberAlipay;
- use app\common\models\MemberGroup;
- use app\common\models\MemberShopInfo;
- use app\common\services\credit\ConstService;
- use app\common\services\finance\BalanceChange;
- use app\common\services\finance\PointService;
- use app\common\services\member\MemberMergeService;
- use app\common\services\Session;
- use app\frontend\models\McGroupsModel;
- use app\frontend\modules\member\models\McMappingFansModel;
- use app\frontend\modules\member\models\MemberMiniAppModel;
- use app\frontend\modules\member\models\MemberModel;
- use app\frontend\modules\member\models\MemberUniqueModel;
- use app\frontend\modules\member\models\MemberWechatModel;
- use app\frontend\modules\member\models\smsSendLimitModel;
- use app\frontend\modules\member\models\SubMemberModel;
- use Illuminate\Support\Facades\Cookie;
- use app\common\events\member\RegisterMember;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Redis;
- use Illuminate\Support\Facades\Schema;
- use Yunshop\Love\Common\Models\MemberLove;
- use Yunshop\Love\Common\Services\LoveChangeService;
- class MemberService
- {
- const TOKEN_EXPIRE = 2160000;
- /**
- * @var \app\frontend\models\Member
- */
- private static $_current_member;
- /**
- * @return \app\frontend\models\Member
- * @throws AppException
- */
- public static function getCurrentMemberModel()
- {
- if (isset(self::$_current_member)) {
- return self::$_current_member;
- }
- $uid = \YunShop::app()->getMemberId();
- if (!isset($uid)) {
- throw new AppException('uid不存在');
- }
- self::setCurrentMemberModel($uid);
- return self::$_current_member;
- }
- /**
- * @param $member_id
- * @throws AppException
- */
- public static function setCurrentMemberModel($member_id)
- {
- /**
- * @var \app\frontend\models\Member $member
- */
- $member = \app\frontend\models\Member::find($member_id);
- if (!isset($member)) {
- throw new AppException('(ID:' . $member_id . ')用户不存在');
- }
- self::$_current_member = $member;
- }
- /**
- * 用户是否登录
- *
- * @return bool
- */
- public static function isLogged()
- {
- if (\YunShop::app()->getMemberId()) {
- if (\app\frontend\models\Member::current()->hasOneDel) {
- MemberDel::delUpdate(\YunShop::app()->getMemberId());
- Session::clear('member_id');
- }
- }
- return \YunShop::app()->getMemberId() && \YunShop::app()->getMemberId() > 0;
- }
- /**
- * 验证手机号和密码
- *
- * @return bool
- */
- public static function validate($mobile, $password, $confirm_password = '')
- {
- //兼容港澳台手机号 把验证规则改为必填+纯数字
- if ($confirm_password == '') {
- $data = array(
- 'mobile' => $mobile,
- 'password' => $password,
- );
- $rules = array(
- 'mobile' => 'required|numeric',
- 'password' => 'required|min:6|regex:/^[A-Za-z0-9@.!#\$%\^&\*]+$/',
- );
- $message = array(
- 'regex' => ':attribute 格式错误',
- 'required' => ':attribute 不能为空',
- 'number' => ':attribute 格式错误',
- 'min' => ':attribute 最少6位'
- );
- $attributes = array(
- "mobile" => '手机号',
- 'password' => '密码',
- );
- } else {
- $data = array(
- 'mobile' => $mobile,
- 'password' => $password,
- 'confirm_password' => $confirm_password,
- );
- $rules = array(
- 'mobile' => 'required|numeric',
- 'password' => 'required|min:6|regex:/^[A-Za-z0-9@.!#\$%\^&\*]+$/',
- 'confirm_password' => 'same:password',
- );
- $message = array(
- 'regex' => ':attribute 格式错误',
- 'required' => ':attribute 不能为空',
- 'number' => ':attribute 格式错误',
- 'min' => ':attribute 最少6位',
- 'same' => ':attribute 不匹配'
- );
- $attributes = array(
- "mobile" => '手机号',
- 'password' => '密码',
- 'confirm_password' => '密码',
- );
- }
- $validate = \Validator::make($data, $rules, $message, $attributes);
- if ($validate->fails()) {
- $warnings = $validate->messages();
- $show_warning = $warnings->first();
- return show_json('0', $show_warning);
- } else {
- return show_json('1');
- }
- }
- public static function mobileValidate($validate_data = [])
- {
- if (!$validate_data['mobile']) {
- throw new ShopException('手机号为空');
- }
- if (!is_numeric($validate_data['mobile'])) {
- throw new ShopException('手机号格式错误');
- }
- if ($validate_data['state'] && !is_numeric($validate_data['state']) && mb_strlen($validate_data['state']) > 5) {
- throw new ShopException('国际号格式错误');
- }
- //没开启国家区号统一按 86 算
- if (!\Setting::get('shop.sms')['country_code'] || $validate_data['state'] == 86) {
- $pre_str = '/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/';
- $pre_res = preg_match($pre_str, $validate_data['mobile']);
- if (!$pre_res || mb_strlen($validate_data['mobile']) != 11) {
- throw new ShopException('手机号格式错误');
- }
- }
- }
- /**
- * 短信发送限制
- *
- * 每天最多5条
- */
- public static function smsSendLimit($uniacid, $mobile)
- {
- $curr_time = time();
- $mobile_info = smsSendLimitModel::getMobileInfo($uniacid, $mobile);
- if (!empty($mobile_info)) {
- $update_time = $mobile_info['created_at'];
- $total = $mobile_info['total'];
- if ((date('Ymd', $curr_time) != date('Ymd', $update_time))) {
- $total = 0;
- }
- } else {
- $total = 0;
- }
- if ($total < 5) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 更新发送短信条数
- *
- * 每天最多5条
- */
- public static function udpateSmsSendTotal($uniacid, $mobile)
- {
- $curr_time = time();
- $mobile_info = smsSendLimitModel::getMobileInfo($uniacid, $mobile);
- if (!empty($mobile_info)) {
- $update_time = $mobile_info['created_at'];
- $total = $mobile_info['total'];
- if ($update_time <= $curr_time) {
- if (date('Ymd', $curr_time) == date('Ymd', $update_time)) {
- if ($total <= 5) {
- ++$total;
- smsSendLimitModel::updateData(array(
- 'uniacid' => $uniacid,
- 'mobile' => $mobile), array(
- 'total' => $total,
- 'created_at' => $curr_time));
- }
- } else {
- smsSendLimitModel::updateData(array(
- 'uniacid' => $uniacid,
- 'mobile' => $mobile), array(
- 'total' => 1,
- 'created_at' => $curr_time));
- }
- }
- } else {
- smsSendLimitModel::insertData(array(
- 'uniacid' => $uniacid,
- 'mobile' => $mobile,
- 'total' => 1,
- 'created_at' => $curr_time)
- );
- }
- }
- /**
- * 阿里大鱼
- *
- * @param $sms
- * @param $templateType
- * @return array
- */
- public static function send_sms_alidayu($sms, $templateType)
- {
- switch ($templateType) {
- case 'reg':
- $templateCode = $sms['templateCode'];
- $params = @explode("\n", $sms['product']);
- break;
- case 'forget':
- $templateCode = $sms['templateCodeForget'];
- $params = @explode("\n", $sms['forget']);
- break;
- case 'login':
- $templateCode = $sms['templateCodeLogin'];
- $params = @explode("\n", $sms['login']);
- break;
- default:
- $params = array();
- $templateCode = $sms['templateCode'];
- break;
- }
- return array('templateCode' => $templateCode, 'params' => $params);
- }
- /**
- * 互亿无线
- *
- * @param $account
- * @param $pwd
- * @param $mobile
- * @param $code
- * @param string $type
- * @param $name
- * @param $title
- * @param $total
- * @param $tel
- * @return mixed
- */
- public static function send_sms($account, $pwd, $mobile, $code, $type = 'check', $name = '', $title = '', $total = '', $tel = '')
- {
- if ($type == 'check') {
- $content = "您的验证码是:" . $code . "。请不要把验证码泄露给其他人。如非本人操作,可不用理会!";
- } elseif ($type == 'verify') {
- $verify_set = $sms = \Setting::get('shop.sms');
- $allset = iunserializer($verify_set['plugins']);
- if (is_array($allset) && !empty($allset['verify']['code_template'])) {
- $content = sprintf($allset['verify']['code_template'], $code, $title, $total, $name, $mobile, $tel);
- } else {
- $content = "提醒您,您的核销码为:" . $code . ",订购的票型是:" . $title . ",数量:" . $total . "张,购票人:" . $name . ",电话:" . $mobile . ",门店电话:" . $tel . "。请妥善保管,验票使用!";
- }
- }
- $smsrs = file_get_contents('http://106.ihuyi.cn/webservice/sms.php?method=Submit&account=' . $account . '&password=' . $pwd . '&mobile=' . $mobile . '&content=' . urldecode($content));
- return xml_to_array($smsrs);
- }
- public static function send_smsV2($account, $pwd, $mobile, $code, $state = '86', $type = 'check', $name = '', $title = '', $total = 0, $tel = '')
- {
- if ($type == 'check') {
- //$content = "您的验证码是:" . $code . "。请不要把验证码泄露给其他人。如非本人操作,可不用理会!";
- $content = "您的验证码是:" . $code . "。请不要把验证码泄露给其他人。";
- } elseif ($type == 'verify') {
- $verify_set = $sms = \Setting::get('shop.sms');
- $allset = iunserializer($verify_set['plugins']);
- if (is_array($allset) && !empty($allset['verify']['code_template'])) {
- $content = sprintf($allset['verify']['code_template'], $code, $title, $total, $name, $mobile, $tel);
- } else {
- $content = "提醒您,您的核销码为:" . $code . ",订购的票型是:" . $title . ",数量:" . $total . "张,购票人:" . $name . ",电话:" . $mobile . ",门店电话:" . $tel . "。请妥善保管,验票使用!";
- }
- }
- if ($state == '86') {
- $url = 'http://106.ihuyi.cn/webservice/sms.php?method=Submit';
- $smsrs = file_get_contents($url . '&account=' . $account . '&password=' . $pwd . '&mobile=' . $mobile . '&content=' . rawurlencode($content));
- } else {
- $url = 'http://api.isms.ihuyi.com/webservice/isms.php?method=Submit';
- $mobile = $state . ' ' . $mobile;
- $data = array(
- 'account' => $account,
- 'password' => $pwd,
- 'mobile' => $mobile,
- 'content' => $content,
- );
- $query = http_build_query($data);
- $smsrs = file_get_contents($url . '&' . $query);
- }
- return xml_to_array($smsrs);
- }
- function xml_to_array($xml)
- {
- $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
- if (preg_match_all($reg, $xml, $matches)) {
- $count = count($matches[0]);
- for ($i = 0; $i < $count; $i++) {
- $subxml = $matches[2][$i];
- $key = $matches[1][$i];
- if (preg_match($reg, $subxml)) {
- $arr[$key] = xml_to_array($subxml);
- } else {
- $arr[$key] = $subxml;
- }
- }
- }
- return $arr;
- }
- /**
- * pc端注册 保存信息
- *
- * @param $member_info
- * @param $uniacid
- */
- protected function save($member_info, $uniacid)
- {
- Session::set('member_id', $member_info['uid']);
- setcookie('Yz-appToken', encrypt($member_info['mobile'] . '\t' . $member_info['uid'] . '\t' .md5($member_info['password'])), time() + self::TOKEN_EXPIRE, '/');
- }
- /**
- * 检查验证码
- *
- * @return array
- */
- public static function checkCode()
- {
- $code = \YunShop::request()->code;
- $mobile = \YunShop::request()->mobile;
- return app('sms')->checkCode($mobile, $code);
- }
- /**
- * 检查验证码
- *
- * @return array
- */
- public static function checkAppCode()
- {
- $code = \YunShop::request()->code;
- $mobile = \YunShop::request()->mobile;
- $res = app('sms')->checkAppCode($mobile, $code);
- return $res;
- }
- /**
- * 检查邀请码
- *
- * @return array
- */
- public static function inviteCode()
- {
- $invite_code = \YunShop::request()->invite_code;
- \Log::info('invite_code', $invite_code);
- $status = \Setting::get('shop.member');
- \Log::info('status', $status);
- $status['is_invite'] = Member::chkInviteCode();
- \Log::info('is_invite', $status['is_invite']);
- if ($status['is_invite'] == 1) {//判断邀请码是否开启 1开启 0关闭
- \Log::info('is_invite == 1');
- if ($status['required'] == 1 && empty($invite_code)) { //判断邀请码是否必填,1必填 0可选填 判断邀请码是否为空
- \Log::info('empty--invite_code');
- return show_json('0', '请输入邀请码');
- } elseif ($status['required'] == 1 && !empty($invite_code)) { //判断邀请码是否必填,1必填 0可选填 判断邀请码是否为空
- $data = MemberShopInfo:: getInviteCode($invite_code); //查询邀请码是否存在
- \Log::info('data', $data);
- if (!$data) {
- \Log::info('invalited--invite_code');
- return show_json('0', '邀请码无效');
- }
- }
- }
- return show_json('1');
- }
- /**
- * 公众号开放平台授权登陆
- *
- * @param $uniacid
- * @param $userinfo
- * @return array|int|mixed
- */
- public function unionidLogin($uniacid, $userinfo, $upperMemberId = null, $loginType = null)
- {
- \Log::debug('----userinfo2----', $userinfo);
- $member_id = 0;
- $userinfo['nickname'] = $this->filteNickname($userinfo);
- $UnionidInfo = MemberUniqueModel::getUnionidInfo($uniacid, $userinfo['unionid'])->first();
- \Log::debug('----unique uid----', $UnionidInfo->member_id);
- $mc_mapping_fans_model = $this->getFansModel($userinfo['openid']);
- if (request()->type == 1) {
- \Log::debug('----fans uid----', $mc_mapping_fans_model->uid);
- } else {
- \Log::debug('----fans uid----', $mc_mapping_fans_model->member_id);
- }
- if (!is_null($UnionidInfo)) {
- $member_id = $UnionidInfo->member_id;
- }
- $yz_member = MemberShopInfo::getMemberShopInfo($member_id);
- if (!empty($yz_member)) {
- if (!empty($yz_member->is_old)) {
- throw new MemberErrorMsgException('会员数据有冲突,请联系客服');
- }
- }
- $this->checkFansUid($mc_mapping_fans_model, $userinfo);
- //检查member_id是否一致
- if (!is_null($UnionidInfo) && !is_null($mc_mapping_fans_model)) {
- $member_id = $this->checkMember($UnionidInfo, $mc_mapping_fans_model, $userinfo);
- if ($member_id > 0 && $UnionidInfo->member_id != $member_id) {
- $UnionidInfo->member_id = $member_id;
- }
- }
- if (empty($member_id) && !empty($mc_mapping_fans_model)) {
- $member_id = $mc_mapping_fans_model->uid;
- }
- $member_model = Member::getMemberById($member_id);
- $member_shop_info_model = MemberShopInfo::getMemberShopInfo($member_id);
- if (!empty($UnionidInfo->unionid) && !empty($member_model)
- && !empty($mc_mapping_fans_model) && !empty($member_shop_info_model)) {
- \Log::debug('微信登陆更新');
- $types = explode('|', $UnionidInfo->type);
- $member_id = $UnionidInfo->member_id;
- if (!is_null($loginType) && !in_array($loginType, $types)) {
- //更新ims_yz_member_unique表
- MemberUniqueModel::updateData(array(
- 'unique_id' => $UnionidInfo->unique_id,
- 'member_id' => $member_id,
- 'type' => $UnionidInfo->type . '|' . $loginType
- ));
- }
- $this->checkMemberInfo($member_model, $mc_mapping_fans_model, $member_shop_info_model);
- if ((!empty($userinfo['nickname']) && $member_model->nickname != $userinfo['nickname']) || ($userinfo['headimgurl'] && $member_model->avatar != $userinfo['headimgurl'])) {
- $this->updateMemberInfo($member_id, $userinfo);
- }
- $this->updateSubMemberInfoV2($member_id, $userinfo);
- } else {
- \Log::debug('添加新会员');
- \Log::debug('----添加会员前 uid----', $member_id);
- //DB::transaction(function () use (&$member_id, $member_model, $mc_mapping_fans_model, $member_shop_info_model, $uniacid, $userinfo, $UnionidInfo, $upperMemberId) {
- if (empty($member_model) && empty($mc_mapping_fans_model)) {
- $member_id = $this->addMemberInfo($uniacid, $userinfo);
- if ($member_id === false) {
- return show_json(8, '保存用户信息失败');
- }
- } elseif (empty($member_model) && 0 === $mc_mapping_fans_model->uid) {
- $member_id = $this->addMcMemberInfo($uniacid, $userinfo);
- $this->updateFansMember($mc_mapping_fans_model, $member_id, $userinfo);
- } elseif ($member_model && 0 === $mc_mapping_fans_model->uid) {
- $this->updateFansMember($mc_mapping_fans_model, $member_id, $userinfo);
- } elseif ($member_model && empty($member_model->nickname)) { // 更新用户信息(门店静默、无关注登陆)
- $this->updateMemberInfo($member_id, $userinfo);
- } elseif (empty($member_model) && $mc_mapping_fans_model->uid) {
- $this->updateFansMember($mc_mapping_fans_model, $member_id, $userinfo);
- } elseif (empty($mc_mapping_fans_model)) {
- //开放平台 先小程序后微信 更新微信粉丝
- $this->addFansMember($member_id, $uniacid, $userinfo);
- $this->updateHeadPic($member_id, $userinfo);
- }
- if (empty($member_shop_info_model)) {
- if (0 == $member_id) {
- \Log::debug(sprintf('----用户数据异常---%s-%s', $userinfo['openid'], $userinfo['nickname']));
- throw new AppException('用户数据异常, 注册失败');
- }
- $this->addSubMemberInfoV2($uniacid, $member_id, $userinfo);
- } else {
- $this->updateSubMemberInfo($member_id, $userinfo['openid']);
- }
- if (empty($UnionidInfo->unionid)) {
- //添加ims_yz_member_unique表
- $this->addMemberUnionid($uniacid, $member_id, $userinfo['unionid']);
- }
- //生成分销关系链
- if ($upperMemberId) {
- \Log::debug(sprintf('----海报生成分销关系链----%d', $upperMemberId));
- Member::createRealtion($member_id, $upperMemberId);
- } else {
- \Log::debug(sprintf('----生成分销关系链----%d-%d', $upperMemberId, $member_id));
- Member::createRealtion($member_id);
- }
- if (app('plugins')->isEnabled('share-reward')) {
- \Log::debug(sprintf('----RegisterMember----%d-%d', $upperMemberId, $member_id));
- $mid = $upperMemberId ? $upperMemberId : 0;
- $mid = request()->mid && empty($mid) ? request()->mid : $mid;
- // event(new RegisterMember($mid, $member_id));
- }
- $mid = $mid ?: 0;
- event(new RegisterMember($mid, $member_id));
- //});
- }
- \Log::debug('--------return_member_id---------', $member_id);
- return $member_id;
- }
- /**
- * 公众号平台授权登陆
- *
- * @param $uniacid
- * @param $userinfo
- * @return array|int|mixed
- */
- public function openidLogin($uniacid, $userinfo, $upperMemberId = NULL)
- {
- \Log::debug('----userinfo1----', $userinfo);
- $member_id = 0;
- $userinfo['nickname'] = $this->filteNickname($userinfo);
- $fans_mode = $this->getFansModel($userinfo['openid']);
- $this->checkFansUid($fans_mode, $userinfo);
- if ($fans_mode) {
- $member_model = Member::getMemberById($fans_mode->uid);
- $member_shop_info_model = MemberShopInfo::getMemberShopInfo($fans_mode->uid);
- $member_id = $fans_mode->uid;
- }
- if ($yz_member_id = $this->checkYzMember($member_model, $fans_mode, $member_shop_info_model, $userinfo)) {
- $member_id = $yz_member_id;
- $member_shop_info_model = MemberShopInfo::getMemberShopInfo($member_id);
- }
- if ((!empty($member_model)) && (!empty($fans_mode) && !empty($member_shop_info_model))) {
- \Log::debug('微信登陆更新');
- $this->checkMemberInfo($member_model, $fans_mode, $member_shop_info_model);
- if ((!empty($userinfo['nickname']) && $member_model->nickname != $userinfo['nickname']) || ($userinfo['headimgurl'] && $member_model->avatar != $userinfo['headimgurl'])) {
- $this->updateMemberInfo($member_id, $userinfo);
- }
- $this->updateSubMemberInfoV2($member_id, $userinfo);
- } else {
- \Log::debug('添加新会员');
- //DB::transaction(function () use (&$member_id, $uniacid, $userinfo, $member_model, $fans_mode, $member_shop_info_model, $upperMemberId){
- if (empty($member_model) && empty($fans_mode)) {
- $member_id = $this->addMemberInfo($uniacid, $userinfo);
- if ($member_id === false) {
- return show_json(8, '保存用户信息失败');
- }
- } elseif (empty($member_model) && 0 === $fans_mode->uid) {
- $member_id = $this->addMcMemberInfo($uniacid, $userinfo);
- $this->updateFansMember($fans_mode, $member_id, $userinfo);
- } elseif (empty($member_model) && $fans_mode->uid) {
- $this->updateFansMember($fans_mode, $member_id, $userinfo);
- } elseif ($member_model && empty($member_model->nickname)) { // 更新用户信息(门店静默、无关注登陆)
- $this->updateMemberInfo($member_id, $userinfo);
- }
- if (empty($member_shop_info_model)) {
- if (0 == $member_id) {
- \Log::debug(sprintf('----用户数据异常---%s-%s', $userinfo['openid'], $userinfo['nickname']));
- throw new AppException('用户数据异常, 注册失败');
- }
- $this->addSubMemberInfoV2($uniacid, $member_id, $userinfo);
- }
- //生成分销关系链
- if ($upperMemberId) {
- \Log::debug(sprintf('----海报生成分销关系链----%d', $upperMemberId));
- Member::createRealtion($member_id, $upperMemberId);
- } else {
- \Log::debug(sprintf('----生成分销关系链----%d-%d', $upperMemberId, $member_id));
- Member::createRealtion($member_id);
- }
- $upperMemberId = $upperMemberId ?: 0;
- event(new RegisterMember($upperMemberId, $member_id));
- // if (app('plugins')->isEnabled('share-reward')) {
- // event(new RegisterMember($upperMemberId, $member_id));
- // }
- //});
- }
- \Log::debug('--------return_member_id---------', $member_id);
- return $member_id;
- }
- /**
- * 过滤微信用户名特殊符号
- *
- * @param $userinfo
- * @return mixed
- */
- public function filteNickname($userinfo)
- {
- $nickname = $userinfo;
- if (is_array($userinfo)) {
- $nickname = $userinfo['nickname'];
- }
- $nickname = preg_replace('/[\x{1F600}-\x{1F64F}]/u', '', $nickname);
- $nickname = preg_replace('/[\x{1F300}-\x{1F5FF}]/u', '', $nickname);
- $nickname = preg_replace('/[\x{1F680}-\x{1F6FF}]/u', '', $nickname);
- $nickname = preg_replace('/[\x{2600}-\x{26FF}]/u', '', $nickname);
- $nickname = preg_replace('/[\x{2700}-\x{27BF}]/u', '', $nickname);
- $nickname = str_replace(array('"', '\''), '', $nickname);
- /* 去除表情字符串 */
- $nickname = preg_replace("#(\\\ud[0-9a-f]{3})#i", "", json_encode($nickname));
- $nickname = json_decode($nickname);
- \Log::debug('post', [$nickname]);
- $nickname = $this->cutNickname($nickname);
- \Log::debug('json', [$nickname]);
- return addslashes(trim($nickname));
- }
- /**
- * 截取字符串长度
- *
- * @param $nickname
- * @return string
- */
- public function cutNickname($nickname)
- {
- if (mb_strlen($nickname) > 18) {
- return mb_substr($nickname, 0, 18);
- }
- return $nickname;
- }
- /**
- * 会员基础表操作
- *
- * @param $uniacid
- * @param $userinfo
- * @return mixed
- */
- public function addMemberInfo($uniacid, $userinfo)
- {
- \Log::debug('---addMemberInfo---');
- //添加mc_members表
- $default_group = McGroupsModel::getDefaultGroupId();
- $uid = MemberModel::insertData($userinfo, array(
- 'uniacid' => $uniacid,
- 'groupid' => $default_group->groupid
- ));
- return $uid;
- }
- /**
- * 会员辅助表操作
- *
- * @param $uniacid
- * @param $member_id
- */
- public function addSubMemberInfo($uniacid, $member_id, $openid = 0)
- {
- //添加yz_member表
- $default_sub_group_id = MemberGroup::getDefaultGroupId()->first();
- if (!empty($default_sub_group_id)) {
- $default_subgroup_id = $default_sub_group_id->id;
- } else {
- $default_subgroup_id = 0;
- }
- SubMemberModel::replace(array(
- 'member_id' => $member_id,
- 'uniacid' => $uniacid,
- 'group_id' => $default_subgroup_id,
- 'level_id' => 0,
- 'pay_password' => '',
- 'salt' => '',
- 'yz_openid' => $openid,
- ));
- }
- public function addSubMemberInfoV2($uniacid, $member_id, $userinfo)
- {
- //添加yz_member表
- $default_sub_group_id = MemberGroup::getDefaultGroupId()->first();
- if (!empty($default_sub_group_id)) {
- $default_subgroup_id = $default_sub_group_id->id;
- } else {
- $default_subgroup_id = 0;
- }
- $invite_code = MemberModel::getInviteCode($member_id);
- SubMemberModel::replace(array(
- 'member_id' => $member_id,
- 'uniacid' => $uniacid,
- 'group_id' => $default_subgroup_id,
- 'level_id' => 0,
- 'pay_password' => '',
- 'salt' => '',
- 'yz_openid' => $userinfo['openid'],
- 'access_token_1' => isset($userinfo['access_token']) ? $userinfo['access_token'] : '',
- 'access_expires_in_1' => isset($userinfo['expires_in']) ? time() + $userinfo['expires_in'] : '',
- 'refresh_token_1' => isset($userinfo['refresh_token']) ? $userinfo['refresh_token'] : '',
- 'refresh_expires_in_1' => time() + (28 * 24 * 3600),
- 'invite_code' => $invite_code
- ));
- }
- private function updateSubMemberInfo($uid, $userinfo)
- {
- SubMemberModel::updateOpenid(
- $uid, ['yz_openid' => $userinfo['openid']]
- );
- }
- protected function updateSubMemberInfoV2($uid, $userinfo)
- {
- }
- /**
- * 检查会员信息是否一致
- *
- * 微擎会员被删除导致商城会员不匹配
- *
- * @param $mcMember
- * @param $fansMember
- * @param $yzMember
- */
- protected function checkMemberInfo($mcMember, $fansMember, $yzMember)
- {
- }
- /**
- * 会员关联表操作
- *
- * @param $uniacid
- * @param $member_id
- * @param $unionid
- */
- public function addMemberUnionid($uniacid, $member_id, $unionid)
- {
- MemberUniqueModel::replace(array(
- 'uniacid' => $uniacid,
- 'unionid' => $unionid,
- 'member_id' => $member_id,
- 'type' => self::LOGIN_TYPE
- ));
- }
- /**
- * 更新微信用户信息
- *
- * @param $member_id
- * @param $userinfo
- */
- public function updateMemberInfo($member_id, $userinfo)
- {
- //更新mc_members
- $mc_data = array(
- 'nickname' => isset($userinfo['nickname']) ? stripslashes($userinfo['nickname']) : '',
- 'avatar' => isset($userinfo['headimgurl']) ? $userinfo['headimgurl'] : '',
- 'gender' => isset($userinfo['sex']) ? $userinfo['sex'] : '-1',
- 'nationality' => isset($userinfo['country']) ? $userinfo['country'] : '',
- 'resideprovince' => isset($userinfo['province']) ? $userinfo['province'] : '' . '省',
- 'residecity' => isset($userinfo['city']) ? $userinfo['city'] : '' . '市'
- );
- MemberModel::updataData($member_id, $mc_data);
- }
- /**
- * 登陆处理
- * @param $userinfo
- * @param null $upperMemberId
- * @return int
- * @throws AppException
- * @throws MemberErrorMsgException
- */
- public function memberLogin($userinfo, $upperMemberId = NULL)
- {
- \Log::debug('--------login_type--------', request()->type);
- if (is_array($userinfo) && !empty($userinfo['unionid'])) {
- $member_id = $this->unionidLogin(\YunShop::app()->uniacid, $userinfo, $upperMemberId);
- } elseif (is_array($userinfo) && !empty($userinfo['openid'])) {
- $member_id = $this->openidLogin(\YunShop::app()->uniacid, $userinfo, $upperMemberId);
- }
- return $member_id;
- }
- public function memberInfoAttrStatus($member)
- {
- $form = [];
- $set = \Setting::get('shop.form');
- if (!is_null($set)) {
- $set = json_decode($set, true);
- if (!empty($set['form'])) {
- $form = array_values(array_sort($set['form'], function ($value) {
- return $value['sort'];
- }));
- if (!empty($member['member_form'])) {
- $member_form = json_decode($member['member_form'], true);
- $form = self::getMemberForm($form, $member_form);
- }
- }
- } else {
- $set['base'] = [
- 'sex' => 1,
- 'address' => 1,
- 'birthday' => 1
- ];
- }
- $set['form'] = $form;
- return $set;
- }
- private function getMemberForm($form, $member_form)
- {
- foreach ($form as &$rows) {
- foreach ($member_form as $item) {
- if ($item['pinyin'] == $rows['pinyin']) {
- $rows['value'] = $item['value'];
- }
- }
- }
- return $form;
- }
- public function updateMemberForm($data)
- {
- $member_form = [];
- $set = \Setting::get('shop.form');
- $set = json_decode($set, true);
- // echo '<pre>';print_r($data['customDatas']);exit;
- if (!empty($set['form'])) {
- $member_form = $form = array_values(array_sort($set['form'], function ($value) {
- return $value['sort'];
- }));
- foreach ($form as $key => &$item) {
- foreach ($data['customDatas'] as $rows) {
- if ($rows['pinyin'] == $item['pinyin']) {
- $item['del'] = 1;
- $member_form[$key]['value'] = $rows['value'];
- }
- }
- }
- }
- $set['form'] = $form;
- \Setting::set('shop.form', json_encode($set));
- return $member_form;
- }
- /**
- * 检查同步登录凭证和统一表
- * @param $UnionidInfo 统一表会员信息
- * @param $fansInfo 当前登录凭证会员信息
- * @param $userInfo 当前授权会员信息
- * @return mixed
- * @throws MemberErrorMsgException
- */
- public function checkMember($UnionidInfo, $fansInfo, $userInfo)
- {
- $relation_set = Setting::get('relation_base');
- \Log::debug('----unionid---', $UnionidInfo->member_id);
- \Log::debug('----fans----', $fansInfo->uid);
- if ($UnionidInfo->member_id != $fansInfo->uid) {
- if ($UnionidInfo->member_id == 0) {
- return $fansInfo->uid;
- }
- if ($fansInfo->uid == 0) {
- return $UnionidInfo->member_id;
- }
- $merge_choice = $relation_set['is_merge_save_level'];
- $merge_choice_uids = $this->memberChoice($merge_choice, $UnionidInfo, $fansInfo);
- list($main_member_id, $abandon_member_id) = $merge_choice_uids;
- $abandon_member = Member::getMemberById($abandon_member_id);
- if ($abandon_member && isset($relation_set['is_member_merge']) && $relation_set['is_member_merge'] != 1 && time() > ($abandon_member->createtime + 5 * 60)) {
- //新会员合并按钮
- $yz_main_member = MemberShopInfo::getMemberShopInfo($main_member_id);
- $yz_abandon_member = MemberShopInfo::getMemberShopInfo($abandon_member_id);
- if (!$yz_main_member) {
- $this->addYzMember($main_member_id);
- }
- if (!$yz_abandon_member) {
- $this->addYzMember($abandon_member_id);
- }
- MemberShopInfo::uniacid()->where('member_id', $main_member_id)->update(['is_old' => 1, 'mark_member_id' => $abandon_member_id]);
- MemberShopInfo::uniacid()->where('member_id', $abandon_member_id)->update(['is_old' => 1, 'mark_member_id' => $main_member_id]);
- throw new MemberErrorMsgException('会员数据异常,请联系客服');
- } else {
- //全自动合并按钮
- $exception = DB::transaction(function () use ($main_member_id, $abandon_member_id, $fansInfo, $userInfo, $relation_set) {
- $abandon_member = Member::getMemberById($abandon_member_id);
- $main_member = Member::getMemberById($main_member_id);
- $merge_data = [
- 'uniacid' => \YunShop::app()->uniacid,
- 'before_uid' => $abandon_member_id,
- 'after_uid' => $main_member_id,
- 'before_mobile' => $abandon_member->mobile,
- 'after_mobile' => $main_member->mobile,
- 'before_point' => $abandon_member->credit1?:0.00,
- 'after_point' => bcadd($main_member->credit1, $abandon_member->credit1, 2)?:0.00,
- 'before_amount' => $abandon_member->credit2?:0.00,
- 'after_amount' => bcadd($main_member->credit2, $abandon_member->credit2, 2)?:0.00,
- 'set_content' => json_encode($relation_set),
- 'merge_type' => 3,
- ];
- //删除重复微擎会员
- $mc_member = Member::getMemberById($main_member_id);
- if ($mc_member) {
- Member::uniacid()->where('uid', $abandon_member_id)->delete();
- } else {
- Member::uniacid()->where('uid', $abandon_member_id)->update(['uid' => $main_member_id]);
- }
- //删除重复商城会员
- $sub_member = MemberShopInfo::getMemberShopInfo($main_member_id);
- if ($sub_member) {
- MemberShopInfo::uniacid()->where('member_id', $abandon_member_id)->delete();
- } else {
- MemberShopInfo::uniacid()->where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
- }
- //合并处理服务
- (new MemberMergeService($main_member_id, $abandon_member_id, $merge_data))->handel();
- //小程序
- MemberMiniAppModel::updateData($abandon_member_id, ['member_id' => $main_member_id]);
- //app
- MemberWechatModel::updateData($abandon_member_id, ['member_id' => $main_member_id]);
- //公众号
- McMappingFans::where('uid', $abandon_member_id)->update(['uid' => $main_member_id]);
- //聚合cps
- if (Schema::hasTable('yz_member_aggregation_app')) {
- DB::table('yz_member_aggregation_app')->where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
- }
- //企业微信
- if (Schema::hasTable('yz_member_customer')) {
- DB::table('yz_member_customer')->where('uid',$abandon_member_id)->update(['uid' => $main_member_id]);
- }
- //unionid
- MemberUniqueModel::where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
- //支付宝
- MemberAlipay::where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
- $this->updateFansMember($fansInfo, $main_member_id, $userInfo);
- });
- if (!is_null($exception)) {
- throw new MemberErrorMsgException('sql执行错误,需回滚');
- }
- event(new MergeMemberEvent($main_member_id, $abandon_member_id));
- return $main_member_id;
- }
- }
- return $UnionidInfo->member_id;
- }
- private function addYzMember($member_id)
- {
- $default_group = McGroupsModel::getDefaultGroupId();
- $invite_code = MemberModel::getInviteCode($member_id);
- $yz_member = SubMemberModel::uniacid()->where('member_id', $member_id)->first();
- if (!$yz_member) {
- $add_arr = [
- 'member_id' => $member_id,
- 'uniacid' => \Yunshop::app()->uniacid,
- 'group_id' => $default_group->id ?: 0,
- 'level_id' => 0,
- 'pay_password' => '',
- 'salt' => '',
- 'yz_openid' => '',
- 'access_token_1' => '',
- 'access_expires_in_1' => '',
- 'refresh_token_1' => '',
- 'refresh_expires_in_1' => '',
- 'invite_code' => $invite_code
- ];
- SubMemberModel::create($add_arr);
- }
- }
- private function memberChoice($merge_choice, $UnionidInfo, $fansInfo)
- {
- $unique_uid = $UnionidInfo->member_id;
- $fans_uid = $fansInfo->uid;
- switch ($merge_choice) {
- case 1 : //手机号
- $member_uni = Member::getMemberById($unique_uid);
- $member_fans = Member::getMemberById($fans_uid);
- if ((empty($member_uni->mobile) && empty($member_fans->mobile)) || ($member_uni->mobile && $member_fans->mobile)) {
- if ($unique_uid < $fans_uid) {
- $main_member_id = $unique_uid;
- $abandon_member_id = $fans_uid;
- } else {
- $main_member_id = $fans_uid;
- $abandon_member_id = $unique_uid;
- }
- } elseif (empty($member_uni->mobile) && !empty($member_fans->mobile)) {
- $main_member_id = $fans_uid;
- $abandon_member_id = $unique_uid;
- } else {
- $main_member_id = $unique_uid;
- $abandon_member_id = $fans_uid;
- }
- break;
- case 2 : //公众号
- $member_uni = McMappingFans::getFansById($unique_uid);
- $member_fans = McMappingFans::getFansById($fans_uid);
- list($main_member_id, $abandon_member_id) = $this->handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid);
- break;
- case 3 : //小程序
- $member_uni = MemberMiniAppModel::getFansById($unique_uid);
- $member_fans = MemberMiniAppModel::getFansById($fans_uid);
- list($main_member_id, $abandon_member_id) = $this->handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid);
- break;
- case 4 : //app
- $member_uni = MemberWechatModel::getFansById($unique_uid);
- $member_fans = MemberWechatModel::getFansById($fans_uid);
- list($main_member_id, $abandon_member_id) = $this->handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid);
- break;
- case 5 : //alipay
- $member_uni = MemberAlipay::getFansById($unique_uid);
- $member_fans = MemberAlipay::getFansById($fans_uid);
- list($main_member_id, $abandon_member_id) = $this->handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid);
- break;
- default : //注册时间
- if ($unique_uid < $fans_uid) {
- $main_member_id = $unique_uid;
- $abandon_member_id = $fans_uid;
- } else {
- $main_member_id = $fans_uid;
- $abandon_member_id = $unique_uid;
- }
- break;
- }
- return [$main_member_id, $abandon_member_id];
- }
- private function handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid)
- {
- if (($member_uni && $member_fans) || (empty($member_uni) && empty($member_fans))) {
- if ($unique_uid < $fans_uid) {
- $main_member_id = $unique_uid;
- $abandon_member_id = $fans_uid;
- } else {
- $main_member_id = $fans_uid;
- $abandon_member_id = $unique_uid;
- }
- } elseif (empty($member_uni) && !empty($member_fans)) {
- $main_member_id = $fans_uid;
- $abandon_member_id = $unique_uid;
- } else {
- $main_member_id = $unique_uid;
- $abandon_member_id = $fans_uid;
- }
- return [$main_member_id, $abandon_member_id];
- }
- private function updateHeadPic($member_id, $userInfo)
- {
- if (!empty($userInfo)) {
- Member::getMemberByUid($member_id)->update([
- 'nickname' => $this->filteNickname($userInfo),
- 'avatar' => $userInfo['headimgurl'],
- ]);
- }
- }
- public function updateFansMember($fan, $member_id, $userinfo)
- {
- //TODO
- }
- /**
- * 扫海报关注
- *
- * 关注->微擎注册->商城注册
- *
- * 接口延迟,商城无法监控微擎行为导致会员注册重复1(fans->uid=0; mc_members=null)
- *
- * @param $fansModel
- * @param $userInfo
- */
- private function checkFansUid($fansModel, $userInfo)
- {
- if ($fansModel && (0 == $fansModel->uid || 1 == $fansModel->uid)) {
- $member_id = SubMemberModel::getMemberId($userInfo['openid']);
- if (!is_null($member_id)) {
- $fansModel->uid = $member_id;
- $this->updateFansMember($fansModel, $member_id, $userInfo);
- }
- }
- }
- /**
- * 扫海报关注
- *
- * 关注->微擎注册->商城注册
- *
- * 接口延迟,商城无法监控微擎行为导致会员注册重复2(fans->uid被更新; mc_members存在)
- *
- * @param $mc_members
- * @param $fans
- * @param $yz_member
- * @param $userInfo
- * @return int
- */
- private function checkYzMember($mc_members, $fans, $yz_member, $userInfo)
- {
- if (!is_null($mc_members) && !is_null($fans) && is_null($yz_member)) {
- $member_id = SubMemberModel::getMemberId($userInfo['openid']);
- if (!is_null($member_id) && $member_id != 0 && $member_id != $fans->uid) {
- if (Member::getMemberById($member_id)) {
- Member::deleted($fans->uid);
- $this->updateFansMember($fans, $member_id, $userInfo);
- }
- return $member_id;
- }
- }
- return 0;
- }
- /**
- * @param $member_id
- * @param string $key
- * @param int $minute
- * @throws MemberNotLoginException
- */
- public function chkAccount($member_id, $key = 'chekAccount', $minute = 30)
- {
- $type = \YunShop::request()->type;
- $mid = Member::getMid();
- if (1 == $type && !Cache::has($member_id . ':' . $key)) {
- Cache::put($member_id . ':' . $key, 1, \Carbon\Carbon::now()->addMinutes($minute));
- $queryString = ['type' => $type, 'session_id' => session_id(), 'i' => \YunShop::app()->uniacid, 'mid' => $mid];
- throw new MemberNotLoginException('请登录', ['login_status' => 0, 'login_url' => Url::absoluteApi('member.login.chekAccount', $queryString)]);
- }
- }
- public function newMemberInfoAttrStatus($member_info)
- {
- $set = \Setting::get('shop.form');
- if (!is_null($set)) {
- $set = json_decode($set, true);
- if (!empty($set['form'])) unset($set['form']);
- $set['form'] = [
- [
- 'del' => 0,
- 'name' => '会员姓名',
- 'pinyin' => 'huiyuannicheng',
- 'sort' => 1,
- 'value' => $member_info->realname
- ],
- [
- 'del' => 0,
- 'name' => '手机号码',
- 'pinyin' => 'shoujihaoma',
- 'sort' => 2,
- 'value' => $member_info->mobile
- ]
- ];
- } else {
- $set = [
- 'base' => [
- 'sex' => 1,
- 'address' => 1,
- 'birthday' => 1
- ],
- 'form' => [
- [
- 'del' => 0,
- 'name' => '会员姓名',
- 'pinyin' => 'huiyuannicheng',
- 'sort' => 1,
- 'value' => $member_info->realname
- ],
- [
- 'del' => 0,
- 'name' => '手机号码',
- 'pinyin' => 'shoujihaoma',
- 'sort' => 2,
- 'value' => $member_info->mobile
- ]
- ]
- ];
- }
- return $set;
- }
- public function setLoginLimit($mobile)
- {
- Redis::incr('login_error_count_'.$mobile);
- Redis::set('last_error_time_'.$mobile,time());
- $error_times = Redis::get('login_error_count_'.$mobile)?:0;
- $error_count = 5 - $error_times;
- if ($error_count <=0) {
- Redis::set('login_error_count_'.$mobile, 0);
- Redis::setex('login_error_time_'.$mobile, 30*60, true);
- }
- return $error_count;
- }
- public function getLoginLimit($mobile)
- {
- $login_error_time = Redis::get('login_error_time_'.$mobile);
- if ($login_error_time) {
- $last_error_time = Redis::get('last_error_time_'.$mobile);
- $remain_time = ($last_error_time+30*60) - time();
- return intval(($remain_time/60));
- }
- return 0;
- }
- public static function countReset($mobile)
- {
- return Redis::set('login_error_count_'.$mobile, 0);
- }
- }
|