MemberAppYdbService.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: yangming
  5. * Date: 17/8/2
  6. * Time: 上午11:20
  7. */
  8. namespace app\frontend\modules\member\services;
  9. use app\common\helpers\Client;
  10. use app\common\helpers\Url;
  11. use app\common\services\Session;
  12. use app\frontend\models\Member;
  13. use app\frontend\modules\member\models\McMappingFansModel;
  14. use app\frontend\modules\member\models\MemberWechatModel;
  15. use app\frontend\modules\member\models\MemberUniqueModel;
  16. use app\frontend\modules\member\models\MemberModel;
  17. use Crypt;
  18. use app\common\models\MemberShopInfo;
  19. use Illuminate\Contracts\Encryption\DecryptException;
  20. use Illuminate\Support\Facades\Redis;
  21. class MemberAppYdbService extends MemberService
  22. {
  23. const LOGIN_TYPE = 7;
  24. public function __construct()
  25. {
  26. }
  27. public function login()
  28. {
  29. $uniacid = \YunShop::app()->uniacid;
  30. $mobile = \YunShop::request()->mobile;
  31. $password = \YunShop::request()->password;
  32. $uuid = trim($_REQUEST['uuid']);
  33. $redirect_url = request()->yz_redirect;
  34. if (!empty($mobile) && !empty($password)) {
  35. if (!\Request::isMethod('post') || !MemberService::validate($mobile, $password)) {
  36. return show_json(6, "手机号或密码错误");
  37. }
  38. $remain_time = $this->getLoginLimit($mobile);
  39. if($remain_time){
  40. return show_json(6, "账号锁定中,请".$remain_time."分钟后再登录");
  41. }
  42. $has_mobile = MemberModel::checkMobile($uniacid, $mobile);
  43. if (!$has_mobile) {
  44. return show_json(7, "用户不存在");
  45. }
  46. $password = md5($password . $has_mobile->salt);
  47. $member_info = MemberModel::getUserInfo($uniacid, $mobile, $password)->first();
  48. if (!$member_info) {
  49. $error_count = $this->setLoginLimit($mobile);
  50. if ($error_count > 0) {
  51. return show_json(6, "密码错误!你还剩" . $error_count . "次机会");
  52. } else {
  53. return show_json(6, "密码错误次数已达5次,您的账号已锁定,请30分钟之后登录!");
  54. }
  55. }
  56. $member_info = $member_info->toArray();
  57. //生成分销关系链
  58. Member::createRealtion($member_info['uid']);
  59. $yz_member = MemberShopInfo::getMemberShopInfo($member_info['uid']);
  60. if ($yz_member) {
  61. $yz_member = $yz_member->toArray();
  62. $data = MemberModel::userData($member_info, $yz_member);
  63. } else {
  64. $data = $member_info;
  65. }
  66. Session::set('member_id', $member_info['uid']);
  67. setcookie('Yz-appToken', encrypt($member_info['mobile'] . '\t' . $member_info['uid']), time() + self::TOKEN_EXPIRE);
  68. MemberService::countReset($mobile);
  69. $data['redirect_url'] = base64_decode($redirect_url);
  70. return show_json(1, $data);
  71. } else {
  72. $para = \YunShop::request();
  73. \Log::debug('获取用户信息:', print_r($para, 1));
  74. $member = MemberWechatModel::getUserInfo($para['openid']);
  75. if ($member) {
  76. Session::set('member_id', $member['member_id']);
  77. $this->redirect_link($para['openid']);
  78. }
  79. if ($para['openid'] && $para['token']) {
  80. $this->app_get_userinfo($para['token'], $para['openid'], $uuid);
  81. } elseif ($para['openid']) {
  82. $this->redirect_link($para['openid']);
  83. }
  84. if ($para['apptoken']) {
  85. $openid = Crypt::decrypt($para['apptoken']);
  86. $member = MemberWechatModel::getUserInfo($openid);
  87. if (!$member) {
  88. return show_json(3, '登录失败,请重试');
  89. }
  90. Session::set('member_id', $member['member_id']);
  91. setcookie('Yz-appToken', encrypt($openid . '\t' . $member['member_id']), time() + self::TOKEN_EXPIRE);
  92. return show_json(1, $member->toArray());
  93. }
  94. }
  95. }
  96. /**
  97. * app获取用户信息并存储
  98. *
  99. * @param $token
  100. * @param $openid
  101. */
  102. public function app_get_userinfo($token, $openid, $uuid)
  103. {
  104. //通过接口获取用户信息
  105. $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $token . '&openid=' . $openid;
  106. $user_info = \Curl::to($url)
  107. ->asJsonResponse(true)
  108. ->get();
  109. if (!empty($uuid)) {
  110. $user_info['uuid'] = $uuid;
  111. }
  112. if (!empty($user_info) && !empty($user_info['unionid'])) {
  113. $this->memberLogin($user_info);
  114. exit('success');
  115. } else {
  116. exit('fail');
  117. }
  118. }
  119. /**
  120. * app登录跳转到前端
  121. *
  122. * @param $openid
  123. */
  124. public function redirect_link($openid)
  125. {
  126. if (!$openid) {
  127. $url = Url::absoluteApp('login');
  128. } else {
  129. $apptoken = Crypt::encrypt($openid);
  130. $url = Url::absoluteApp('login_validate', ["apptoken" => $apptoken]);
  131. }
  132. redirect($url)->send();
  133. exit();
  134. }
  135. public function updateMemberInfo($member_id, $userinfo)
  136. {
  137. parent::updateMemberInfo($member_id, $userinfo);
  138. $record = array(
  139. 'openid' => $userinfo['openid'],
  140. 'nickname' => stripslashes($userinfo['nickname']),
  141. 'uuid' => $userinfo['uuid']
  142. );
  143. MemberWechatModel::updateData($member_id, $record);
  144. }
  145. public function addMemberInfo($uniacid, $userinfo)
  146. {
  147. $uid = parent::addMemberInfo($uniacid, $userinfo);
  148. $this->addFansMember($uid, $uniacid, $userinfo);
  149. return $uid;
  150. }
  151. public function addMcMemberFans($uid, $uniacid, $userinfo)
  152. {
  153. McMappingFansModel::insertData($userinfo, array(
  154. 'uid' => $uid,
  155. 'acid' => $uniacid,
  156. 'uniacid' => $uniacid,
  157. 'salt' => Client::random(8),
  158. ));
  159. }
  160. public function addFansMember($uid, $uniacid, $userinfo)
  161. {
  162. $user = MemberWechatModel::getUserInfo_memberid($uid);
  163. if (!empty($user)) {
  164. $this->updateMemberInfo($uid, $userinfo);
  165. } else {
  166. MemberWechatModel::replace(array(
  167. 'uniacid' => $uniacid,
  168. 'member_id' => $uid,
  169. 'openid' => $userinfo['openid'],
  170. 'nickname' => $userinfo['nickname'],
  171. 'avatar' => $userinfo['headimgurl'],
  172. 'gender' => $userinfo['sex'],
  173. 'province' => '',
  174. 'country' => '',
  175. 'city' => '',
  176. 'uuid' => $userinfo['uuid']
  177. ));
  178. }
  179. }
  180. public function getFansModel($openid)
  181. {
  182. return McMappingFansModel::getUId($openid);
  183. }
  184. /**
  185. * 会员关联表操作
  186. *
  187. * @param $uniacid
  188. * @param $member_id
  189. * @param $unionid
  190. */
  191. public function addMemberUnionid($uniacid, $member_id, $unionid)
  192. {
  193. MemberUniqueModel::insertData(array(
  194. 'uniacid' => $uniacid,
  195. 'unionid' => $unionid,
  196. 'member_id' => $member_id,
  197. 'type' => self::LOGIN_TYPE
  198. ));
  199. }
  200. /**
  201. * 验证登录状态
  202. *
  203. * @return bool
  204. */
  205. public function checkLogged($login = null)
  206. {
  207. if (isset($_COOKIE['Yz-appToken'])) {
  208. try {
  209. $yz_token = decrypt($_COOKIE['Yz-appToken']);
  210. list($openid, $uuid) = explode('\t', $yz_token);
  211. if (preg_match('/^\d{11}/', $openid)) {
  212. $member = \app\common\models\Member::uniacid()->where('mobile', $openid)->first();
  213. if (!is_null($member)) {
  214. $member_id = $member->uid;
  215. }
  216. } else {
  217. $member = MemberWechatModel::getUserInfo($openid);
  218. if (!is_null($member)) {
  219. $member_id = $member->member_id;
  220. }
  221. }
  222. if (!$member) {
  223. return false;
  224. }
  225. if (\YunShop::app()->getMemberId() && $member_id != \YunShop::app()->getMemberId()) {
  226. setcookie(session_name(), '',time() - 3600, '/');
  227. setcookie(session_name(), '',time() - 3600);
  228. setcookie('Yz-appToken', '',time() - 3600, '/addons/yun_shop');
  229. return false;
  230. }
  231. Session::set('member_id', $member_id);
  232. return true;
  233. } catch (DecryptException $e) {
  234. return false;
  235. }
  236. }
  237. return false;
  238. }
  239. }