1.扫码关注功能修复,解决老用户先关注后绑定无法免费看的问题
Showing
4 changed files
with
134 additions
and
54 deletions
... | @@ -2,7 +2,7 @@ package com.topdraw.business.process.rest; | ... | @@ -2,7 +2,7 @@ package com.topdraw.business.process.rest; |
2 | 2 | ||
3 | import cn.hutool.core.util.ObjectUtil; | 3 | import cn.hutool.core.util.ObjectUtil; |
4 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
5 | import com.alibaba.fastjson.JSON; | 5 | |
6 | import com.alibaba.fastjson.JSONObject; | 6 | import com.alibaba.fastjson.JSONObject; |
7 | import com.topdraw.annotation.AnonymousAccess; | 7 | import com.topdraw.annotation.AnonymousAccess; |
8 | import com.topdraw.business.module.member.profile.domain.MemberProfile; | 8 | import com.topdraw.business.module.member.profile.domain.MemberProfile; |
... | @@ -15,7 +15,6 @@ import com.topdraw.business.module.user.weixin.domain.UserWeixin; | ... | @@ -15,7 +15,6 @@ import com.topdraw.business.module.user.weixin.domain.UserWeixin; |
15 | import com.topdraw.business.module.user.weixin.service.UserWeixinService; | 15 | import com.topdraw.business.module.user.weixin.service.UserWeixinService; |
16 | import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO; | 16 | import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO; |
17 | import com.topdraw.business.process.domian.TempIptvUser; | 17 | import com.topdraw.business.process.domian.TempIptvUser; |
18 | import com.topdraw.business.process.domian.UnbindGroup; | ||
19 | import com.topdraw.business.process.domian.weixin.BindBean; | 18 | import com.topdraw.business.process.domian.weixin.BindBean; |
20 | import com.topdraw.business.process.domian.weixin.SubscribeBean; | 19 | import com.topdraw.business.process.domian.weixin.SubscribeBean; |
21 | import com.topdraw.business.process.domian.weixin.SubscribeBeanEvent; | 20 | import com.topdraw.business.process.domian.weixin.SubscribeBeanEvent; |
... | @@ -24,6 +23,7 @@ import com.topdraw.business.process.service.UserOperationService; | ... | @@ -24,6 +23,7 @@ import com.topdraw.business.process.service.UserOperationService; |
24 | import com.topdraw.common.ResultInfo; | 23 | import com.topdraw.common.ResultInfo; |
25 | import com.topdraw.config.RedisKeyUtil; | 24 | import com.topdraw.config.RedisKeyUtil; |
26 | import com.topdraw.exception.BadRequestException; | 25 | import com.topdraw.exception.BadRequestException; |
26 | import com.topdraw.exception.EntityNotFoundException; | ||
27 | import com.topdraw.util.Base64Util; | 27 | import com.topdraw.util.Base64Util; |
28 | import com.topdraw.util.JSONUtil; | 28 | import com.topdraw.util.JSONUtil; |
29 | import com.topdraw.utils.RedisUtils; | 29 | import com.topdraw.utils.RedisUtils; |
... | @@ -35,15 +35,12 @@ import io.swagger.annotations.ApiOperation; | ... | @@ -35,15 +35,12 @@ import io.swagger.annotations.ApiOperation; |
35 | import lombok.extern.slf4j.Slf4j; | 35 | import lombok.extern.slf4j.Slf4j; |
36 | import org.springframework.beans.BeanUtils; | 36 | import org.springframework.beans.BeanUtils; |
37 | import org.springframework.beans.factory.annotation.Autowired; | 37 | import org.springframework.beans.factory.annotation.Autowired; |
38 | import org.springframework.cache.annotation.CacheEvict; | ||
39 | import org.springframework.cache.annotation.Cacheable; | ||
40 | import org.springframework.util.Assert; | 38 | import org.springframework.util.Assert; |
41 | import org.springframework.validation.annotation.Validated; | 39 | import org.springframework.validation.annotation.Validated; |
42 | import org.springframework.web.bind.annotation.*; | 40 | import org.springframework.web.bind.annotation.*; |
43 | 41 | ||
44 | import java.io.IOException; | 42 | import java.io.IOException; |
45 | import java.net.URLDecoder; | 43 | import java.net.URLDecoder; |
46 | import java.util.Base64; | ||
47 | import java.util.List; | 44 | import java.util.List; |
48 | import java.util.Map; | 45 | import java.util.Map; |
49 | import java.util.Objects; | 46 | import java.util.Objects; |
... | @@ -65,6 +62,10 @@ public class UserOperationController { | ... | @@ -65,6 +62,10 @@ public class UserOperationController { |
65 | @Autowired | 62 | @Autowired |
66 | private RedisUtils redisUtils; | 63 | private RedisUtils redisUtils; |
67 | 64 | ||
65 | private static final String SUBSCRIBE = "subscribe"; | ||
66 | private static final String UNSUBSCRIBE = "unsubscribe"; | ||
67 | private static final Integer SUBSCRIBE_STATUS = 1; | ||
68 | |||
68 | @PostMapping(value = "/createUserAndCreateMember") | 69 | @PostMapping(value = "/createUserAndCreateMember") |
69 | @ApiOperation("新增大屏账户同时创建会员信息") | 70 | @ApiOperation("新增大屏账户同时创建会员信息") |
70 | @AnonymousAccess | 71 | @AnonymousAccess |
... | @@ -157,7 +158,6 @@ public class UserOperationController { | ... | @@ -157,7 +158,6 @@ public class UserOperationController { |
157 | UserTv userTv = new UserTv(); | 158 | UserTv userTv = new UserTv(); |
158 | BeanUtils.copyProperties(resources,userTv); | 159 | BeanUtils.copyProperties(resources,userTv); |
159 | String unionid = resources.getUnionid(); | 160 | String unionid = resources.getUnionid(); |
160 | // Long memberId = resources.getMemberId(); | ||
161 | String memberCode1 = resources.getMemberCode(); | 161 | String memberCode1 = resources.getMemberCode(); |
162 | if (Objects.nonNull(memberCode1)) { | 162 | if (Objects.nonNull(memberCode1)) { |
163 | 163 | ||
... | @@ -168,12 +168,9 @@ public class UserOperationController { | ... | @@ -168,12 +168,9 @@ public class UserOperationController { |
168 | this.userTvOperationService.unbind(userTv); | 168 | this.userTvOperationService.unbind(userTv); |
169 | } | 169 | } |
170 | 170 | ||
171 | } else { | ||
172 | |||
173 | this.userTvOperationService.unbindByUnionId(userTv,unionid); | ||
174 | |||
175 | } | 171 | } |
176 | 172 | ||
173 | |||
177 | return ResultInfo.success(); | 174 | return ResultInfo.success(); |
178 | } | 175 | } |
179 | 176 | ||
... | @@ -319,13 +316,13 @@ public class UserOperationController { | ... | @@ -319,13 +316,13 @@ public class UserOperationController { |
319 | 316 | ||
320 | String headimgurl = iptvUserInfo.get("headimgurl").toString(); | 317 | String headimgurl = iptvUserInfo.get("headimgurl").toString(); |
321 | String nickname = iptvUserInfo.get("nickname").toString(); | 318 | String nickname = iptvUserInfo.get("nickname").toString(); |
322 | if (org.apache.commons.lang3.StringUtils.isNotBlank(nickname)) { | 319 | if (StringUtils.isNotBlank(nickname)) { |
323 | String nicknameDecode = URLDecoder.decode(nickname, "UTF-8"); | 320 | String nicknameDecode = URLDecoder.decode(nickname, "UTF-8"); |
324 | String nicknameEncode = Base64Util.encode(nicknameDecode); | 321 | String nicknameEncode = Base64Util.encode(nicknameDecode); |
325 | subscribeBean.setNickname(nicknameEncode); | 322 | subscribeBean.setNickname(nicknameEncode); |
326 | } | 323 | } |
327 | 324 | ||
328 | if (org.apache.commons.lang3.StringUtils.isNotBlank(headimgurl)) { | 325 | if (StringUtils.isNotBlank(headimgurl)) { |
329 | String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8"); | 326 | String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8"); |
330 | subscribeBean.setHeadimgurl(headimgurlDecode); | 327 | subscribeBean.setHeadimgurl(headimgurlDecode); |
331 | } | 328 | } |
... | @@ -355,6 +352,16 @@ public class UserOperationController { | ... | @@ -355,6 +352,16 @@ public class UserOperationController { |
355 | * 再将服务号信息和大屏参数缓存下来(该接口的功能) | 352 | * 再将服务号信息和大屏参数缓存下来(该接口的功能) |
356 | * 然后跳转到订阅号关注页 | 353 | * 然后跳转到订阅号关注页 |
357 | * 关注后回调处理时,根据unionid进行相关逻辑 | 354 | * 关注后回调处理时,根据unionid进行相关逻辑 |
355 | * | ||
356 | * 业务场景: | ||
357 | * 1.未关注-绑定 | ||
358 | * 新用户 | ||
359 | * 2.先关注-绑定 | ||
360 | * 1).未绑定 | ||
361 | * 2).已绑定 | ||
362 | * 2.1).已绑定当前大屏账户 | ||
363 | * 2.2).换绑 | ||
364 | * 2.2.1). | ||
358 | * @author Hongyan Wang | 365 | * @author Hongyan Wang |
359 | * @date 2021/8/24 4:54 下午 | 366 | * @date 2021/8/24 4:54 下午 |
360 | */ | 367 | */ |
... | @@ -371,9 +378,101 @@ public class UserOperationController { | ... | @@ -371,9 +378,101 @@ public class UserOperationController { |
371 | String unionid = json.getString("unionid"); | 378 | String unionid = json.getString("unionid"); |
372 | Assert.state(StrUtil.isNotBlank(unionid), "unionid不可为空"); | 379 | Assert.state(StrUtil.isNotBlank(unionid), "unionid不可为空"); |
373 | 380 | ||
374 | String s = this.userTvOperationService.saveUserInfo(data); | 381 | // 大屏侧通过返回值来展示对应的小程序页面 |
382 | String result = SUBSCRIBE; | ||
375 | 383 | ||
376 | return ResultInfo.success(s); | 384 | // 保存大小屏信息到redis同时返回小屏信息 |
385 | UserWeixinDTO userWeixinDTO = this.userTvOperationService.saveUserInfo(data); | ||
386 | |||
387 | if (Objects.isNull(userWeixinDTO) || Objects.isNull(userWeixinDTO.getId())) { | ||
388 | result = UNSUBSCRIBE; | ||
389 | } | ||
390 | |||
391 | Integer status = userWeixinDTO.getStatus(); | ||
392 | log.info("saveUserInfo ==>> status ==>> [{}]",status); | ||
393 | if (status != SUBSCRIBE_STATUS) { | ||
394 | result = UNSUBSCRIBE; | ||
395 | } | ||
396 | |||
397 | if (result.equalsIgnoreCase(SUBSCRIBE)) { | ||
398 | |||
399 | // 考虑老用户先关注后扫码的情况,即使关注了也要进行绑定检查 | ||
400 | SubscribeBean subscribeBean = new SubscribeBean(); | ||
401 | subscribeBean.setUnionid(userWeixinDTO.getUnionid()); | ||
402 | subscribeBean.setAppId(userWeixinDTO.getAppid()); | ||
403 | subscribeBean.setAppid(userWeixinDTO.getAppid()); | ||
404 | subscribeBean.setOpenId(userWeixinDTO.getOpenid()); | ||
405 | subscribeBean.setNickname(userWeixinDTO.getNickname()); | ||
406 | subscribeBean.setHeadimgurl(userWeixinDTO.getHeadimgurl()); | ||
407 | try { | ||
408 | // 解析 | ||
409 | this.parseSubscribe(subscribeBean); | ||
410 | |||
411 | log.info("saveUserInfo ==>> subscribeBean ==>> [{}]",subscribeBean); | ||
412 | |||
413 | JSONObject iptvUserInfo = subscribeBean.getIptvUserInfo(); | ||
414 | String platformAccount = iptvUserInfo.getString("platformAccount"); | ||
415 | MemberDTO memberDTO = this.memberService.findById(userWeixinDTO.getMemberId()); | ||
416 | |||
417 | TempIptvUser tempIptvUser = new TempIptvUser(); | ||
418 | tempIptvUser.setPlatformAccount(platformAccount); | ||
419 | tempIptvUser.setMemberCode(memberDTO.getCode()); | ||
420 | |||
421 | this.unbindPriorityCode(memberDTO); | ||
422 | |||
423 | log.info("subscribe again start subscribeBean ==>> [{}]",subscribeBean); | ||
424 | this.userTvOperationService.subscribe(subscribeBean); | ||
425 | log.info("subscribe again end !!!!"); | ||
426 | |||
427 | |||
428 | } catch (IOException e) { | ||
429 | e.printStackTrace(); | ||
430 | } | ||
431 | } | ||
432 | |||
433 | return ResultInfo.success(result); | ||
434 | } | ||
435 | |||
436 | |||
437 | /** | ||
438 | * | ||
439 | * @param memberDTO_0 | ||
440 | */ | ||
441 | private void unbindPriorityCode(MemberDTO memberDTO_0) { | ||
442 | String code1 = memberDTO_0.getCode(); | ||
443 | UserTvDTO userTvDTO1 = this.userTvService.findByPriorityMemberCode(code1); | ||
444 | if (Objects.nonNull(userTvDTO1) && Objects.nonNull(userTvDTO1.getId())) { | ||
445 | userTvDTO1.setPriorityMemberCode(null); | ||
446 | UserTv userTv = new UserTv(); | ||
447 | BeanUtils.copyProperties(userTvDTO1,userTv); | ||
448 | this.userTvService.update(userTv); | ||
449 | } | ||
450 | |||
451 | } | ||
452 | |||
453 | |||
454 | /** | ||
455 | * 检查是否绑定当前大屏账户 | ||
456 | * @param subscribeBean | ||
457 | * @param userWeixinDTO | ||
458 | * @return | ||
459 | */ | ||
460 | private boolean checkBind(SubscribeBean subscribeBean, UserWeixinDTO userWeixinDTO) { | ||
461 | boolean result = false; | ||
462 | JSONObject iptvUserInfo = subscribeBean.getIptvUserInfo(); | ||
463 | if (Objects.nonNull(iptvUserInfo)) { | ||
464 | String platformAccount = iptvUserInfo.getString("platformAccount"); | ||
465 | Long memberId = userWeixinDTO.getMemberId(); | ||
466 | MemberDTO memberDTO = this.memberService.findById(memberId); | ||
467 | if (Objects.nonNull(memberDTO.getUserIptvId()) && StringUtils.isNotBlank(platformAccount)) { | ||
468 | UserTvDTO userTvDTO = this.userTvService.findById(memberDTO.getUserIptvId()); | ||
469 | String platformAccount1 = userTvDTO.getPlatformAccount(); | ||
470 | if (platformAccount.equalsIgnoreCase(platformAccount1)) { | ||
471 | result = true; | ||
472 | } | ||
473 | } | ||
474 | } | ||
475 | return result; | ||
377 | } | 476 | } |
378 | 477 | ||
379 | @PostMapping(value = "/saveUserWeixinPhone") | 478 | @PostMapping(value = "/saveUserWeixinPhone") | ... | ... |
... | @@ -78,7 +78,7 @@ public interface UserOperationService { | ... | @@ -78,7 +78,7 @@ public interface UserOperationService { |
78 | * @param data | 78 | * @param data |
79 | * @return | 79 | * @return |
80 | */ | 80 | */ |
81 | String saveUserInfo(String data); | 81 | UserWeixinDTO saveUserInfo(String data); |
82 | 82 | ||
83 | /** | 83 | /** |
84 | * 获取用户授权并解析、保存用户手机号 | 84 | * 获取用户授权并解析、保存用户手机号 | ... | ... |
... | @@ -78,8 +78,6 @@ public class UserOperationServiceImpl implements UserOperationService { | ... | @@ -78,8 +78,6 @@ public class UserOperationServiceImpl implements UserOperationService { |
78 | 78 | ||
79 | 79 | ||
80 | @Autowired | 80 | @Autowired |
81 | private RedissonClient redissonClient; | ||
82 | @Autowired | ||
83 | private MemberService memberService; | 81 | private MemberService memberService; |
84 | @Autowired | 82 | @Autowired |
85 | private UserTvService userTvService; | 83 | private UserTvService userTvService; |
... | @@ -179,9 +177,6 @@ public class UserOperationServiceImpl implements UserOperationService { | ... | @@ -179,9 +177,6 @@ public class UserOperationServiceImpl implements UserOperationService { |
179 | 177 | ||
180 | } | 178 | } |
181 | 179 | ||
182 | // 关注历史记录 | ||
183 | this.doInsertSubscribeHistory(appId,openId,WeChatConstants.EVENT_SUBSCRIBE); | ||
184 | |||
185 | // 大屏信息 | 180 | // 大屏信息 |
186 | JSONObject iptvUserInfo = resources.getIptvUserInfo(); | 181 | JSONObject iptvUserInfo = resources.getIptvUserInfo(); |
187 | if (Objects.nonNull(iptvUserInfo)) { | 182 | if (Objects.nonNull(iptvUserInfo)) { |
... | @@ -211,6 +206,9 @@ public class UserOperationServiceImpl implements UserOperationService { | ... | @@ -211,6 +206,9 @@ public class UserOperationServiceImpl implements UserOperationService { |
211 | 206 | ||
212 | } | 207 | } |
213 | 208 | ||
209 | // 关注历史记录,用于恢复VIP等级(0:普通 1:团粉 其他:会员(过期后vip恢复到最高等级)) | ||
210 | this.doInsertSubscribeHistory(appId,openId,WeChatConstants.EVENT_SUBSCRIBE); | ||
211 | |||
214 | return true; | 212 | return true; |
215 | 213 | ||
216 | } | 214 | } |
... | @@ -350,13 +348,12 @@ public class UserOperationServiceImpl implements UserOperationService { | ... | @@ -350,13 +348,12 @@ public class UserOperationServiceImpl implements UserOperationService { |
350 | * @return | 348 | * @return |
351 | */ | 349 | */ |
352 | @Override | 350 | @Override |
353 | public String saveUserInfo(String data) { | 351 | public UserWeixinDTO saveUserInfo(String data) { |
354 | 352 | ||
355 | log.info("result ====>> [{}]",data); | 353 | log.info("result ====>> [{}]",data); |
356 | 354 | ||
357 | JSONObject json = JSONObject.parseObject(data); | 355 | JSONObject json = JSONObject.parseObject(data); |
358 | String unionId = json.getString("unionid"); | 356 | String unionId = json.getString("unionid"); |
359 | String result = ""; | ||
360 | // 订阅号appid | 357 | // 订阅号appid |
361 | String appId = json.getString("dyAppid"); | 358 | String appId = json.getString("dyAppid"); |
362 | 359 | ||
... | @@ -369,40 +366,18 @@ public class UserOperationServiceImpl implements UserOperationService { | ... | @@ -369,40 +366,18 @@ public class UserOperationServiceImpl implements UserOperationService { |
369 | log.info("H5 save in redis contentJsonStr ====>> [{}]",contentJsonStr); | 366 | log.info("H5 save in redis contentJsonStr ====>> [{}]",contentJsonStr); |
370 | 367 | ||
371 | // 若未传dyAppId。不走下面的流程 | 368 | // 若未传dyAppId。不走下面的流程 |
372 | if (StrUtil.isNotBlank(appId)) | 369 | if (StrUtil.isNotBlank(appId)) { |
373 | result = this.checkWeiXinUserAndSubscribeStatus(appId,unionId); | 370 | UserWeixinDTO userWeixinDTO = this.findUserWeiXinByUnionIdAndAppId(unionId,appId); |
371 | return userWeixinDTO; | ||
372 | } | ||
374 | 373 | ||
375 | } catch (Exception e) { | 374 | } catch (Exception e) { |
376 | log.error(" saveUserInfo get an error || data: {} || msg: {} ", data, e.getMessage()); | 375 | log.error(" saveUserInfo get an error || data: {} || msg: {} ", data, e.getMessage()); |
377 | } | 376 | } |
378 | 377 | ||
379 | log.info("result ====>> [{}]",result); | 378 | return null; |
380 | return result; | ||
381 | } | ||
382 | |||
383 | |||
384 | |||
385 | /** | ||
386 | * 检查微信账户和关注状态 | ||
387 | * @param appId | ||
388 | * @param unionid | ||
389 | * @return | ||
390 | */ | ||
391 | private String checkWeiXinUserAndSubscribeStatus(String appId, String unionid) { | ||
392 | |||
393 | UserWeixinDTO userWeixinDTO = this.findUserWeiXinByUnionIdAndAppId(unionid,appId); | ||
394 | |||
395 | if (Objects.isNull(userWeixinDTO.getId())) { | ||
396 | return UNSUBSCRIBE; | ||
397 | } | ||
398 | |||
399 | Integer status = userWeixinDTO.getStatus(); | ||
400 | if (status == UNSUBSCRIBE_STATUS) { | ||
401 | return UNSUBSCRIBE; | ||
402 | } | 379 | } |
403 | 380 | ||
404 | return SUBSCRIBE; | ||
405 | } | ||
406 | 381 | ||
407 | /** | 382 | /** |
408 | * | 383 | * | ... | ... |
... | @@ -47,21 +47,27 @@ spring: | ... | @@ -47,21 +47,27 @@ spring: |
47 | file-size-threshold: 2KB | 47 | file-size-threshold: 2KB |
48 | max-file-size: 100MB | 48 | max-file-size: 100MB |
49 | max-request-size: 200MB | 49 | max-request-size: 200MB |
50 | # redis | ||
50 | redis: | 51 | redis: |
51 | #数据库索引 | 52 | #数据库索引 |
52 | database: 0 | 53 | database: 0 |
53 | host: 122.112.214.149 | 54 | host: 122.112.214.149 |
54 | # host: 139.196.4.234 | ||
55 | port: 6379 | 55 | port: 6379 |
56 | password: redis123 | 56 | password: redis123 |
57 | #连接超时时间 | 57 | #连接超时时间 |
58 | timeout: 5000 | 58 | timeout: 5000 |
59 | rabbitmq: | 59 | rabbitmq: |
60 | host: 139.196.145.150 # rabbitmq的连接地址 | 60 | # host: 139.196.145.150 # rabbitmq的连接地址 |
61 | # port: 5672 # rabbitmq的连接端口号 | ||
62 | # virtual-host: member_center # rabbitmq的虚拟host | ||
63 | # username: admin # rabbitmq的用户名 | ||
64 | # password: Topdraw1qaz # rabbitmq的密码 | ||
65 | # publisher-confirms: true #如果对异步消息需要回调必须设置为true | ||
66 | host: 122.112.214.149 # rabbitmq的连接地址 | ||
61 | port: 5672 # rabbitmq的连接端口号 | 67 | port: 5672 # rabbitmq的连接端口号 |
62 | virtual-host: member_center # rabbitmq的虚拟host | 68 | virtual-host: member_center # rabbitmq的虚拟hosthhh |
63 | username: admin # rabbitmq的用户名 | 69 | username: guest # rabbitmq的用户名 |
64 | password: Topdraw1qaz # rabbitmq的密码 | 70 | password: guest # rabbitmq的密码 |
65 | publisher-confirms: true #如果对异步消息需要回调必须设置为true | 71 | publisher-confirms: true #如果对异步消息需要回调必须设置为true |
66 | 72 | ||
67 | #jwt。依赖的common中有需要jwt的部分属性。 | 73 | #jwt。依赖的common中有需要jwt的部分属性。 | ... | ... |
-
Please register or sign in to post a comment