Fans.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\wechat\shop\controller;
  11. use addon\wechat\model\Wechat as WechatModel;
  12. use addon\wechat\model\Fans as FansModel;
  13. /**
  14. * 微信粉丝控制器
  15. */
  16. class Fans extends BaseWechat
  17. {
  18. /**
  19. * 粉丝列表
  20. * @return \multitype
  21. */
  22. public function lists()
  23. {
  24. $fans_model = new FansModel();
  25. if (request()->isAjax()) {
  26. $page = input('page', 1);
  27. $limit = input('page_size', PAGE_LIST_ROWS);
  28. $is_subscribe = input('is_subscribe', '');//关注
  29. $nickname = input('nickname', '');//粉丝名称
  30. $start_time = input('start_time', '');
  31. $end_time = input('end_time', '');
  32. $condition[] = ['site_id', '=', $this->site_id];
  33. if ($is_subscribe !== '') {
  34. $condition[] = ['is_subscribe', "=", $is_subscribe];
  35. }
  36. if ($nickname != '') {
  37. $condition[] = ['nickname', 'like', '%' . $nickname . '%'];
  38. }
  39. if (!empty($start_time) && empty($end_time)) {
  40. $condition[] = ["subscribe_time", ">=", date_to_time($start_time)];
  41. } elseif (empty($start_time) && !empty($end_time)) {
  42. $condition[] = ["subscribe_time", "<=", date_to_time($end_time)];
  43. } elseif (!empty($start_time) && !empty($end_time)) {
  44. $condition[] = ['subscribe_time', 'between', [date_to_time($start_time), date_to_time($end_time)]];
  45. }
  46. $fans_list = $fans_model->getFansPageList($condition, $page, $limit);
  47. return $fans_list;
  48. }
  49. $tag_list = $fans_model->getFansTagList();
  50. $this->assign('tag_list', $tag_list['data']);
  51. return $this->fetch('fans/lists', [], $this->replace);
  52. }
  53. /**
  54. * 更新粉丝信息
  55. */
  56. public function syncWechatFans()
  57. {
  58. $page_index = input('page', 0);
  59. $page_size = input('limit', PAGE_LIST_ROWS);
  60. $wechat_model = new WechatModel($this->site_id);
  61. if ($page_index == 0) {
  62. //建立连接,同时获取所有用户openid 拉去粉丝信息列表(一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取的方式来满足需求。)
  63. $openid_list = [];
  64. $is_continue = true;
  65. $next_openid = null;
  66. do {
  67. $item_result = $wechat_model->user($next_openid);
  68. if ($item_result["code"] < 0)
  69. return $item_result;
  70. if(empty($item_result['data']['data'])){
  71. return success(0, '公众号暂无粉丝');
  72. }
  73. $next_openid = $item_result["data"]["next_openid"];
  74. $openid_item = $item_result["data"]['data']["openid"];
  75. if (empty($openid_item)) {
  76. $is_continue = false;
  77. } else {
  78. $is_continue = false;
  79. foreach ($openid_item as $k => $v) {
  80. $openid_list[] = $v;
  81. }
  82. }
  83. } while ($is_continue);
  84. //将粉丝列表存入session
  85. session('wechat_openid_list', $openid_list);
  86. $total = count($openid_list);
  87. if ($openid_list % $page_size == 0) {
  88. $page_count = $total / $page_size;
  89. } else {
  90. $page_count = (int)($total / $page_size) + 1;
  91. }
  92. $data = array(
  93. 'total' => $total,
  94. 'page_count' => $page_count,
  95. );
  96. return success(0, '', $data);
  97. } else {
  98. //对应页数更新用户粉丝信息
  99. $openid_list = session('wechat_openid_list');
  100. if (empty($openid_list)) {
  101. return error();
  102. }
  103. $start = ($page_index - 1) * $page_size;
  104. $page_fans_openid_list = array_slice($openid_list, $start, $page_size);
  105. if (empty($page_fans_openid_list)) {
  106. return error();
  107. }
  108. $fans_model = new FansModel();
  109. $result = $wechat_model->selectUser($page_fans_openid_list);
  110. if ($result['data'] && $result['data']['user_info_list']) {
  111. foreach ($result['data']['user_info_list'] as $k => $v) {
  112. $nickname_decode = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $v['nickname']);
  113. $nickname = preg_replace_callback('/./u',
  114. function (array $match) {
  115. return strlen($match[0]) >= 4 ? '' : $match[0];
  116. },
  117. $v['nickname']);
  118. $add_data = [
  119. 'site_id' => $this->site_id,
  120. 'nickname' => $nickname,
  121. 'nickname_decode' => $nickname_decode,
  122. 'headimgurl' => $v['headimgurl'],
  123. 'sex' => $v['sex'],
  124. 'language' => $v['language'],
  125. 'country' => $v['country'],
  126. 'province' => $v['province'],
  127. 'city' => $v['city'],
  128. 'openid' => $v['openid'],
  129. 'unionid' => $v['unionid'] ?? '',
  130. 'groupid' => '',
  131. 'is_subscribe' => 1,
  132. 'remark' => $v['remark'],
  133. 'subscribe_time' => $v['subscribe_time'] ?? 0,
  134. 'subscribe_scene' => $v['subscribe_scene'] ?? 0,
  135. 'unsubscribe_time' => $v['unsubscribe_time'] ?? 0,
  136. 'update_date' => time()
  137. ];
  138. $info = $fans_model->getFansInfo(['openid' => $v['openid'], 'site_id' => $this->site_id], 'openid');
  139. if (!empty($info['data'])) {
  140. $fans_model->editFans($add_data, [['openid', '=', $v['openid']], ['site_id', '=', $this->site_id]]);
  141. } else {
  142. $fans_model->addFans($add_data);
  143. }
  144. }
  145. }
  146. return $result;
  147. }
  148. }
  149. /**
  150. * 微信粉丝标签
  151. */
  152. public function fansTagList()
  153. {
  154. if (request()->isAjax()) {
  155. $fans_model = new FansModel();
  156. $page = input('page', 1);
  157. $limit = input('limit', PAGE_LIST_ROWS);
  158. $condition = [];
  159. $list = $fans_model->getFansTagPageList($condition, $page, $limit);
  160. return $list;
  161. } else {
  162. return $this->fetch('fans/fans_tag_list');
  163. }
  164. }
  165. /**
  166. * 为微信粉丝批量打标签
  167. */
  168. public function batchtagging()
  169. {
  170. if (request()->isAjax()) {
  171. $fans_model = new FansModel();
  172. $tagids = input('tag_id', '');
  173. $openids = input('openid', '');
  174. if (!empty($openids)) {
  175. $tag_id_list = explode(',', $tagids);
  176. $openid_list = explode(',', $openids);
  177. $data = [
  178. 'tag_id_list' => $tag_id_list,
  179. 'openid_list' => $openid_list
  180. ];
  181. $res = $fans_model->batchtagging($data);
  182. return $res;
  183. }
  184. }
  185. }
  186. /**
  187. * 为微信粉丝打标签
  188. */
  189. public function fansTagging()
  190. {
  191. if (request()->isAjax()) {
  192. $fans_model = new FansModel();
  193. $openid = input('openid', '');
  194. $tagid_list = input('tagid_list', '');
  195. $cancel_tagid_list = input('cancel_tagid_list', '');
  196. if (!empty($openid)) {
  197. $tagid_list_arr = !empty($tagid_list) ? explode(',', $tagid_list) : [];
  198. $cancel_tagid_list_arr = !empty($cancel_tagid_list) ? explode(',', $cancel_tagid_list) : [];
  199. $data = [
  200. 'tag_id_list' => $tagid_list_arr,
  201. 'openid_list' => [$openid]
  202. ];
  203. $res = $fans_model->batchtagging($data);//批量增加标签
  204. $data['tag_id_list'] = $cancel_tagid_list_arr;
  205. $fans_model->batchUnTagging($data);//批量减少标签
  206. return $res;
  207. }
  208. }
  209. }
  210. /**
  211. * 添加标签
  212. * @return multitype:string
  213. */
  214. public function addFansTag()
  215. {
  216. if (request()->isAjax()) {
  217. $fans_model = new FansModel();
  218. $tag_name = input('tag_name', '');
  219. if (!empty($tag_name)) {
  220. $data = [
  221. 'tag_name' => $tag_name,
  222. ];
  223. $data["tags"] = time();
  224. $data["tag_id"] = time();
  225. $res = $fans_model->addFansTag($data);
  226. return $res;
  227. }
  228. }
  229. }
  230. /**
  231. * 编辑标签
  232. */
  233. public function editFansTag()
  234. {
  235. if (request()->isAjax()) {
  236. $fans_model = new FansModel();
  237. $id = input('id', '');
  238. $tag_name = input('tag_name', '');
  239. if (!empty($tag_name)) {
  240. $data = [
  241. 'tag_name' => $tag_name,
  242. ];
  243. $condition = array(
  244. ["id", "=", $id]
  245. );
  246. $res = $fans_model->editFansTag($data, $condition);
  247. return $res;
  248. } else {
  249. return error("", "标签名称不可为空!");
  250. }
  251. }
  252. }
  253. /**
  254. * 删除标签
  255. */
  256. public function deleteFansTag()
  257. {
  258. if (request()->isAjax()) {
  259. $fans_model = new FansModel();
  260. $id = input('id', '');
  261. $condition = [
  262. ['id', "=", $id],
  263. ];
  264. $res = $fans_model->deleteFansTag($condition);
  265. return $res;
  266. }
  267. }
  268. /**
  269. * 同步粉丝标签
  270. */
  271. public function syncFansTag()
  272. {
  273. if (request()->isAjax()) {
  274. $fans_model = new FansModel();
  275. $res = $fans_model->syncFansTag();
  276. return $res;
  277. }
  278. }
  279. }