panghu před 8 měsíci
rodič
revize
d41f68e975

+ 45 - 1
app/Http/Controllers/Api/MemberController.php

@@ -3,6 +3,12 @@
 namespace App\Http\Controllers\Api;
 
 use App\Http\Controllers\ApiController;
+use App\Models\Member;
+use App\Servers\MemberOpenServer;
+use App\Servers\MemberServer;
+use App\Servers\PassServer;
+use App\Servers\WeixinServer;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 会员信息
@@ -16,6 +22,44 @@ class MemberController extends ApiController
     function appletLogin()
     {
         $code = request()->input('code');
-        $invite_code = request()->input('invite_code', '');
+        $openInfo = WeixinServer::creatServer()->getAppletsOpenId($code);
+
+        if(!isset($openInfo['openid'])){
+            return $this->apiResponseError(empty($openInfo['msg'])?'openid获取失败':$openInfo['msg']);
+        }
+
+        DB::beginTransaction();
+        try {
+            //检查openid是否存在
+            $m_id = MemberOpenServer::creatServer()->getUserId(2,$openInfo['openid']);
+            if($m_id){
+                //重置token
+                $token_str = PassServer::creatServer()->getMemberToken($m_id);
+                Member::where('id', $m_id)->update(['token_str' => $token_str]);
+                $member = ['m_id' => $m_id, 'token' => $token_str];
+
+            }else{
+                $member=MemberServer::creatServer()->register();
+                if (empty($member)){
+                    DB::rollBack();
+                    return $this->apiResponseError('注册失败');
+                }
+
+                $memberOpen=MemberOpenServer::creatServer()->setUserOpenid($member['m_id'],2,$openInfo['openid']);
+
+                if(empty($memberOpen)){
+                    DB::rollBack();
+                    return $this->apiResponseError('注册失败');
+                }
+            }
+
+            //清除会员缓存
+            MemberServer::creatServer()->delMemberCache($member['m_id']);
+            DB::commit();
+            return $this->apiResponseSuccess('成功',$member);
+        }catch (\Exception $e){
+            DB::rollBack();
+            return $this->apiResponseError('注册失败');
+        }
     }
 }

+ 59 - 0
app/Models/MemberOpenId.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace App\Models;
+
+use DateTimeInterface;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 用户openid表
+ */
+class MemberOpenId extends Model
+{
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected $table = 'member_open_id';
+
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected $primaryKey = 'id';
+
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public $timestamps = true;
+
+
+    /**
+     * 不能被批量赋值的属性
+     *
+     * @var array
+     */
+    protected $guarded = ['id', 'updated_at', 'created_at'];
+
+    private $typeEnum=[
+        1=>'微信H5',
+        2=>'微信小程序',
+        3=>'支付宝',
+    ];
+
+    /**
+     * 为数组 / JSON 序列化准备日期。
+     *
+     * @param DateTimeInterface $date
+     * @return string
+     */
+    protected function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format($this->dateFormat ?: 'Y-m-d H:i:s');
+    }
+
+}

+ 87 - 0
app/Servers/MemberOpenServer.php

@@ -0,0 +1,87 @@
+<?php
+
+
+namespace App\Servers;
+
+
+
+use App\Models\MemberOpenId;
+
+/**
+ * 用户openid管理
+ * Class MemberOpenServer
+ */
+class MemberOpenServer
+{
+
+    static private $server = null;
+
+    private $typeArr=[
+        1=>'公众号H5',
+        2=>'小程序',
+    ];
+
+
+    private function __construct()
+    {
+
+    }
+
+    /**
+     * 创建对象
+     * @return MemberOpenServer
+     */
+    static function creatServer()
+    {
+        if (empty(self::$server)) self::$server = new MemberOpenServer();
+        return self::$server;
+    }
+
+    /**
+     * 获取用户登录ID
+     * @param $openid
+     * @param $unionid
+     * @param $type
+     * @return mixed|string
+     */
+    function getUserId($type,$openid,$unionid=null){
+        $row = MemberOpenId::where('openid',$openid)->where('type',$type)->where('is_del',0)->first();
+        if(empty($row) && !empty($unionid)){
+            $row=MemberOpenId::where('unionid',$unionid)->where('type',$type)->where('openid','<>','')->where('is_del',0)->first();
+            if($row){
+                $row->update(['openid' => $openid]);
+            }
+        }
+        return empty($row['m_id'])?'':$row['m_id'];
+    }
+
+
+    /**
+     * 用户注册openid
+     * @param $userId
+     * @param $openid
+     * @param $unionid
+     * @param $type
+     * @return bool
+     */
+    function setUserOpenid($userId,$type,$openid,$unionid=null){
+        $row = MemberOpenId::where('m_id',$userId)->where('type',$type)->where('is_del',0)->first();
+        if($row){
+            $row->update(['openid' =>$openid,'unionid' => $unionid ]);
+        }else{
+            MemberOpenId::create([
+                'is_del' => 0,
+                'm_id' => $userId,
+                'openid' => $openid,
+                'unionid' => $unionid,
+                'type' => $type
+            ]);
+        }
+        return true;
+    }
+
+
+
+
+
+}

+ 123 - 0
app/Servers/MemberServer.php

@@ -0,0 +1,123 @@
+<?php
+
+
+namespace App\Servers;
+
+
+
+
+use App\Models\Member;
+
+/**
+ * 会员
+ */
+class MemberServer
+{
+    /**
+     * 错误信息
+     * @var string
+     */
+    private $errorMsg = '';
+
+    static private $server = '';
+
+
+
+
+    private function __construct()
+    {
+
+    }
+
+
+
+    /**
+     * 创建对象
+     * @return MemberServer
+     */
+    static function creatServer()
+    {
+        if (empty(self::$server)) {
+            self::$server = new MemberServer();
+        }
+        return self::$server;
+    }
+
+
+    /**
+     * 注册会员
+     * @param $mobile
+     * @param string $nickname
+     * @param string $password
+     * @return array|false
+     * @throws \Exception
+     */
+    function register($mobile = '', $nickname = '', $password = '',$head_img = '')
+    {
+        $member_info = [];
+        if ($password) {
+            $pass_server = PassServer::creatServer($password);
+            $member_info = $pass_server->creatPassword();
+        }
+        $member_info['phone'] = $mobile;
+        $nickname = $this->emojiFilter($nickname);
+        $member_info['nickname'] = empty($nickname) ? '君子校园'.CommonServer::creatServer()->getRandChar(6) : $nickname;
+        $member_info['head_img'] = empty($head_img) ? 'https://jhnewshop.oss-cn-chengdu.aliyuncs.com/storage/attest/20210927/949e48fb7c286836097efdd4ba4d0bd9.jpg' : $head_img;
+//        $member_info['status'] = 1;
+        $member = Member::create($member_info);
+        if (empty($member)) {
+            return false;
+        }
+        //用户token
+        $token_str = PassServer::creatServer()->getMemberToken($member->{'id'});
+        Member::where('id', $member->{'id'})->update(['token_str' => $token_str]);
+
+        return ['m_id' => $member->{'id'},  'token' => $token_str];
+    }
+
+
+    /**
+     * 截取掉微信表情
+     * @param $str
+     * @return mixed|string
+     */
+    function emojiFilter($str)
+    {
+        if ($str) {
+            $nickname = $str;
+            $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=CommonServer::creatServer()->utf8_filter($nickname);
+            return addslashes(trim($nickname));
+        } else {
+            $return = '';
+        }
+        return $return;
+
+    }
+
+    /**
+     * 更新用户信息
+     * @param $m_id
+     * @param $data
+     * @return int
+     */
+    function updateMember($m_id,$data)
+    {
+        return Member::where('id',$m_id)->update($data);
+    }
+
+    /**
+     * 清除会员缓存
+     * @param $m_id
+     */
+    function delMemberCache($m_id)
+    {
+        RedisDataServer::creatServer()->delData('member_' . $m_id);
+        RedisDataServer::creatServer()->delData('login_' . $m_id);
+    }
+
+}

+ 181 - 0
app/Servers/PassServer.php

@@ -0,0 +1,181 @@
+<?php
+
+
+namespace App\Servers;
+
+
+/**
+ * 密码服务
+ */
+class PassServer
+{
+
+    /**
+     * 错误信息
+     * @var string
+     */
+    private $errorMsg = '';
+
+    private $password = '';
+
+    private $encrypt = '';
+
+
+    private function __construct($password = '', $encrypt = '')
+    {
+        $this->setPassword($password);
+        $this->setEncrypt($encrypt);
+    }
+
+    /**
+     * 创建对象
+     * @param string $password
+     * @param string $encrypt
+     * @return PassServer
+     */
+    static function creatServer($password = '', $encrypt = '')
+    {
+        return new PassServer($password, $encrypt);
+    }
+
+    /**
+     * @return string
+     */
+    public function getPassword(): string
+    {
+        return $this->password;
+    }
+
+    /**
+     * @param string $password
+     */
+    public function setPassword($password = ''): void
+    {
+        if (!empty($password)) $this->password = $password;
+    }
+
+    /**
+     * @return string
+     */
+    public function getEncrypt(): string
+    {
+        return $this->encrypt;
+    }
+
+    /**
+     * @param string $encrypt
+     */
+    public function setEncrypt($encrypt = ''): void
+    {
+        if (!empty($encrypt)) $this->encrypt = $encrypt;
+    }
+
+
+
+    /**
+     * @return string
+     */
+    public function getErrorMsg(): string
+    {
+        return $this->errorMsg;
+    }
+
+    /**
+     * 加密字符串
+     * @param $length
+     * @return null|string
+     */
+    public function getRandChar($length = 6)
+    {
+        $str = null;
+        $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
+        $max = strlen($strPol) - 1;
+        for ($i = 0; $i < $length; $i++) {
+            $str .= $strPol[rand(0, $max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
+        }
+        return $str;
+    }
+
+    /**
+     * 创建会员密码
+     * @return array|false
+     */
+    function creatPassword()
+    {
+        if (empty($this->password)) {
+            $this->errorMsg = "密码不能为空";
+            return false;
+        }
+        if (empty($this->encrypt)) $this->encrypt = $this->getRandChar();
+        $password = $this->memberPassword();
+        return ['password' => $password, 'encrypt' => $this->encrypt];
+    }
+
+    /**
+     * 验证密码
+     * @param $member_pass
+     * @return bool
+     */
+    public function verifyPass($member_pass)
+    {
+        $str = $this->memberPassword();
+        return $member_pass == $str;
+    }
+
+    /**
+     * 密码加密
+     * @return string
+     */
+    function memberPassword()
+    {
+        $str = md5($this->password) . md5($this->encrypt);
+        return md5($str);
+    }
+
+    /**
+     * 生成登录token
+     * @param $id
+     * @return string
+     */
+    public function getRiderToken($id)
+    {
+        $token = md5($id . 'riderToken' . time());
+        return $token;
+    }
+
+
+    /**
+     * 生成会员登录token
+     * @param $m_id
+     * @return string
+     */
+    public function getMemberToken($m_id)
+    {
+        $token = md5($m_id . 'memberToken' . time());
+        return $token;
+    }
+
+
+    /**
+     * 生成登录token
+     * @param $id
+     * @return string
+     */
+    public function getShopToken($id)
+    {
+        $token = md5($id . 'shopToken' . time());
+        return $token;
+    }
+
+    /**
+     * 生成登录token
+     * @param $id
+     * @return string
+     */
+    public function getAgentToken($id)
+    {
+        $token = md5($id . 'agentToken' . time());
+        return $token;
+    }
+
+}