Commit 7f87f26f3a09fbcba5dfca7fa51af9362605aa13
1 parent
b917d92a
【代码评审】SYSTEM:微信小程序的订阅消息
Showing
9 changed files
with
31 additions
and
14 deletions
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java
| @@ -15,7 +15,10 @@ public interface MessageTemplateConstants { | @@ -15,7 +15,10 @@ public interface MessageTemplateConstants { | ||
| 15 | 15 | ||
| 16 | //======================= 订阅消息模版 ======================= | 16 | //======================= 订阅消息模版 ======================= |
| 17 | 17 | ||
| 18 | + // TODO @puhui999:建议 TRADE_AFTER_SALE_CHANGE | ||
| 18 | String ORDER_AFTERSALE_CHANGE = "售后进度通知"; | 19 | String ORDER_AFTERSALE_CHANGE = "售后进度通知"; |
| 20 | + | ||
| 21 | + // TODO @puhui999:是不是改成 PAY_WALLET_CHANGE 放在 PAY 模块 | ||
| 19 | String MONEY_CHANGE = "充值成功通知"; | 22 | String MONEY_CHANGE = "充值成功通知"; |
| 20 | 23 | ||
| 21 | } | 24 | } |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java
| @@ -8,10 +8,7 @@ import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; | @@ -8,10 +8,7 @@ import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; | ||
| 8 | import cn.iocoder.yudao.module.member.controller.app.social.vo.*; | 8 | import cn.iocoder.yudao.module.member.controller.app.social.vo.*; |
| 9 | import cn.iocoder.yudao.module.system.api.social.SocialClientApi; | 9 | import cn.iocoder.yudao.module.system.api.social.SocialClientApi; |
| 10 | import cn.iocoder.yudao.module.system.api.social.SocialUserApi; | 10 | import cn.iocoder.yudao.module.system.api.social.SocialUserApi; |
| 11 | -import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; | ||
| 12 | -import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO; | ||
| 13 | -import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; | ||
| 14 | -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; | 11 | +import cn.iocoder.yudao.module.system.api.social.dto.*; |
| 15 | import io.swagger.v3.oas.annotations.Operation; | 12 | import io.swagger.v3.oas.annotations.Operation; |
| 16 | import io.swagger.v3.oas.annotations.Parameter; | 13 | import io.swagger.v3.oas.annotations.Parameter; |
| 17 | import io.swagger.v3.oas.annotations.tags.Tag; | 14 | import io.swagger.v3.oas.annotations.tags.Tag; |
| @@ -74,7 +71,8 @@ public class AppSocialUserController { | @@ -74,7 +71,8 @@ public class AppSocialUserController { | ||
| 74 | @GetMapping("/get-subscribe-template") | 71 | @GetMapping("/get-subscribe-template") |
| 75 | @Operation(summary = "获得微信小程订阅模板") | 72 | @Operation(summary = "获得微信小程订阅模板") |
| 76 | public CommonResult<List<AppSocialWxSubscribeTemplateRespVO>> getSubscribeTemplate() { | 73 | public CommonResult<List<AppSocialWxSubscribeTemplateRespVO>> getSubscribeTemplate() { |
| 77 | - return success(BeanUtils.toBean(socialClientApi.getSubscribeTemplate(), AppSocialWxSubscribeTemplateRespVO.class)); | 74 | + List<SocialWxSubscribeTemplateRespDTO> template = socialClientApi.getSubscribeTemplate(); |
| 75 | + return success(BeanUtils.toBean(template, AppSocialWxSubscribeTemplateRespVO.class)); | ||
| 78 | } | 76 | } |
| 79 | 77 | ||
| 80 | } | 78 | } |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java
| @@ -7,19 +7,22 @@ import lombok.Data; | @@ -7,19 +7,22 @@ import lombok.Data; | ||
| 7 | @Data | 7 | @Data |
| 8 | public class AppSocialWxSubscribeTemplateRespVO { | 8 | public class AppSocialWxSubscribeTemplateRespVO { |
| 9 | 9 | ||
| 10 | - @Schema(description = "添加至账号下的模板 id,发送小程序订阅消息时所需", requiredMode = Schema.RequiredMode.REQUIRED, example = "9Aw5ZV1j9xdWTFEkqCpZ7mIBbSC34khK55OtzUPl0rU") | 10 | + // TODO @puhui999:是不是使用 id 作为字段,更干净些哈; |
| 11 | + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, | ||
| 12 | + example = "9Aw5ZV1j9xdWTFEkqCpZ7mIBbSC34khK55OtzUPl0rU") | ||
| 11 | private String priTmplId; | 13 | private String priTmplId; |
| 12 | 14 | ||
| 13 | @Schema(description = "模版标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单支付通知") | 15 | @Schema(description = "模版标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单支付通知") |
| 14 | private String title; | 16 | private String title; |
| 15 | 17 | ||
| 16 | - @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED) | 18 | + @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED, |
| 19 | + example = "{ {result.DATA} }\\n\\n领奖金额:{ {withdrawMoney.DATA} }\\n领奖时间: { {withdrawTime.DATA} }") | ||
| 17 | private String content; | 20 | private String content; |
| 18 | 21 | ||
| 19 | @Schema(description = "模板内容示例", requiredMode = Schema.RequiredMode.REQUIRED, example = "下单时间:2016年8月8日") | 22 | @Schema(description = "模板内容示例", requiredMode = Schema.RequiredMode.REQUIRED, example = "下单时间:2016年8月8日") |
| 20 | private String example; | 23 | private String example; |
| 21 | 24 | ||
| 22 | - @Schema(description = "模版类型,2 为一次性订阅,3 为长期订阅", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | ||
| 23 | - private Integer type; | 25 | + @Schema(description = "模版类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| 26 | + private Integer type; // 2 为一次性订阅,3 为长期订阅 | ||
| 24 | 27 | ||
| 25 | } | 28 | } |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java
| @@ -57,7 +57,7 @@ public interface SocialClientApi { | @@ -57,7 +57,7 @@ public interface SocialClientApi { | ||
| 57 | List<SocialWxSubscribeTemplateRespDTO> getSubscribeTemplate(); | 57 | List<SocialWxSubscribeTemplateRespDTO> getSubscribeTemplate(); |
| 58 | 58 | ||
| 59 | /** | 59 | /** |
| 60 | - * 发送订阅消息 | 60 | + * 发送微信小程序订阅消息 |
| 61 | * | 61 | * |
| 62 | * @param reqDTO 请求 | 62 | * @param reqDTO 请求 |
| 63 | */ | 63 | */ |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java
| @@ -6,6 +6,7 @@ import lombok.Data; | @@ -6,6 +6,7 @@ import lombok.Data; | ||
| 6 | import java.util.ArrayList; | 6 | import java.util.ArrayList; |
| 7 | import java.util.List; | 7 | import java.util.List; |
| 8 | 8 | ||
| 9 | +// TODO @puhui99:1)参考 SocialWxQrcodeReqDTO,可以 @see 文档。这样,注释会更见见一点。2)是不是少了 Send:SocialWxSubscribeMessageSendReqDTO | ||
| 9 | /** | 10 | /** |
| 10 | * 微信小程序订阅消息 Request DTO | 11 | * 微信小程序订阅消息 Request DTO |
| 11 | * | 12 | * |
| @@ -14,6 +15,7 @@ import java.util.List; | @@ -14,6 +15,7 @@ import java.util.List; | ||
| 14 | @Data | 15 | @Data |
| 15 | public class SocialWxSubscribeMessageReqDTO { | 16 | public class SocialWxSubscribeMessageReqDTO { |
| 16 | 17 | ||
| 18 | + // TODO @puhui999:参数校验 | ||
| 17 | /** | 19 | /** |
| 18 | * 接收者(用户)的 openid. | 20 | * 接收者(用户)的 openid. |
| 19 | * <pre> | 21 | * <pre> |
| @@ -58,6 +60,7 @@ public class SocialWxSubscribeMessageReqDTO { | @@ -58,6 +60,7 @@ public class SocialWxSubscribeMessageReqDTO { | ||
| 58 | */ | 60 | */ |
| 59 | private String lang; | 61 | private String lang; |
| 60 | 62 | ||
| 63 | + // TODO @puhui999:是必须 List<KeyValue<String, String>>,还是 Map<String, String 即可) | ||
| 61 | /** | 64 | /** |
| 62 | * 模板内容,不填则下发空模板. | 65 | * 模板内容,不填则下发空模板. |
| 63 | * <pre> | 66 | * <pre> |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java
| @@ -11,6 +11,7 @@ import lombok.Data; | @@ -11,6 +11,7 @@ import lombok.Data; | ||
| 11 | @Data | 11 | @Data |
| 12 | public class SocialWxSubscribeTemplateRespDTO { | 12 | public class SocialWxSubscribeTemplateRespDTO { |
| 13 | 13 | ||
| 14 | + // TODO @puhui999:建议搞成 id | ||
| 14 | /** | 15 | /** |
| 15 | * 添加至账号下的模板 id,发送小程序订阅消息时所需 | 16 | * 添加至账号下的模板 id,发送小程序订阅消息时所需 |
| 16 | */ | 17 | */ |
| @@ -31,8 +32,12 @@ public class SocialWxSubscribeTemplateRespDTO { | @@ -31,8 +32,12 @@ public class SocialWxSubscribeTemplateRespDTO { | ||
| 31 | */ | 32 | */ |
| 32 | private String example; | 33 | private String example; |
| 33 | 34 | ||
| 35 | + // TODO @puhui999:这个在 wxjava 里面,有枚举字段么? | ||
| 34 | /** | 36 | /** |
| 35 | - * 模版类型,2 为一次性订阅,3 为长期订阅 | 37 | + * 模版类型 |
| 38 | + * | ||
| 39 | + * 2 为一次性订阅 | ||
| 40 | + * 3 为长期订阅 | ||
| 36 | */ | 41 | */ |
| 37 | private Integer type; | 42 | private Integer type; |
| 38 | 43 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java
| @@ -72,6 +72,7 @@ public class SocialClientController { | @@ -72,6 +72,7 @@ public class SocialClientController { | ||
| 72 | 72 | ||
| 73 | //======================= TODO 测试发送订阅消息 ======================= | 73 | //======================= TODO 测试发送订阅消息 ======================= |
| 74 | 74 | ||
| 75 | + // TODO @puhui999:这个接口,其实可以留着。然后把参数挪到 .http 文件。先直接用 SocialWxSubscribeMessageReqDTO 接参数 | ||
| 75 | @PostMapping("/send-subscribe-message") | 76 | @PostMapping("/send-subscribe-message") |
| 76 | public void testSendSubscribeMessage() { | 77 | public void testSendSubscribeMessage() { |
| 77 | SocialWxSubscribeMessageReqDTO reqDTO = new SocialWxSubscribeMessageReqDTO().setLang("zh_CN") | 78 | SocialWxSubscribeMessageReqDTO reqDTO = new SocialWxSubscribeMessageReqDTO().setLang("zh_CN") |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java
| @@ -81,7 +81,7 @@ public interface SocialClientService { | @@ -81,7 +81,7 @@ public interface SocialClientService { | ||
| 81 | List<TemplateInfo> getSubscribeTemplate(); | 81 | List<TemplateInfo> getSubscribeTemplate(); |
| 82 | 82 | ||
| 83 | /** | 83 | /** |
| 84 | - * 发送订阅消息 | 84 | + * 发送微信小程序订阅消息 |
| 85 | * | 85 | * |
| 86 | * @param reqDTO 请求 | 86 | * @param reqDTO 请求 |
| 87 | */ | 87 | */ |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java
| @@ -236,6 +236,7 @@ public class SocialClientServiceImpl implements SocialClientService { | @@ -236,6 +236,7 @@ public class SocialClientServiceImpl implements SocialClientService { | ||
| 236 | try { | 236 | try { |
| 237 | return service.getUserService().getPhoneNoInfo(phoneCode); | 237 | return service.getUserService().getPhoneNoInfo(phoneCode); |
| 238 | } catch (WxErrorException e) { | 238 | } catch (WxErrorException e) { |
| 239 | + // TODO @puhui999:这里的日志,reqDTO 要打进去 | ||
| 239 | log.error("[getPhoneNoInfo][userType({}) phoneCode({}) 获得手机号失败]", userType, phoneCode, e); | 240 | log.error("[getPhoneNoInfo][userType({}) phoneCode({}) 获得手机号失败]", userType, phoneCode, e); |
| 240 | throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR); | 241 | throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR); |
| 241 | } | 242 | } |
| @@ -262,11 +263,12 @@ public class SocialClientServiceImpl implements SocialClientService { | @@ -262,11 +263,12 @@ public class SocialClientServiceImpl implements SocialClientService { | ||
| 262 | 263 | ||
| 263 | @Override | 264 | @Override |
| 264 | public List<TemplateInfo> getSubscribeTemplate() { | 265 | public List<TemplateInfo> getSubscribeTemplate() { |
| 266 | + // TODO @puhui999:这个 userType 最好通过参数,传递过来;然后这个方法名,貌似叫 getSubscribeTemplateList 更合适哈; | ||
| 265 | WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); | 267 | WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); |
| 266 | try { | 268 | try { |
| 267 | WxMaSubscribeService subscribeService = service.getSubscribeService(); | 269 | WxMaSubscribeService subscribeService = service.getSubscribeService(); |
| 268 | return subscribeService.getTemplateList(); | 270 | return subscribeService.getTemplateList(); |
| 269 | - }catch (WxErrorException e) { | 271 | + } catch (WxErrorException e) { |
| 270 | log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e); | 272 | log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e); |
| 271 | throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR); | 273 | throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR); |
| 272 | } | 274 | } |
| @@ -274,13 +276,15 @@ public class SocialClientServiceImpl implements SocialClientService { | @@ -274,13 +276,15 @@ public class SocialClientServiceImpl implements SocialClientService { | ||
| 274 | 276 | ||
| 275 | @Override | 277 | @Override |
| 276 | public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) { | 278 | public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) { |
| 279 | + // TODO @puhui999:这个 userType 最好通过参数, | ||
| 277 | WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); | 280 | WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); |
| 278 | try { | 281 | try { |
| 279 | WxMaSubscribeService subscribeService = service.getSubscribeService(); | 282 | WxMaSubscribeService subscribeService = service.getSubscribeService(); |
| 280 | WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class); | 283 | WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class); |
| 281 | reqDTO.getMessages().forEach(item-> message.addData(new WxMaSubscribeMessage.MsgData(item.getKey(), item.getValue()))); | 284 | reqDTO.getMessages().forEach(item-> message.addData(new WxMaSubscribeMessage.MsgData(item.getKey(), item.getValue()))); |
| 282 | subscribeService.sendSubscribeMsg(message); | 285 | subscribeService.sendSubscribeMsg(message); |
| 283 | - }catch (WxErrorException e) { | 286 | + } catch (WxErrorException e) { |
| 287 | + // TODO @puhui999:这里的日志,reqDTO 要打进去 | ||
| 284 | log.error("[sendSubscribeMessage][发送小程序订阅消息]", e); | 288 | log.error("[sendSubscribeMessage][发送小程序订阅消息]", e); |
| 285 | throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR); | 289 | throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR); |
| 286 | } | 290 | } |