MemberService.php 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 17/2/28
  6. * Time: 上午5:16
  7. */
  8. namespace app\frontend\modules\member\services;
  9. use app\common\events\member\MergeMemberEvent;
  10. use app\common\exceptions\AppException;
  11. use app\common\exceptions\MemberErrorMsgException;
  12. use app\common\exceptions\MemberNotLoginException;
  13. use app\common\exceptions\ShopException;
  14. use app\common\facades\Setting;
  15. use app\common\helpers\Cache;
  16. use app\common\helpers\Client;
  17. use app\common\helpers\Url;
  18. use app\common\models\McMappingFans;
  19. use app\common\models\Member;
  20. use app\common\models\member\MemberChangeLog;
  21. use app\common\models\member\MemberDel;
  22. use app\common\models\member\MemberMarkLog;
  23. use app\common\models\member\MemberMerge;
  24. use app\common\models\MemberAlipay;
  25. use app\common\models\MemberGroup;
  26. use app\common\models\MemberShopInfo;
  27. use app\common\services\credit\ConstService;
  28. use app\common\services\finance\BalanceChange;
  29. use app\common\services\finance\PointService;
  30. use app\common\services\member\MemberMergeService;
  31. use app\common\services\Session;
  32. use app\frontend\models\McGroupsModel;
  33. use app\frontend\modules\member\models\McMappingFansModel;
  34. use app\frontend\modules\member\models\MemberMiniAppModel;
  35. use app\frontend\modules\member\models\MemberModel;
  36. use app\frontend\modules\member\models\MemberUniqueModel;
  37. use app\frontend\modules\member\models\MemberWechatModel;
  38. use app\frontend\modules\member\models\smsSendLimitModel;
  39. use app\frontend\modules\member\models\SubMemberModel;
  40. use Illuminate\Support\Facades\Cookie;
  41. use app\common\events\member\RegisterMember;
  42. use Illuminate\Support\Facades\DB;
  43. use Illuminate\Support\Facades\Redis;
  44. use Illuminate\Support\Facades\Schema;
  45. use Yunshop\Love\Common\Models\MemberLove;
  46. use Yunshop\Love\Common\Services\LoveChangeService;
  47. class MemberService
  48. {
  49. const TOKEN_EXPIRE = 2160000;
  50. /**
  51. * @var \app\frontend\models\Member
  52. */
  53. private static $_current_member;
  54. /**
  55. * @return \app\frontend\models\Member
  56. * @throws AppException
  57. */
  58. public static function getCurrentMemberModel()
  59. {
  60. if (isset(self::$_current_member)) {
  61. return self::$_current_member;
  62. }
  63. $uid = \YunShop::app()->getMemberId();
  64. if (!isset($uid)) {
  65. throw new AppException('uid不存在');
  66. }
  67. self::setCurrentMemberModel($uid);
  68. return self::$_current_member;
  69. }
  70. /**
  71. * @param $member_id
  72. * @throws AppException
  73. */
  74. public static function setCurrentMemberModel($member_id)
  75. {
  76. /**
  77. * @var \app\frontend\models\Member $member
  78. */
  79. $member = \app\frontend\models\Member::find($member_id);
  80. if (!isset($member)) {
  81. throw new AppException('(ID:' . $member_id . ')用户不存在');
  82. }
  83. self::$_current_member = $member;
  84. }
  85. /**
  86. * 用户是否登录
  87. *
  88. * @return bool
  89. */
  90. public static function isLogged()
  91. {
  92. if (\YunShop::app()->getMemberId()) {
  93. if (\app\frontend\models\Member::current()->hasOneDel) {
  94. MemberDel::delUpdate(\YunShop::app()->getMemberId());
  95. Session::clear('member_id');
  96. }
  97. }
  98. return \YunShop::app()->getMemberId() && \YunShop::app()->getMemberId() > 0;
  99. }
  100. /**
  101. * 验证手机号和密码
  102. *
  103. * @return bool
  104. */
  105. public static function validate($mobile, $password, $confirm_password = '')
  106. {
  107. //兼容港澳台手机号 把验证规则改为必填+纯数字
  108. if ($confirm_password == '') {
  109. $data = array(
  110. 'mobile' => $mobile,
  111. 'password' => $password,
  112. );
  113. $rules = array(
  114. 'mobile' => 'required|numeric',
  115. 'password' => 'required|min:6|regex:/^[A-Za-z0-9@.!#\$%\^&\*]+$/',
  116. );
  117. $message = array(
  118. 'regex' => ':attribute 格式错误',
  119. 'required' => ':attribute 不能为空',
  120. 'number' => ':attribute 格式错误',
  121. 'min' => ':attribute 最少6位'
  122. );
  123. $attributes = array(
  124. "mobile" => '手机号',
  125. 'password' => '密码',
  126. );
  127. } else {
  128. $data = array(
  129. 'mobile' => $mobile,
  130. 'password' => $password,
  131. 'confirm_password' => $confirm_password,
  132. );
  133. $rules = array(
  134. 'mobile' => 'required|numeric',
  135. 'password' => 'required|min:6|regex:/^[A-Za-z0-9@.!#\$%\^&\*]+$/',
  136. 'confirm_password' => 'same:password',
  137. );
  138. $message = array(
  139. 'regex' => ':attribute 格式错误',
  140. 'required' => ':attribute 不能为空',
  141. 'number' => ':attribute 格式错误',
  142. 'min' => ':attribute 最少6位',
  143. 'same' => ':attribute 不匹配'
  144. );
  145. $attributes = array(
  146. "mobile" => '手机号',
  147. 'password' => '密码',
  148. 'confirm_password' => '密码',
  149. );
  150. }
  151. $validate = \Validator::make($data, $rules, $message, $attributes);
  152. if ($validate->fails()) {
  153. $warnings = $validate->messages();
  154. $show_warning = $warnings->first();
  155. return show_json('0', $show_warning);
  156. } else {
  157. return show_json('1');
  158. }
  159. }
  160. public static function mobileValidate($validate_data = [])
  161. {
  162. if (!$validate_data['mobile']) {
  163. throw new ShopException('手机号为空');
  164. }
  165. if (!is_numeric($validate_data['mobile'])) {
  166. throw new ShopException('手机号格式错误');
  167. }
  168. if ($validate_data['state'] && !is_numeric($validate_data['state']) && mb_strlen($validate_data['state']) > 5) {
  169. throw new ShopException('国际号格式错误');
  170. }
  171. //没开启国家区号统一按 86 算
  172. if (!\Setting::get('shop.sms')['country_code'] || $validate_data['state'] == 86) {
  173. $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}$/';
  174. $pre_res = preg_match($pre_str, $validate_data['mobile']);
  175. if (!$pre_res || mb_strlen($validate_data['mobile']) != 11) {
  176. throw new ShopException('手机号格式错误');
  177. }
  178. }
  179. }
  180. /**
  181. * 短信发送限制
  182. *
  183. * 每天最多5条
  184. */
  185. public static function smsSendLimit($uniacid, $mobile)
  186. {
  187. $curr_time = time();
  188. $mobile_info = smsSendLimitModel::getMobileInfo($uniacid, $mobile);
  189. if (!empty($mobile_info)) {
  190. $update_time = $mobile_info['created_at'];
  191. $total = $mobile_info['total'];
  192. if ((date('Ymd', $curr_time) != date('Ymd', $update_time))) {
  193. $total = 0;
  194. }
  195. } else {
  196. $total = 0;
  197. }
  198. if ($total < 5) {
  199. return true;
  200. } else {
  201. return false;
  202. }
  203. }
  204. /**
  205. * 更新发送短信条数
  206. *
  207. * 每天最多5条
  208. */
  209. public static function udpateSmsSendTotal($uniacid, $mobile)
  210. {
  211. $curr_time = time();
  212. $mobile_info = smsSendLimitModel::getMobileInfo($uniacid, $mobile);
  213. if (!empty($mobile_info)) {
  214. $update_time = $mobile_info['created_at'];
  215. $total = $mobile_info['total'];
  216. if ($update_time <= $curr_time) {
  217. if (date('Ymd', $curr_time) == date('Ymd', $update_time)) {
  218. if ($total <= 5) {
  219. ++$total;
  220. smsSendLimitModel::updateData(array(
  221. 'uniacid' => $uniacid,
  222. 'mobile' => $mobile), array(
  223. 'total' => $total,
  224. 'created_at' => $curr_time));
  225. }
  226. } else {
  227. smsSendLimitModel::updateData(array(
  228. 'uniacid' => $uniacid,
  229. 'mobile' => $mobile), array(
  230. 'total' => 1,
  231. 'created_at' => $curr_time));
  232. }
  233. }
  234. } else {
  235. smsSendLimitModel::insertData(array(
  236. 'uniacid' => $uniacid,
  237. 'mobile' => $mobile,
  238. 'total' => 1,
  239. 'created_at' => $curr_time)
  240. );
  241. }
  242. }
  243. /**
  244. * 阿里大鱼
  245. *
  246. * @param $sms
  247. * @param $templateType
  248. * @return array
  249. */
  250. public static function send_sms_alidayu($sms, $templateType)
  251. {
  252. switch ($templateType) {
  253. case 'reg':
  254. $templateCode = $sms['templateCode'];
  255. $params = @explode("\n", $sms['product']);
  256. break;
  257. case 'forget':
  258. $templateCode = $sms['templateCodeForget'];
  259. $params = @explode("\n", $sms['forget']);
  260. break;
  261. case 'login':
  262. $templateCode = $sms['templateCodeLogin'];
  263. $params = @explode("\n", $sms['login']);
  264. break;
  265. default:
  266. $params = array();
  267. $templateCode = $sms['templateCode'];
  268. break;
  269. }
  270. return array('templateCode' => $templateCode, 'params' => $params);
  271. }
  272. /**
  273. * 互亿无线
  274. *
  275. * @param $account
  276. * @param $pwd
  277. * @param $mobile
  278. * @param $code
  279. * @param string $type
  280. * @param $name
  281. * @param $title
  282. * @param $total
  283. * @param $tel
  284. * @return mixed
  285. */
  286. public static function send_sms($account, $pwd, $mobile, $code, $type = 'check', $name = '', $title = '', $total = '', $tel = '')
  287. {
  288. if ($type == 'check') {
  289. $content = "您的验证码是:" . $code . "。请不要把验证码泄露给其他人。如非本人操作,可不用理会!";
  290. } elseif ($type == 'verify') {
  291. $verify_set = $sms = \Setting::get('shop.sms');
  292. $allset = iunserializer($verify_set['plugins']);
  293. if (is_array($allset) && !empty($allset['verify']['code_template'])) {
  294. $content = sprintf($allset['verify']['code_template'], $code, $title, $total, $name, $mobile, $tel);
  295. } else {
  296. $content = "提醒您,您的核销码为:" . $code . ",订购的票型是:" . $title . ",数量:" . $total . "张,购票人:" . $name . ",电话:" . $mobile . ",门店电话:" . $tel . "。请妥善保管,验票使用!";
  297. }
  298. }
  299. $smsrs = file_get_contents('http://106.ihuyi.cn/webservice/sms.php?method=Submit&account=' . $account . '&password=' . $pwd . '&mobile=' . $mobile . '&content=' . urldecode($content));
  300. return xml_to_array($smsrs);
  301. }
  302. public static function send_smsV2($account, $pwd, $mobile, $code, $state = '86', $type = 'check', $name = '', $title = '', $total = 0, $tel = '')
  303. {
  304. if ($type == 'check') {
  305. //$content = "您的验证码是:" . $code . "。请不要把验证码泄露给其他人。如非本人操作,可不用理会!";
  306. $content = "您的验证码是:" . $code . "。请不要把验证码泄露给其他人。";
  307. } elseif ($type == 'verify') {
  308. $verify_set = $sms = \Setting::get('shop.sms');
  309. $allset = iunserializer($verify_set['plugins']);
  310. if (is_array($allset) && !empty($allset['verify']['code_template'])) {
  311. $content = sprintf($allset['verify']['code_template'], $code, $title, $total, $name, $mobile, $tel);
  312. } else {
  313. $content = "提醒您,您的核销码为:" . $code . ",订购的票型是:" . $title . ",数量:" . $total . "张,购票人:" . $name . ",电话:" . $mobile . ",门店电话:" . $tel . "。请妥善保管,验票使用!";
  314. }
  315. }
  316. if ($state == '86') {
  317. $url = 'http://106.ihuyi.cn/webservice/sms.php?method=Submit';
  318. $smsrs = file_get_contents($url . '&account=' . $account . '&password=' . $pwd . '&mobile=' . $mobile . '&content=' . rawurlencode($content));
  319. } else {
  320. $url = 'http://api.isms.ihuyi.com/webservice/isms.php?method=Submit';
  321. $mobile = $state . ' ' . $mobile;
  322. $data = array(
  323. 'account' => $account,
  324. 'password' => $pwd,
  325. 'mobile' => $mobile,
  326. 'content' => $content,
  327. );
  328. $query = http_build_query($data);
  329. $smsrs = file_get_contents($url . '&' . $query);
  330. }
  331. return xml_to_array($smsrs);
  332. }
  333. function xml_to_array($xml)
  334. {
  335. $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
  336. if (preg_match_all($reg, $xml, $matches)) {
  337. $count = count($matches[0]);
  338. for ($i = 0; $i < $count; $i++) {
  339. $subxml = $matches[2][$i];
  340. $key = $matches[1][$i];
  341. if (preg_match($reg, $subxml)) {
  342. $arr[$key] = xml_to_array($subxml);
  343. } else {
  344. $arr[$key] = $subxml;
  345. }
  346. }
  347. }
  348. return $arr;
  349. }
  350. /**
  351. * pc端注册 保存信息
  352. *
  353. * @param $member_info
  354. * @param $uniacid
  355. */
  356. protected function save($member_info, $uniacid)
  357. {
  358. Session::set('member_id', $member_info['uid']);
  359. setcookie('Yz-appToken', encrypt($member_info['mobile'] . '\t' . $member_info['uid'] . '\t' .md5($member_info['password'])), time() + self::TOKEN_EXPIRE, '/');
  360. }
  361. /**
  362. * 检查验证码
  363. *
  364. * @return array
  365. */
  366. public static function checkCode()
  367. {
  368. $code = \YunShop::request()->code;
  369. $mobile = \YunShop::request()->mobile;
  370. return app('sms')->checkCode($mobile, $code);
  371. }
  372. /**
  373. * 检查验证码
  374. *
  375. * @return array
  376. */
  377. public static function checkAppCode()
  378. {
  379. $code = \YunShop::request()->code;
  380. $mobile = \YunShop::request()->mobile;
  381. $res = app('sms')->checkAppCode($mobile, $code);
  382. return $res;
  383. }
  384. /**
  385. * 检查邀请码
  386. *
  387. * @return array
  388. */
  389. public static function inviteCode()
  390. {
  391. $invite_code = \YunShop::request()->invite_code;
  392. \Log::info('invite_code', $invite_code);
  393. $status = \Setting::get('shop.member');
  394. \Log::info('status', $status);
  395. $status['is_invite'] = Member::chkInviteCode();
  396. \Log::info('is_invite', $status['is_invite']);
  397. if ($status['is_invite'] == 1) {//判断邀请码是否开启 1开启 0关闭
  398. \Log::info('is_invite == 1');
  399. if ($status['required'] == 1 && empty($invite_code)) { //判断邀请码是否必填,1必填 0可选填 判断邀请码是否为空
  400. \Log::info('empty--invite_code');
  401. return show_json('0', '请输入邀请码');
  402. } elseif ($status['required'] == 1 && !empty($invite_code)) { //判断邀请码是否必填,1必填 0可选填 判断邀请码是否为空
  403. $data = MemberShopInfo:: getInviteCode($invite_code); //查询邀请码是否存在
  404. \Log::info('data', $data);
  405. if (!$data) {
  406. \Log::info('invalited--invite_code');
  407. return show_json('0', '邀请码无效');
  408. }
  409. }
  410. }
  411. return show_json('1');
  412. }
  413. /**
  414. * 公众号开放平台授权登陆
  415. *
  416. * @param $uniacid
  417. * @param $userinfo
  418. * @return array|int|mixed
  419. */
  420. public function unionidLogin($uniacid, $userinfo, $upperMemberId = null, $loginType = null)
  421. {
  422. \Log::debug('----userinfo2----', $userinfo);
  423. $member_id = 0;
  424. $userinfo['nickname'] = $this->filteNickname($userinfo);
  425. $UnionidInfo = MemberUniqueModel::getUnionidInfo($uniacid, $userinfo['unionid'])->first();
  426. \Log::debug('----unique uid----', $UnionidInfo->member_id);
  427. $mc_mapping_fans_model = $this->getFansModel($userinfo['openid']);
  428. if (request()->type == 1) {
  429. \Log::debug('----fans uid----', $mc_mapping_fans_model->uid);
  430. } else {
  431. \Log::debug('----fans uid----', $mc_mapping_fans_model->member_id);
  432. }
  433. if (!is_null($UnionidInfo)) {
  434. $member_id = $UnionidInfo->member_id;
  435. }
  436. $yz_member = MemberShopInfo::getMemberShopInfo($member_id);
  437. if (!empty($yz_member)) {
  438. if (!empty($yz_member->is_old)) {
  439. throw new MemberErrorMsgException('会员数据有冲突,请联系客服');
  440. }
  441. }
  442. $this->checkFansUid($mc_mapping_fans_model, $userinfo);
  443. //检查member_id是否一致
  444. if (!is_null($UnionidInfo) && !is_null($mc_mapping_fans_model)) {
  445. $member_id = $this->checkMember($UnionidInfo, $mc_mapping_fans_model, $userinfo);
  446. if ($member_id > 0 && $UnionidInfo->member_id != $member_id) {
  447. $UnionidInfo->member_id = $member_id;
  448. }
  449. }
  450. if (empty($member_id) && !empty($mc_mapping_fans_model)) {
  451. $member_id = $mc_mapping_fans_model->uid;
  452. }
  453. $member_model = Member::getMemberById($member_id);
  454. $member_shop_info_model = MemberShopInfo::getMemberShopInfo($member_id);
  455. if (!empty($UnionidInfo->unionid) && !empty($member_model)
  456. && !empty($mc_mapping_fans_model) && !empty($member_shop_info_model)) {
  457. \Log::debug('微信登陆更新');
  458. $types = explode('|', $UnionidInfo->type);
  459. $member_id = $UnionidInfo->member_id;
  460. if (!is_null($loginType) && !in_array($loginType, $types)) {
  461. //更新ims_yz_member_unique表
  462. MemberUniqueModel::updateData(array(
  463. 'unique_id' => $UnionidInfo->unique_id,
  464. 'member_id' => $member_id,
  465. 'type' => $UnionidInfo->type . '|' . $loginType
  466. ));
  467. }
  468. $this->checkMemberInfo($member_model, $mc_mapping_fans_model, $member_shop_info_model);
  469. if ((!empty($userinfo['nickname']) && $member_model->nickname != $userinfo['nickname']) || ($userinfo['headimgurl'] && $member_model->avatar != $userinfo['headimgurl'])) {
  470. $this->updateMemberInfo($member_id, $userinfo);
  471. }
  472. $this->updateSubMemberInfoV2($member_id, $userinfo);
  473. } else {
  474. \Log::debug('添加新会员');
  475. \Log::debug('----添加会员前 uid----', $member_id);
  476. //DB::transaction(function () use (&$member_id, $member_model, $mc_mapping_fans_model, $member_shop_info_model, $uniacid, $userinfo, $UnionidInfo, $upperMemberId) {
  477. if (empty($member_model) && empty($mc_mapping_fans_model)) {
  478. $member_id = $this->addMemberInfo($uniacid, $userinfo);
  479. if ($member_id === false) {
  480. return show_json(8, '保存用户信息失败');
  481. }
  482. } elseif (empty($member_model) && 0 === $mc_mapping_fans_model->uid) {
  483. $member_id = $this->addMcMemberInfo($uniacid, $userinfo);
  484. $this->updateFansMember($mc_mapping_fans_model, $member_id, $userinfo);
  485. } elseif ($member_model && 0 === $mc_mapping_fans_model->uid) {
  486. $this->updateFansMember($mc_mapping_fans_model, $member_id, $userinfo);
  487. } elseif ($member_model && empty($member_model->nickname)) { // 更新用户信息(门店静默、无关注登陆)
  488. $this->updateMemberInfo($member_id, $userinfo);
  489. } elseif (empty($member_model) && $mc_mapping_fans_model->uid) {
  490. $this->updateFansMember($mc_mapping_fans_model, $member_id, $userinfo);
  491. } elseif (empty($mc_mapping_fans_model)) {
  492. //开放平台 先小程序后微信 更新微信粉丝
  493. $this->addFansMember($member_id, $uniacid, $userinfo);
  494. $this->updateHeadPic($member_id, $userinfo);
  495. }
  496. if (empty($member_shop_info_model)) {
  497. if (0 == $member_id) {
  498. \Log::debug(sprintf('----用户数据异常---%s-%s', $userinfo['openid'], $userinfo['nickname']));
  499. throw new AppException('用户数据异常, 注册失败');
  500. }
  501. $this->addSubMemberInfoV2($uniacid, $member_id, $userinfo);
  502. } else {
  503. $this->updateSubMemberInfo($member_id, $userinfo['openid']);
  504. }
  505. if (empty($UnionidInfo->unionid)) {
  506. //添加ims_yz_member_unique表
  507. $this->addMemberUnionid($uniacid, $member_id, $userinfo['unionid']);
  508. }
  509. //生成分销关系链
  510. if ($upperMemberId) {
  511. \Log::debug(sprintf('----海报生成分销关系链----%d', $upperMemberId));
  512. Member::createRealtion($member_id, $upperMemberId);
  513. } else {
  514. \Log::debug(sprintf('----生成分销关系链----%d-%d', $upperMemberId, $member_id));
  515. Member::createRealtion($member_id);
  516. }
  517. if (app('plugins')->isEnabled('share-reward')) {
  518. \Log::debug(sprintf('----RegisterMember----%d-%d', $upperMemberId, $member_id));
  519. $mid = $upperMemberId ? $upperMemberId : 0;
  520. $mid = request()->mid && empty($mid) ? request()->mid : $mid;
  521. // event(new RegisterMember($mid, $member_id));
  522. }
  523. $mid = $mid ?: 0;
  524. event(new RegisterMember($mid, $member_id));
  525. //});
  526. }
  527. \Log::debug('--------return_member_id---------', $member_id);
  528. return $member_id;
  529. }
  530. /**
  531. * 公众号平台授权登陆
  532. *
  533. * @param $uniacid
  534. * @param $userinfo
  535. * @return array|int|mixed
  536. */
  537. public function openidLogin($uniacid, $userinfo, $upperMemberId = NULL)
  538. {
  539. \Log::debug('----userinfo1----', $userinfo);
  540. $member_id = 0;
  541. $userinfo['nickname'] = $this->filteNickname($userinfo);
  542. $fans_mode = $this->getFansModel($userinfo['openid']);
  543. $this->checkFansUid($fans_mode, $userinfo);
  544. if ($fans_mode) {
  545. $member_model = Member::getMemberById($fans_mode->uid);
  546. $member_shop_info_model = MemberShopInfo::getMemberShopInfo($fans_mode->uid);
  547. $member_id = $fans_mode->uid;
  548. }
  549. if ($yz_member_id = $this->checkYzMember($member_model, $fans_mode, $member_shop_info_model, $userinfo)) {
  550. $member_id = $yz_member_id;
  551. $member_shop_info_model = MemberShopInfo::getMemberShopInfo($member_id);
  552. }
  553. if ((!empty($member_model)) && (!empty($fans_mode) && !empty($member_shop_info_model))) {
  554. \Log::debug('微信登陆更新');
  555. $this->checkMemberInfo($member_model, $fans_mode, $member_shop_info_model);
  556. if ((!empty($userinfo['nickname']) && $member_model->nickname != $userinfo['nickname']) || ($userinfo['headimgurl'] && $member_model->avatar != $userinfo['headimgurl'])) {
  557. $this->updateMemberInfo($member_id, $userinfo);
  558. }
  559. $this->updateSubMemberInfoV2($member_id, $userinfo);
  560. } else {
  561. \Log::debug('添加新会员');
  562. //DB::transaction(function () use (&$member_id, $uniacid, $userinfo, $member_model, $fans_mode, $member_shop_info_model, $upperMemberId){
  563. if (empty($member_model) && empty($fans_mode)) {
  564. $member_id = $this->addMemberInfo($uniacid, $userinfo);
  565. if ($member_id === false) {
  566. return show_json(8, '保存用户信息失败');
  567. }
  568. } elseif (empty($member_model) && 0 === $fans_mode->uid) {
  569. $member_id = $this->addMcMemberInfo($uniacid, $userinfo);
  570. $this->updateFansMember($fans_mode, $member_id, $userinfo);
  571. } elseif (empty($member_model) && $fans_mode->uid) {
  572. $this->updateFansMember($fans_mode, $member_id, $userinfo);
  573. } elseif ($member_model && empty($member_model->nickname)) { // 更新用户信息(门店静默、无关注登陆)
  574. $this->updateMemberInfo($member_id, $userinfo);
  575. }
  576. if (empty($member_shop_info_model)) {
  577. if (0 == $member_id) {
  578. \Log::debug(sprintf('----用户数据异常---%s-%s', $userinfo['openid'], $userinfo['nickname']));
  579. throw new AppException('用户数据异常, 注册失败');
  580. }
  581. $this->addSubMemberInfoV2($uniacid, $member_id, $userinfo);
  582. }
  583. //生成分销关系链
  584. if ($upperMemberId) {
  585. \Log::debug(sprintf('----海报生成分销关系链----%d', $upperMemberId));
  586. Member::createRealtion($member_id, $upperMemberId);
  587. } else {
  588. \Log::debug(sprintf('----生成分销关系链----%d-%d', $upperMemberId, $member_id));
  589. Member::createRealtion($member_id);
  590. }
  591. $upperMemberId = $upperMemberId ?: 0;
  592. event(new RegisterMember($upperMemberId, $member_id));
  593. // if (app('plugins')->isEnabled('share-reward')) {
  594. // event(new RegisterMember($upperMemberId, $member_id));
  595. // }
  596. //});
  597. }
  598. \Log::debug('--------return_member_id---------', $member_id);
  599. return $member_id;
  600. }
  601. /**
  602. * 过滤微信用户名特殊符号
  603. *
  604. * @param $userinfo
  605. * @return mixed
  606. */
  607. public function filteNickname($userinfo)
  608. {
  609. $nickname = $userinfo;
  610. if (is_array($userinfo)) {
  611. $nickname = $userinfo['nickname'];
  612. }
  613. $nickname = preg_replace('/[\x{1F600}-\x{1F64F}]/u', '', $nickname);
  614. $nickname = preg_replace('/[\x{1F300}-\x{1F5FF}]/u', '', $nickname);
  615. $nickname = preg_replace('/[\x{1F680}-\x{1F6FF}]/u', '', $nickname);
  616. $nickname = preg_replace('/[\x{2600}-\x{26FF}]/u', '', $nickname);
  617. $nickname = preg_replace('/[\x{2700}-\x{27BF}]/u', '', $nickname);
  618. $nickname = str_replace(array('"', '\''), '', $nickname);
  619. /* 去除表情字符串 */
  620. $nickname = preg_replace("#(\\\ud[0-9a-f]{3})#i", "", json_encode($nickname));
  621. $nickname = json_decode($nickname);
  622. \Log::debug('post', [$nickname]);
  623. $nickname = $this->cutNickname($nickname);
  624. \Log::debug('json', [$nickname]);
  625. return addslashes(trim($nickname));
  626. }
  627. /**
  628. * 截取字符串长度
  629. *
  630. * @param $nickname
  631. * @return string
  632. */
  633. public function cutNickname($nickname)
  634. {
  635. if (mb_strlen($nickname) > 18) {
  636. return mb_substr($nickname, 0, 18);
  637. }
  638. return $nickname;
  639. }
  640. /**
  641. * 会员基础表操作
  642. *
  643. * @param $uniacid
  644. * @param $userinfo
  645. * @return mixed
  646. */
  647. public function addMemberInfo($uniacid, $userinfo)
  648. {
  649. \Log::debug('---addMemberInfo---');
  650. //添加mc_members表
  651. $default_group = McGroupsModel::getDefaultGroupId();
  652. $uid = MemberModel::insertData($userinfo, array(
  653. 'uniacid' => $uniacid,
  654. 'groupid' => $default_group->groupid
  655. ));
  656. return $uid;
  657. }
  658. /**
  659. * 会员辅助表操作
  660. *
  661. * @param $uniacid
  662. * @param $member_id
  663. */
  664. public function addSubMemberInfo($uniacid, $member_id, $openid = 0)
  665. {
  666. //添加yz_member表
  667. $default_sub_group_id = MemberGroup::getDefaultGroupId()->first();
  668. if (!empty($default_sub_group_id)) {
  669. $default_subgroup_id = $default_sub_group_id->id;
  670. } else {
  671. $default_subgroup_id = 0;
  672. }
  673. SubMemberModel::replace(array(
  674. 'member_id' => $member_id,
  675. 'uniacid' => $uniacid,
  676. 'group_id' => $default_subgroup_id,
  677. 'level_id' => 0,
  678. 'pay_password' => '',
  679. 'salt' => '',
  680. 'yz_openid' => $openid,
  681. ));
  682. }
  683. public function addSubMemberInfoV2($uniacid, $member_id, $userinfo)
  684. {
  685. //添加yz_member表
  686. $default_sub_group_id = MemberGroup::getDefaultGroupId()->first();
  687. if (!empty($default_sub_group_id)) {
  688. $default_subgroup_id = $default_sub_group_id->id;
  689. } else {
  690. $default_subgroup_id = 0;
  691. }
  692. $invite_code = MemberModel::getInviteCode($member_id);
  693. SubMemberModel::replace(array(
  694. 'member_id' => $member_id,
  695. 'uniacid' => $uniacid,
  696. 'group_id' => $default_subgroup_id,
  697. 'level_id' => 0,
  698. 'pay_password' => '',
  699. 'salt' => '',
  700. 'yz_openid' => $userinfo['openid'],
  701. 'access_token_1' => isset($userinfo['access_token']) ? $userinfo['access_token'] : '',
  702. 'access_expires_in_1' => isset($userinfo['expires_in']) ? time() + $userinfo['expires_in'] : '',
  703. 'refresh_token_1' => isset($userinfo['refresh_token']) ? $userinfo['refresh_token'] : '',
  704. 'refresh_expires_in_1' => time() + (28 * 24 * 3600),
  705. 'invite_code' => $invite_code
  706. ));
  707. }
  708. private function updateSubMemberInfo($uid, $userinfo)
  709. {
  710. SubMemberModel::updateOpenid(
  711. $uid, ['yz_openid' => $userinfo['openid']]
  712. );
  713. }
  714. protected function updateSubMemberInfoV2($uid, $userinfo)
  715. {
  716. }
  717. /**
  718. * 检查会员信息是否一致
  719. *
  720. * 微擎会员被删除导致商城会员不匹配
  721. *
  722. * @param $mcMember
  723. * @param $fansMember
  724. * @param $yzMember
  725. */
  726. protected function checkMemberInfo($mcMember, $fansMember, $yzMember)
  727. {
  728. }
  729. /**
  730. * 会员关联表操作
  731. *
  732. * @param $uniacid
  733. * @param $member_id
  734. * @param $unionid
  735. */
  736. public function addMemberUnionid($uniacid, $member_id, $unionid)
  737. {
  738. MemberUniqueModel::replace(array(
  739. 'uniacid' => $uniacid,
  740. 'unionid' => $unionid,
  741. 'member_id' => $member_id,
  742. 'type' => self::LOGIN_TYPE
  743. ));
  744. }
  745. /**
  746. * 更新微信用户信息
  747. *
  748. * @param $member_id
  749. * @param $userinfo
  750. */
  751. public function updateMemberInfo($member_id, $userinfo)
  752. {
  753. //更新mc_members
  754. $mc_data = array(
  755. 'nickname' => isset($userinfo['nickname']) ? stripslashes($userinfo['nickname']) : '',
  756. 'avatar' => isset($userinfo['headimgurl']) ? $userinfo['headimgurl'] : '',
  757. 'gender' => isset($userinfo['sex']) ? $userinfo['sex'] : '-1',
  758. 'nationality' => isset($userinfo['country']) ? $userinfo['country'] : '',
  759. 'resideprovince' => isset($userinfo['province']) ? $userinfo['province'] : '' . '省',
  760. 'residecity' => isset($userinfo['city']) ? $userinfo['city'] : '' . '市'
  761. );
  762. MemberModel::updataData($member_id, $mc_data);
  763. }
  764. /**
  765. * 登陆处理
  766. * @param $userinfo
  767. * @param null $upperMemberId
  768. * @return int
  769. * @throws AppException
  770. * @throws MemberErrorMsgException
  771. */
  772. public function memberLogin($userinfo, $upperMemberId = NULL)
  773. {
  774. \Log::debug('--------login_type--------', request()->type);
  775. if (is_array($userinfo) && !empty($userinfo['unionid'])) {
  776. $member_id = $this->unionidLogin(\YunShop::app()->uniacid, $userinfo, $upperMemberId);
  777. } elseif (is_array($userinfo) && !empty($userinfo['openid'])) {
  778. $member_id = $this->openidLogin(\YunShop::app()->uniacid, $userinfo, $upperMemberId);
  779. }
  780. return $member_id;
  781. }
  782. public function memberInfoAttrStatus($member)
  783. {
  784. $form = [];
  785. $set = \Setting::get('shop.form');
  786. if (!is_null($set)) {
  787. $set = json_decode($set, true);
  788. if (!empty($set['form'])) {
  789. $form = array_values(array_sort($set['form'], function ($value) {
  790. return $value['sort'];
  791. }));
  792. if (!empty($member['member_form'])) {
  793. $member_form = json_decode($member['member_form'], true);
  794. $form = self::getMemberForm($form, $member_form);
  795. }
  796. }
  797. } else {
  798. $set['base'] = [
  799. 'sex' => 1,
  800. 'address' => 1,
  801. 'birthday' => 1
  802. ];
  803. }
  804. $set['form'] = $form;
  805. return $set;
  806. }
  807. private function getMemberForm($form, $member_form)
  808. {
  809. foreach ($form as &$rows) {
  810. foreach ($member_form as $item) {
  811. if ($item['pinyin'] == $rows['pinyin']) {
  812. $rows['value'] = $item['value'];
  813. }
  814. }
  815. }
  816. return $form;
  817. }
  818. public function updateMemberForm($data)
  819. {
  820. $member_form = [];
  821. $set = \Setting::get('shop.form');
  822. $set = json_decode($set, true);
  823. // echo '<pre>';print_r($data['customDatas']);exit;
  824. if (!empty($set['form'])) {
  825. $member_form = $form = array_values(array_sort($set['form'], function ($value) {
  826. return $value['sort'];
  827. }));
  828. foreach ($form as $key => &$item) {
  829. foreach ($data['customDatas'] as $rows) {
  830. if ($rows['pinyin'] == $item['pinyin']) {
  831. $item['del'] = 1;
  832. $member_form[$key]['value'] = $rows['value'];
  833. }
  834. }
  835. }
  836. }
  837. $set['form'] = $form;
  838. \Setting::set('shop.form', json_encode($set));
  839. return $member_form;
  840. }
  841. /**
  842. * 检查同步登录凭证和统一表
  843. * @param $UnionidInfo 统一表会员信息
  844. * @param $fansInfo 当前登录凭证会员信息
  845. * @param $userInfo 当前授权会员信息
  846. * @return mixed
  847. * @throws MemberErrorMsgException
  848. */
  849. public function checkMember($UnionidInfo, $fansInfo, $userInfo)
  850. {
  851. $relation_set = Setting::get('relation_base');
  852. \Log::debug('----unionid---', $UnionidInfo->member_id);
  853. \Log::debug('----fans----', $fansInfo->uid);
  854. if ($UnionidInfo->member_id != $fansInfo->uid) {
  855. if ($UnionidInfo->member_id == 0) {
  856. return $fansInfo->uid;
  857. }
  858. if ($fansInfo->uid == 0) {
  859. return $UnionidInfo->member_id;
  860. }
  861. $merge_choice = $relation_set['is_merge_save_level'];
  862. $merge_choice_uids = $this->memberChoice($merge_choice, $UnionidInfo, $fansInfo);
  863. list($main_member_id, $abandon_member_id) = $merge_choice_uids;
  864. $abandon_member = Member::getMemberById($abandon_member_id);
  865. if ($abandon_member && isset($relation_set['is_member_merge']) && $relation_set['is_member_merge'] != 1 && time() > ($abandon_member->createtime + 5 * 60)) {
  866. //新会员合并按钮
  867. $yz_main_member = MemberShopInfo::getMemberShopInfo($main_member_id);
  868. $yz_abandon_member = MemberShopInfo::getMemberShopInfo($abandon_member_id);
  869. if (!$yz_main_member) {
  870. $this->addYzMember($main_member_id);
  871. }
  872. if (!$yz_abandon_member) {
  873. $this->addYzMember($abandon_member_id);
  874. }
  875. MemberShopInfo::uniacid()->where('member_id', $main_member_id)->update(['is_old' => 1, 'mark_member_id' => $abandon_member_id]);
  876. MemberShopInfo::uniacid()->where('member_id', $abandon_member_id)->update(['is_old' => 1, 'mark_member_id' => $main_member_id]);
  877. throw new MemberErrorMsgException('会员数据异常,请联系客服');
  878. } else {
  879. //全自动合并按钮
  880. $exception = DB::transaction(function () use ($main_member_id, $abandon_member_id, $fansInfo, $userInfo, $relation_set) {
  881. $abandon_member = Member::getMemberById($abandon_member_id);
  882. $main_member = Member::getMemberById($main_member_id);
  883. $merge_data = [
  884. 'uniacid' => \YunShop::app()->uniacid,
  885. 'before_uid' => $abandon_member_id,
  886. 'after_uid' => $main_member_id,
  887. 'before_mobile' => $abandon_member->mobile,
  888. 'after_mobile' => $main_member->mobile,
  889. 'before_point' => $abandon_member->credit1?:0.00,
  890. 'after_point' => bcadd($main_member->credit1, $abandon_member->credit1, 2)?:0.00,
  891. 'before_amount' => $abandon_member->credit2?:0.00,
  892. 'after_amount' => bcadd($main_member->credit2, $abandon_member->credit2, 2)?:0.00,
  893. 'set_content' => json_encode($relation_set),
  894. 'merge_type' => 3,
  895. ];
  896. //删除重复微擎会员
  897. $mc_member = Member::getMemberById($main_member_id);
  898. if ($mc_member) {
  899. Member::uniacid()->where('uid', $abandon_member_id)->delete();
  900. } else {
  901. Member::uniacid()->where('uid', $abandon_member_id)->update(['uid' => $main_member_id]);
  902. }
  903. //删除重复商城会员
  904. $sub_member = MemberShopInfo::getMemberShopInfo($main_member_id);
  905. if ($sub_member) {
  906. MemberShopInfo::uniacid()->where('member_id', $abandon_member_id)->delete();
  907. } else {
  908. MemberShopInfo::uniacid()->where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  909. }
  910. //合并处理服务
  911. (new MemberMergeService($main_member_id, $abandon_member_id, $merge_data))->handel();
  912. //小程序
  913. MemberMiniAppModel::updateData($abandon_member_id, ['member_id' => $main_member_id]);
  914. //app
  915. MemberWechatModel::updateData($abandon_member_id, ['member_id' => $main_member_id]);
  916. //公众号
  917. McMappingFans::where('uid', $abandon_member_id)->update(['uid' => $main_member_id]);
  918. //聚合cps
  919. if (Schema::hasTable('yz_member_aggregation_app')) {
  920. DB::table('yz_member_aggregation_app')->where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  921. }
  922. //企业微信
  923. if (Schema::hasTable('yz_member_customer')) {
  924. DB::table('yz_member_customer')->where('uid',$abandon_member_id)->update(['uid' => $main_member_id]);
  925. }
  926. //unionid
  927. MemberUniqueModel::where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  928. //支付宝
  929. MemberAlipay::where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  930. $this->updateFansMember($fansInfo, $main_member_id, $userInfo);
  931. });
  932. if (!is_null($exception)) {
  933. throw new MemberErrorMsgException('sql执行错误,需回滚');
  934. }
  935. event(new MergeMemberEvent($main_member_id, $abandon_member_id));
  936. return $main_member_id;
  937. }
  938. }
  939. return $UnionidInfo->member_id;
  940. }
  941. private function addYzMember($member_id)
  942. {
  943. $default_group = McGroupsModel::getDefaultGroupId();
  944. $invite_code = MemberModel::getInviteCode($member_id);
  945. $yz_member = SubMemberModel::uniacid()->where('member_id', $member_id)->first();
  946. if (!$yz_member) {
  947. $add_arr = [
  948. 'member_id' => $member_id,
  949. 'uniacid' => \Yunshop::app()->uniacid,
  950. 'group_id' => $default_group->id ?: 0,
  951. 'level_id' => 0,
  952. 'pay_password' => '',
  953. 'salt' => '',
  954. 'yz_openid' => '',
  955. 'access_token_1' => '',
  956. 'access_expires_in_1' => '',
  957. 'refresh_token_1' => '',
  958. 'refresh_expires_in_1' => '',
  959. 'invite_code' => $invite_code
  960. ];
  961. SubMemberModel::create($add_arr);
  962. }
  963. }
  964. private function memberChoice($merge_choice, $UnionidInfo, $fansInfo)
  965. {
  966. $unique_uid = $UnionidInfo->member_id;
  967. $fans_uid = $fansInfo->uid;
  968. switch ($merge_choice) {
  969. case 1 : //手机号
  970. $member_uni = Member::getMemberById($unique_uid);
  971. $member_fans = Member::getMemberById($fans_uid);
  972. if ((empty($member_uni->mobile) && empty($member_fans->mobile)) || ($member_uni->mobile && $member_fans->mobile)) {
  973. if ($unique_uid < $fans_uid) {
  974. $main_member_id = $unique_uid;
  975. $abandon_member_id = $fans_uid;
  976. } else {
  977. $main_member_id = $fans_uid;
  978. $abandon_member_id = $unique_uid;
  979. }
  980. } elseif (empty($member_uni->mobile) && !empty($member_fans->mobile)) {
  981. $main_member_id = $fans_uid;
  982. $abandon_member_id = $unique_uid;
  983. } else {
  984. $main_member_id = $unique_uid;
  985. $abandon_member_id = $fans_uid;
  986. }
  987. break;
  988. case 2 : //公众号
  989. $member_uni = McMappingFans::getFansById($unique_uid);
  990. $member_fans = McMappingFans::getFansById($fans_uid);
  991. list($main_member_id, $abandon_member_id) = $this->handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid);
  992. break;
  993. case 3 : //小程序
  994. $member_uni = MemberMiniAppModel::getFansById($unique_uid);
  995. $member_fans = MemberMiniAppModel::getFansById($fans_uid);
  996. list($main_member_id, $abandon_member_id) = $this->handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid);
  997. break;
  998. case 4 : //app
  999. $member_uni = MemberWechatModel::getFansById($unique_uid);
  1000. $member_fans = MemberWechatModel::getFansById($fans_uid);
  1001. list($main_member_id, $abandon_member_id) = $this->handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid);
  1002. break;
  1003. case 5 : //alipay
  1004. $member_uni = MemberAlipay::getFansById($unique_uid);
  1005. $member_fans = MemberAlipay::getFansById($fans_uid);
  1006. list($main_member_id, $abandon_member_id) = $this->handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid);
  1007. break;
  1008. default : //注册时间
  1009. if ($unique_uid < $fans_uid) {
  1010. $main_member_id = $unique_uid;
  1011. $abandon_member_id = $fans_uid;
  1012. } else {
  1013. $main_member_id = $fans_uid;
  1014. $abandon_member_id = $unique_uid;
  1015. }
  1016. break;
  1017. }
  1018. return [$main_member_id, $abandon_member_id];
  1019. }
  1020. private function handleMemberChoice($member_uni, $member_fans, $unique_uid, $fans_uid)
  1021. {
  1022. if (($member_uni && $member_fans) || (empty($member_uni) && empty($member_fans))) {
  1023. if ($unique_uid < $fans_uid) {
  1024. $main_member_id = $unique_uid;
  1025. $abandon_member_id = $fans_uid;
  1026. } else {
  1027. $main_member_id = $fans_uid;
  1028. $abandon_member_id = $unique_uid;
  1029. }
  1030. } elseif (empty($member_uni) && !empty($member_fans)) {
  1031. $main_member_id = $fans_uid;
  1032. $abandon_member_id = $unique_uid;
  1033. } else {
  1034. $main_member_id = $unique_uid;
  1035. $abandon_member_id = $fans_uid;
  1036. }
  1037. return [$main_member_id, $abandon_member_id];
  1038. }
  1039. private function updateHeadPic($member_id, $userInfo)
  1040. {
  1041. if (!empty($userInfo)) {
  1042. Member::getMemberByUid($member_id)->update([
  1043. 'nickname' => $this->filteNickname($userInfo),
  1044. 'avatar' => $userInfo['headimgurl'],
  1045. ]);
  1046. }
  1047. }
  1048. public function updateFansMember($fan, $member_id, $userinfo)
  1049. {
  1050. //TODO
  1051. }
  1052. /**
  1053. * 扫海报关注
  1054. *
  1055. * 关注->微擎注册->商城注册
  1056. *
  1057. * 接口延迟,商城无法监控微擎行为导致会员注册重复1(fans->uid=0; mc_members=null)
  1058. *
  1059. * @param $fansModel
  1060. * @param $userInfo
  1061. */
  1062. private function checkFansUid($fansModel, $userInfo)
  1063. {
  1064. if ($fansModel && (0 == $fansModel->uid || 1 == $fansModel->uid)) {
  1065. $member_id = SubMemberModel::getMemberId($userInfo['openid']);
  1066. if (!is_null($member_id)) {
  1067. $fansModel->uid = $member_id;
  1068. $this->updateFansMember($fansModel, $member_id, $userInfo);
  1069. }
  1070. }
  1071. }
  1072. /**
  1073. * 扫海报关注
  1074. *
  1075. * 关注->微擎注册->商城注册
  1076. *
  1077. * 接口延迟,商城无法监控微擎行为导致会员注册重复2(fans->uid被更新; mc_members存在)
  1078. *
  1079. * @param $mc_members
  1080. * @param $fans
  1081. * @param $yz_member
  1082. * @param $userInfo
  1083. * @return int
  1084. */
  1085. private function checkYzMember($mc_members, $fans, $yz_member, $userInfo)
  1086. {
  1087. if (!is_null($mc_members) && !is_null($fans) && is_null($yz_member)) {
  1088. $member_id = SubMemberModel::getMemberId($userInfo['openid']);
  1089. if (!is_null($member_id) && $member_id != 0 && $member_id != $fans->uid) {
  1090. if (Member::getMemberById($member_id)) {
  1091. Member::deleted($fans->uid);
  1092. $this->updateFansMember($fans, $member_id, $userInfo);
  1093. }
  1094. return $member_id;
  1095. }
  1096. }
  1097. return 0;
  1098. }
  1099. /**
  1100. * @param $member_id
  1101. * @param string $key
  1102. * @param int $minute
  1103. * @throws MemberNotLoginException
  1104. */
  1105. public function chkAccount($member_id, $key = 'chekAccount', $minute = 30)
  1106. {
  1107. $type = \YunShop::request()->type;
  1108. $mid = Member::getMid();
  1109. if (1 == $type && !Cache::has($member_id . ':' . $key)) {
  1110. Cache::put($member_id . ':' . $key, 1, \Carbon\Carbon::now()->addMinutes($minute));
  1111. $queryString = ['type' => $type, 'session_id' => session_id(), 'i' => \YunShop::app()->uniacid, 'mid' => $mid];
  1112. throw new MemberNotLoginException('请登录', ['login_status' => 0, 'login_url' => Url::absoluteApi('member.login.chekAccount', $queryString)]);
  1113. }
  1114. }
  1115. public function newMemberInfoAttrStatus($member_info)
  1116. {
  1117. $set = \Setting::get('shop.form');
  1118. if (!is_null($set)) {
  1119. $set = json_decode($set, true);
  1120. if (!empty($set['form'])) unset($set['form']);
  1121. $set['form'] = [
  1122. [
  1123. 'del' => 0,
  1124. 'name' => '会员姓名',
  1125. 'pinyin' => 'huiyuannicheng',
  1126. 'sort' => 1,
  1127. 'value' => $member_info->realname
  1128. ],
  1129. [
  1130. 'del' => 0,
  1131. 'name' => '手机号码',
  1132. 'pinyin' => 'shoujihaoma',
  1133. 'sort' => 2,
  1134. 'value' => $member_info->mobile
  1135. ]
  1136. ];
  1137. } else {
  1138. $set = [
  1139. 'base' => [
  1140. 'sex' => 1,
  1141. 'address' => 1,
  1142. 'birthday' => 1
  1143. ],
  1144. 'form' => [
  1145. [
  1146. 'del' => 0,
  1147. 'name' => '会员姓名',
  1148. 'pinyin' => 'huiyuannicheng',
  1149. 'sort' => 1,
  1150. 'value' => $member_info->realname
  1151. ],
  1152. [
  1153. 'del' => 0,
  1154. 'name' => '手机号码',
  1155. 'pinyin' => 'shoujihaoma',
  1156. 'sort' => 2,
  1157. 'value' => $member_info->mobile
  1158. ]
  1159. ]
  1160. ];
  1161. }
  1162. return $set;
  1163. }
  1164. public function setLoginLimit($mobile)
  1165. {
  1166. Redis::incr('login_error_count_'.$mobile);
  1167. Redis::set('last_error_time_'.$mobile,time());
  1168. $error_times = Redis::get('login_error_count_'.$mobile)?:0;
  1169. $error_count = 5 - $error_times;
  1170. if ($error_count <=0) {
  1171. Redis::set('login_error_count_'.$mobile, 0);
  1172. Redis::setex('login_error_time_'.$mobile, 30*60, true);
  1173. }
  1174. return $error_count;
  1175. }
  1176. public function getLoginLimit($mobile)
  1177. {
  1178. $login_error_time = Redis::get('login_error_time_'.$mobile);
  1179. if ($login_error_time) {
  1180. $last_error_time = Redis::get('last_error_time_'.$mobile);
  1181. $remain_time = ($last_error_time+30*60) - time();
  1182. return intval(($remain_time/60));
  1183. }
  1184. return 0;
  1185. }
  1186. public static function countReset($mobile)
  1187. {
  1188. return Redis::set('login_error_count_'.$mobile, 0);
  1189. }
  1190. }