www.maiwd.cn // +---------------------------------------------------------------------- namespace app\api\controller\wdsxh; use addons\wdsxh\library\Wxapp; use app\admin\model\wdsxh\business\Association; use app\api\model\wdsxh\activity\ActivityApply; use app\api\model\wdsxh\activity\ActivityApplyRecord; use app\api\model\wdsxh\activity\Order; use app\api\model\wdsxh\activity\Refund; use app\api\model\wdsxh\goods\Address; use app\api\model\wdsxh\jielong\JielongFeedback; use app\api\model\wdsxh\member\Cert; use app\api\model\wdsxh\member\Member; use app\api\model\wdsxh\member\MemberApply; use app\api\model\wdsxh\member\MemberExpireMessage; use app\api\model\wdsxh\member\Pay; use app\api\model\wdsxh\member\Promotion; use app\api\model\wdsxh\member\Visitor; use app\api\model\wdsxh\questionnaire\Questionnaire; use app\api\model\wdsxh\questionnaire\Render; use app\api\model\wdsxh\UserWechat; use app\common\controller\Api; use app\common\library\Token; use app\common\model\User; use think\Db; /** * Class AppletUserWechat * Desc 小程序微信用户注册登录 * Create on 2024/3/7 10:03 * Create by wangyafang */ class AppletUserWechat extends Api { protected $noNeedLogin = ['is_register','get_phone','register','login']; protected $noNeedRight = ['*']; public function _initialize() { parent::_initialize(); $configObj = (new \app\admin\model\wdsxh\Config())->where('id',1)->find(); if (empty($configObj['applet_appid'])) { $this->error('小程序AppID未配置'); } if (empty($configObj['applet_secret'])) { $this->error('小程序AppSecret未配置'); } } /** * Desc 微信小程序是否注册 * Create on 2024/3/7 10:05 * Create by wangyafang */ public function is_register() { if(!$this->request->isGet()) { $this->error('请求类型错误'); } $code=$this->request->param('code'); if(empty($code)){ $this->error('code参数错误'); } $data=Wxapp::wxlogin($code); if(empty($data['openid'])){ $this->error('小程序登录失败',$data); } $openid=$data['openid']; $userWechatObj = (new UserWechat())->where('applet_openid',$openid)->find(); $auth_status = !empty($userWechatObj) ? 1 : 2; $this->success('请求成功!',['auth_status'=>$auth_status]); } /** * Desc 微信小程序注册 * Create on 2024/3/7 10:06 * Create by wangyafang */ public function register() { if(!$this->request->isPost()) { $this->error('请求类型错误'); } $code=$this->request->post('code'); $param = $this->request->post(); if(empty($code)){ $this->error('code参数错误'); } $data=Wxapp::wxlogin($code); if(empty($data['openid'])){ $this->error('小程序注册失败',$data); } $openid=$data['openid']; //todo 腾讯校验增加开关 $security_text_switch = (new \app\admin\model\wdsxh\Config())->where('id','1')->value('security_text_switch'); if ($security_text_switch == '1' && isset($param['nickname']) && !empty($param['nickname'])) { $result = Wxapp::checkSecurityText($openid,$param['nickname']); if ($result != 1) { if ($result == 2) { $this->error('文本内容输入不合规,请重新输入'); } else { $this->error('errcode:'.$result['errcode'].',errmsg:'.$result['errmsg']); } } } $nickname_avatar_data = $this->get_nickname_avatar(); $avatar = (isset($param['avatar']) && !empty($param['avatar'])) ? $param['avatar'] : $nickname_avatar_data['avatar']; $param['nickname'] = (isset($param['nickname']) && !empty($param['nickname'])) ? $param['nickname'] : $nickname_avatar_data['nickname']; $parent_wechat_id = $this->request->post('parent_wechat_id',0); //todo 后台统一用户同一时间出现3次 $userWechatCheckObj = (new UserWechat())->where('applet_openid',$openid)->find(); if ($userWechatCheckObj) { $this->error('微信小程序数据错误,删除小程序重新进入,试下'); } Db::startTrans(); try{ $user=User::create(array( 'group_id'=>1, 'status'=>'normal', 'joinip'=>request()->ip(), 'jointime'=>time(), 'nickname'=>$param['nickname'], 'avatar'=>$avatar, ),true); $userWechatObj = UserWechat::create(array( 'user_id' =>$user->id, 'applet_openid'=>$openid, 'nickname'=>$param['nickname'], 'avatar'=>$avatar, 'channel'=>1, 'parent_wechat_id'=>$parent_wechat_id, )); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); $this->error($e->getMessage()); } $member_id = (new Member())->where('wechat_id',$parent_wechat_id)->value('id'); if ($parent_wechat_id && $member_id) { $promotionModel = new Promotion(); $promotion_data = array( 'wechat_id' => $parent_wechat_id, 'member_id'=>$member_id, ); $promotionModel->data($promotion_data); $promotionModel->allowField(true)->save(); } $this->auth->direct($user->id); $userObj = $this->auth->getUserinfo(); $userObj['avatar'] = wdsxh_full_url($userObj['avatar']); $this->success('请求成功',$userObj); } /** * Desc 微信小程序登录 * Create on 2024/3/7 10:06 * Create by wangyafang */ public function login() { if(!$this->request->isPost()) { $this->error('请求类型错误'); } $code = $this->request->param('code'); if(empty($code)){ $this->error('code参数错误'); } $data=Wxapp::wxlogin($code); if(empty($data['openid'])){ $this->error('小程序登录失败',$data); } $openid=$data['openid']; $userWechatObj = (new UserWechat())->where('applet_openid',$openid)->find(); $userObj = User::get($userWechatObj['user_id']); if (!$userObj) { $userObj = User::create(array( 'group_id'=>1, 'status'=>'normal', 'joinip'=>request()->ip(), 'jointime'=>time(), 'avatar'=> $userWechatObj['avatar'], 'nickname'=> $userWechatObj['nickname'], 'mobile'=> $userWechatObj['mobile'], ),true); $userWechatObj->user_id = $userObj->id; $userWechatObj->save(); } if (empty($userWechatObj['openid'])) { $userWechatObj->applet_openid = $openid; $userWechatObj->save(); } $this->auth->direct($userObj->id); $userObj = $this->auth->getUserinfo(); $userObj['avatar'] = wdsxh_full_url($userObj['avatar']); $this->success('请求成功',$userObj); } /** * Desc 获取微信小程序用户手机号 * Create on 2024/3/7 11:16 * Create by wangyafang */ public function get_phone(){ if(!$this->request->isGet()) { $this->error('请求类型错误'); } $code=$this->request->get('code'); $iv=$this->request->get('iv'); $encryptedData=$this->request->get('encryptedData','','trim'); if(empty($code)){ $this->error('code 参数错误'); } if(empty($iv)){ $this->error('iv 参数错误'); } if(empty($encryptedData)){ $this->error('encryptedData 参数错误'); } $data=Wxapp::phone($code,$iv,$encryptedData); if (isset($data['phoneNumber'])) { $userWechatObj = (new UserWechat())->where('mobile',$data['phoneNumber'])->find(); $auth_status = !empty($userWechatObj) ? 1 : 2; $data['auth_status'] = $auth_status; } else { $this->error('获取手机号失败'); } $this->success('请求成功',$data); } private function get_nickname_avatar() { $avatar = Association::where('id',1)->value('logo'); if (empty($avatar)) { $avatar = '/assets/addons/wdsxh/img/avatar.png'; } $current_user_id = User::order('id','desc')->limit(1)->value('id'); if (!$current_user_id) { $current_user_id = 1; } else { $current_user_id = bcadd($current_user_id, 1); } $nickname = '用户'.$current_user_id; return array( 'avatar'=>$avatar, 'nickname'=>$nickname ); } /** * Desc 绑定手机号 * Create on 2024/10/15 17:14 * Create by wangyafang */ public function bind_mobile() { if(!$this->request->isPost()) { $this->error('请求类型错误'); } $user_id = $this->auth->id; $code=$this->request->post('code'); $iv=$this->request->post('iv'); $encryptedData=$this->request->post('encryptedData','','trim'); if(empty($code)){ $this->error('code 参数错误'); } if(empty($iv)){ $this->error('iv 参数错误'); } if(empty($encryptedData)){ $this->error('encryptedData 参数错误'); } $data=Wxapp::phone($code,$iv,$encryptedData); if (!isset($data['phoneNumber'])) { $this->error('获取手机号失败'); } $mobile = $data['phoneNumber']; $userWechatObj = $appletUserWechatObj = (new UserWechat())->where('user_id',$user_id)->find(); $byMObileQueryUserWechat = (new UserWechat())->where('mobile',$mobile)->find(); if (!empty($byMObileQueryUserWechat) && !empty($userWechatObj) && !empty($byMObileQueryUserWechat['applet_openid']) && ($byMObileQueryUserWechat['applet_openid'] != $userWechatObj['applet_openid'])) { $this->error('手机号已被其他微信使用'); } $wananchiWhere['wananchi_openid'] = ['not null', '']; //not null $wananchiUserWechatObj = (new UserWechat())->where('mobile',$mobile)->where($wananchiWhere)->find(); if ($wananchiUserWechatObj) {//已经在公众号使用一段时间 $wananchiUserObj = (new User())->where('id',$wananchiUserWechatObj['user_id'])->find(); $wananchiData = $wananchiUserWechatObj; $result = false; $activityApplyModel = new ActivityApply(); $activityApplyRecordModel = new ActivityApplyRecord(); $activityOrderModel = new Order(); $activityRefundModel = new Refund(); $businessModel = new \app\api\model\wdsxh\business\Business(); $demandModel = new \app\api\model\wdsxh\Demand(); $jielongFeedbackModel = new JielongFeedback(); $mallOrderModel = new \app\admin\model\wdsxh\mall\Order(); $mallUserAddressModel = new Address(); $memberModel = new Member(); $memberApplyModel = new MemberApply(); $memberCertModel = new Cert(); $memberExpireMessageModel = new MemberExpireMessage(); $memberPayModel = new Pay(); $memberPromotionModel = new Promotion(); $memberVisitorModel = new Visitor(); $questionnaireModel = new Questionnaire(); $questionnaireRenderModel = new Render(); $token_user_id = $wananchiUserWechatObj['user_id']; Db::startTrans(); try{ $result = (new UserWechat())->save([ 'wananchi_openid' => $wananchiData['wananchi_openid'], 'member_id' => $wananchiData['member_id'], ],['id' => $appletUserWechatObj['id']]); $memberModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $activityApplyModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $activityApplyRecordModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $activityOrderModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $activityRefundModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $businessModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $demandModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $jielongFeedbackModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $mallOrderModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $mallUserAddressModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $memberApplyModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $memberCertModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $memberExpireMessageModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $memberPayModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $memberPromotionModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $memberVisitorModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $questionnaireModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); $questionnaireRenderModel->save([ 'wechat_id' => $appletUserWechatObj['id'], ],['wechat_id' => $wananchiData['id']]); (new UserWechat())->save([ 'parent_wechat_id' => $appletUserWechatObj['id'], ],['parent_wechat_id' => $wananchiData['id']]); $wananchiUserWechatObj->delete(); $wananchiUserObj->delete(); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); $this->error($e->getMessage()); } $wechat_id = $wananchiData['id']; $where[] = ['exp',Db::raw("FIND_IN_SET($wechat_id,verifying_wechat_ids)")]; $activityModel = new \app\api\model\wdsxh\activity\Activity(); $activityVerifyingData = $activityModel ->where($where) ->select(); if (!empty($activityVerifyingData)) { foreach ($activityVerifyingData as $v) { $verifying_wechat_ids_array = explode(',',$v['verifying_wechat_ids']); foreach ($verifying_wechat_ids_array as $kk=>&$vv) { if ($vv == $wechat_id) { $vv = $appletUserWechatObj['id']; } } $verifying_wechat_ids = implode(',',$verifying_wechat_ids_array); $v->verifying_wechat_ids = $verifying_wechat_ids; $v->save(); } } if (false === $result) { $this->error('整合公众号数据失败'); } Token::clear($token_user_id); } $appletUserWechatObj->mobile = $mobile; $result = $appletUserWechatObj->save(); if (false === $result) { $this->error('绑定失败'); } $memberApplyObj = (new MemberApply()) ->where('mobile',$mobile) ->where('state','2') ->where('channel',3) ->where('child_state','6') ->where('pay_method','1') ->find(); $memberObj = (new Member())->where('mobile',$mobile)->find(); if ($memberApplyObj && empty($memberApplyObj['wechat_id']) && $memberObj && empty($memberObj['wechat_id'])) { $memberApplyObj->wechat_id = $userWechatObj->id; $memberApplyObj->save(); $memberObj->wechat_id = $userWechatObj->id; $memberObj->save(); $memberPayObj = (new Pay())->where('member_id',$memberObj['id'])->where('paid','2') ->where('channel','3') ->where('pay_method','4') ->where('delivery_state',2) ->order('id desc') ->find(); if ($memberPayObj && empty($memberPayObj['wechat_id'])) { $memberPayObj->wechat_id = $userWechatObj->id; $memberPayObj->save(); } } $this->success('绑定成功',$data); } }