SubscriptionFans.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <?php
  2. namespace app\common\model;
  3. use app\common\library\Redis;
  4. use app\main\constants\UserConstants;
  5. use think\Log;
  6. use think\Model;
  7. class SubscriptionFans extends Model
  8. {
  9. // 表名
  10. protected $table = 'subscription_fans';
  11. // 自动写入时间戳字段
  12. protected $autoWriteTimestamp = 'int';
  13. // 定义时间戳字段名
  14. protected $createTime = 'createtime';
  15. protected $updateTime = 'updatetime';
  16. // 追加属性
  17. protected $append = [
  18. ];
  19. //当前链接的channel_openid分库
  20. protected $connectSbuIdOpenId = null;
  21. protected $subscription_id = null;
  22. protected $open_id = null;
  23. /**
  24. * 设置分库链接数据
  25. *
  26. * @param $subscription_id
  27. * @param $openid
  28. * @return $this
  29. */
  30. public function setConnect($subscription_id, $openid)
  31. {
  32. $subscription_openid = $subscription_id . '_' . $openid;
  33. if ($this->connectSbuIdOpenId != $subscription_openid) {
  34. $this->connect(get_db_connect($this->table, hash_code($subscription_openid)));
  35. $this->connectSbuIdOpenId = $subscription_openid;
  36. $this->subscription_id = $subscription_id;
  37. $this->open_id = $openid;
  38. }
  39. return $this;
  40. }
  41. /**
  42. * 粉丝取消关注
  43. * @param null $time
  44. * @return SubscriptionFans|bool
  45. */
  46. public function unsubscribe($time = null){
  47. try{
  48. $time = $time ?? time();
  49. $update_data = ['subscribe_time' => $time, 'is_subscribe' => UserConstants::USER_IS_SUBSCRIBE_NO, 'subscription_extend' => UserConstants::USER_SUBSCRIPTION_EXTEND_NO, 'operate_time' => $time, 'updatetime' => $time];
  50. $map = ['subscription_id' => $this->subscription_id,'openid' => $this->open_id];
  51. Log::info('Subscription->wechat:订阅号取消关注维护,SubscriptionID:'.$this->subscription_id.' OpenID:'.$this->open_id);
  52. return $this->where($map)->update($update_data);
  53. }catch (\Exception $e){
  54. Log::info('Subscription->wechat:订阅号取消关注维护,SubscriptionID:'.$this->subscription_id.' OpenID:'.$this->open_id.' Error:'.$e->getMessage());
  55. }
  56. return false;
  57. }
  58. /**
  59. * 更新粉丝的交互时间
  60. */
  61. public function updateOperateTime(){
  62. $map = ['subscription_id' => $this->subscription_id,'openid' => $this->open_id];
  63. if($this->where($map)->find()){
  64. $this->where($map)->update(['operate_time'=>time()]);
  65. }
  66. }
  67. /**
  68. * 获取粉丝用户ID
  69. * @return mixed
  70. */
  71. public function getFansId(){
  72. $map = ['subscription_id' => $this->subscription_id,'openid' => $this->open_id];
  73. return $this->where($map)->value('id');
  74. }
  75. /**
  76. * 创建粉丝
  77. * @param $officialAccount
  78. * @param null $time
  79. * @return bool
  80. */
  81. public function createFans($officialAccount,$time = null){
  82. try{
  83. $time = $time ?? time();
  84. $map = ['subscription_id' => $this->subscription_id,'openid' => $this->open_id];
  85. //Redis 加锁
  86. $redis = Redis::instanceCache();
  87. $nxKey = 'S:'.$this->subscription_id.':'.$this->open_id;
  88. //检测Fans是否存在
  89. if(!$fans = $this->where($map)->find()){
  90. //获取Fans信息
  91. $weChatUserInfo = $officialAccount->user->get($this->open_id);
  92. // 获取redis自增id
  93. $redisAuto = Redis::instanceAuto();
  94. $userId = $redisAuto->incr('FID'); //redis自增返回新的user_id
  95. $data = [
  96. 'id' => $userId,
  97. 'subscription_id' => $this->subscription_id,
  98. 'openid' => $this->open_id,
  99. 'nickname' => $weChatUserInfo['nickname'] ?? '书友',
  100. 'avatar' => $weChatUserInfo['headimgurl'] ?? cdnurl('/assets/img/frontend/icon/nav_icon_4.png'),
  101. 'sex' => $weChatUserInfo['sex'] ?? 0,
  102. 'is_subscribe' => 1,
  103. 'subscribe_time'=> $time,
  104. 'operate_time'=>$time,
  105. 'createtime'=>time(),
  106. 'updatetime'=>time()
  107. ];
  108. //获取锁
  109. if(!$nxRes = $redis->setnx($nxKey,0)){ //已经存在
  110. return false;
  111. }
  112. $redis->expire($nxKey,20); //20秒过期
  113. //同步Fans数据
  114. if(!$is_insert = $this->insertGetId($data)){
  115. Log::error("Subscription Create Fans Fail SubscriptionID:{$this->subscription_id} OpenID:{$this->open_id}");
  116. $redis->del($nxKey);
  117. return false;
  118. }
  119. Log::info("Subscription Create Fans Success SubscriptionID:{$this->subscription_id} OpenID:{$this->open_id}");
  120. $redis->del($nxKey);
  121. }
  122. return true;
  123. }catch (\Exception $e){
  124. Log::error("Subscription Create Fans Error:".$e->getMessage());
  125. }
  126. return false;
  127. }
  128. }