123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?php
- namespace app\common\model;
- use app\common\library\Redis;
- use app\main\constants\UserConstants;
- use think\Log;
- use think\Model;
- class SubscriptionFans extends Model
- {
- // 表名
- protected $table = 'subscription_fans';
- // 自动写入时间戳字段
- protected $autoWriteTimestamp = 'int';
- // 定义时间戳字段名
- protected $createTime = 'createtime';
- protected $updateTime = 'updatetime';
- // 追加属性
- protected $append = [
- ];
- //当前链接的channel_openid分库
- protected $connectSbuIdOpenId = null;
- protected $subscription_id = null;
- protected $open_id = null;
- /**
- * 设置分库链接数据
- *
- * @param $subscription_id
- * @param $openid
- * @return $this
- */
- public function setConnect($subscription_id, $openid)
- {
- $subscription_openid = $subscription_id . '_' . $openid;
- if ($this->connectSbuIdOpenId != $subscription_openid) {
- $this->connect(get_db_connect($this->table, hash_code($subscription_openid)));
- $this->connectSbuIdOpenId = $subscription_openid;
- $this->subscription_id = $subscription_id;
- $this->open_id = $openid;
- }
- return $this;
- }
- /**
- * 粉丝取消关注
- * @param null $time
- * @return SubscriptionFans|bool
- */
- public function unsubscribe($time = null){
- try{
- $time = $time ?? time();
- $update_data = ['subscribe_time' => $time, 'is_subscribe' => UserConstants::USER_IS_SUBSCRIBE_NO, 'subscription_extend' => UserConstants::USER_SUBSCRIPTION_EXTEND_NO, 'operate_time' => $time, 'updatetime' => $time];
- $map = ['subscription_id' => $this->subscription_id,'openid' => $this->open_id];
- Log::info('Subscription->wechat:订阅号取消关注维护,SubscriptionID:'.$this->subscription_id.' OpenID:'.$this->open_id);
- return $this->where($map)->update($update_data);
- }catch (\Exception $e){
- Log::info('Subscription->wechat:订阅号取消关注维护,SubscriptionID:'.$this->subscription_id.' OpenID:'.$this->open_id.' Error:'.$e->getMessage());
- }
- return false;
- }
- /**
- * 更新粉丝的交互时间
- */
- public function updateOperateTime(){
- $map = ['subscription_id' => $this->subscription_id,'openid' => $this->open_id];
- if($this->where($map)->find()){
- $this->where($map)->update(['operate_time'=>time()]);
- }
- }
- /**
- * 获取粉丝用户ID
- * @return mixed
- */
- public function getFansId(){
- $map = ['subscription_id' => $this->subscription_id,'openid' => $this->open_id];
- return $this->where($map)->value('id');
- }
- /**
- * 创建粉丝
- * @param $officialAccount
- * @param null $time
- * @return bool
- */
- public function createFans($officialAccount,$time = null){
- try{
- $time = $time ?? time();
- $map = ['subscription_id' => $this->subscription_id,'openid' => $this->open_id];
- //Redis 加锁
- $redis = Redis::instanceCache();
- $nxKey = 'S:'.$this->subscription_id.':'.$this->open_id;
- //检测Fans是否存在
- if(!$fans = $this->where($map)->find()){
- //获取Fans信息
- $weChatUserInfo = $officialAccount->user->get($this->open_id);
- // 获取redis自增id
- $redisAuto = Redis::instanceAuto();
- $userId = $redisAuto->incr('FID'); //redis自增返回新的user_id
- $data = [
- 'id' => $userId,
- 'subscription_id' => $this->subscription_id,
- 'openid' => $this->open_id,
- 'nickname' => $weChatUserInfo['nickname'] ?? '书友',
- 'avatar' => $weChatUserInfo['headimgurl'] ?? cdnurl('/assets/img/frontend/icon/nav_icon_4.png'),
- 'sex' => $weChatUserInfo['sex'] ?? 0,
- 'is_subscribe' => 1,
- 'subscribe_time'=> $time,
- 'operate_time'=>$time,
- 'createtime'=>time(),
- 'updatetime'=>time()
- ];
- //获取锁
- if(!$nxRes = $redis->setnx($nxKey,0)){ //已经存在
- return false;
- }
- $redis->expire($nxKey,20); //20秒过期
- //同步Fans数据
- if(!$is_insert = $this->insertGetId($data)){
- Log::error("Subscription Create Fans Fail SubscriptionID:{$this->subscription_id} OpenID:{$this->open_id}");
- $redis->del($nxKey);
- return false;
- }
- Log::info("Subscription Create Fans Success SubscriptionID:{$this->subscription_id} OpenID:{$this->open_id}");
- $redis->del($nxKey);
- }
- return true;
- }catch (\Exception $e){
- Log::error("Subscription Create Fans Error:".$e->getMessage());
- }
- return false;
- }
- }
|