Эх сурвалжийг харах

提交微信小程序代码

zh 3 жил өмнө
parent
commit
6494ab3b39

+ 4 - 2
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java

@@ -17,8 +17,7 @@ import java.util.List;
  * @author ruoyi
  */
 @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
-public interface RemoteUserService
-{
+public interface RemoteUserService {
     /**
      * 通过用户名查询用户信息
      *
@@ -39,4 +38,7 @@ public interface RemoteUserService
 
     @PostMapping("/user/updateUnionId")
     public AjaxResult updateUnionId(@RequestBody SysUser sysUser);
+
+    @PostMapping("/user/selectUserByIds")
+    public AjaxResult selectUserByIds(@RequestBody List<Long> userIds);
 }

+ 10 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java

@@ -94,6 +94,8 @@ public class SysUser extends BaseEntity
 
     private String unionId;
 
+    private String openId;
+
     public SysUser()
     {
 
@@ -317,6 +319,14 @@ public class SysUser extends BaseEntity
         this.unionId = unionId;
     }
 
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 8 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/TemplateData.java

@@ -0,0 +1,8 @@
+package com.boman.domain;
+
+import lombok.Data;
+
+@Data
+public class TemplateData {
+    private Object value;
+}

+ 3 - 0
boman-auth/src/main/java/com/boman/auth/controller/TokenController.java

@@ -38,6 +38,7 @@ public class TokenController {
     @PostMapping("login")
     public R<?> login(@RequestBody LoginBody form) {
         String unionId = "";
+        String openId = "";
         // 验证是pc还是小程序
         if (form.getLogintype() != null && form.getLogintype().equals(WechatEnum.W.getValue())) {
             AjaxResult result = remoteWechatService.getWechatInfo(form);
@@ -49,6 +50,7 @@ public class TokenController {
                 throw new BaseException("未获取到微信鉴权相关信息!");
             }
             unionId = (String) jsonObject.get("unionid");
+            openId = (String) jsonObject.get("openId");
         }
         // 用户登录
         LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
@@ -59,6 +61,7 @@ public class TokenController {
             SysUser sysUser = new SysUser();
             sysUser.setId(userInfo.getUserid());
             sysUser.setUnionId(unionId);
+            sysUser.setOpenId(openId);
             AjaxResult updateResult = sysLoginService.updateUnionId(sysUser);
             if((Integer) updateResult.get(AjaxResult.CODE_TAG) != 0) {
                 throw new BaseException("保存小程序唯一标识出错!");

+ 8 - 0
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysUserController.java

@@ -293,4 +293,12 @@ public class SysUserController extends BaseController {
     public AjaxResult listUserTree(SysDept dept) {
         return AjaxResult.success(userService.listUserTree(dept));
     }
+
+    /**
+     * 获取用户列表
+     */
+    @PostMapping("/selectUserByIds")
+    public AjaxResult selectUserByIds(@RequestBody List<Long> ids) {
+        return AjaxResult.success(userService.selectUserByIds(ids));
+    }
 }

+ 2 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/ISysUserService.java

@@ -45,6 +45,8 @@ public interface ISysUserService
      */
     public AjaxResult updateUnionId(SysUser sysUser);
 
+    public List<SysUser> selectUserByIds(List<Long> ids);
+
     /**
      * 根据用户ID查询用户所属角色组
      * 

+ 5 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java

@@ -80,6 +80,11 @@ public class SysUserServiceImpl implements ISysUserService
         return userMapper.selectUserList(user);
     }
 
+    @Override
+    public List<SysUser> selectUserByIds(List<Long> ids) {
+        return userMapper.selectUserByUserIds(ids);
+    }
+
     /**
      * 通过用户名查询用户
      * 

+ 4 - 2
boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -23,6 +23,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="updateBy"     column="update_by"    />
 		<result property="updateTime"   column="update_time"  />
 		<result property="remark"       column="remark"       />
+		<result property="open_id"       column="openId"       />
+		<result property="union_id"       column="unionId"       />
 		<association property="dept"    column="dept_id" javaType="com.boman.domain.SysDept" resultMap="deptResult" />
 		<collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
 	</resultMap>
@@ -47,7 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	
 	<sql id="selectUserVo">
         select u.id, u.union_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
-        d.id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
+        d.id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,u.open_id,
         r.id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
 		    left join sys_dept d on u.dept_id = d.id
@@ -142,7 +144,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</insert>
 
 	<update id="updateUnionId" parameterType="com.boman.domain.SysUser">
-		update sys_user set union_id = #{unionId} where id = #{id}
+		update sys_user set union_id = #{unionId},open_id = #{openId} where id = #{id}
 	</update>
 
 	

+ 31 - 0
boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java

@@ -18,6 +18,13 @@ public class WechatProperties {
     @Value("${auth.wechat.grantType}")
     private String grantType;
 
+    @Value("${auth.wechat.template_id}")
+    private String templateId;
+    @Value("${auth.wechat.access_token_url}")
+    private String accessTokenUrl;
+    @Value("${auth.wechat.msg_url}")
+    private String msgUrl;
+
 
     public String getHost() {
         return host;
@@ -50,4 +57,28 @@ public class WechatProperties {
     public void setGrantType(String grantType) {
         this.grantType = grantType;
     }
+
+    public String getTemplateId() {
+        return templateId;
+    }
+
+    public void setTemplateId(String templateId) {
+        this.templateId = templateId;
+    }
+
+    public String getAccessTokenUrl() {
+        return accessTokenUrl;
+    }
+
+    public void setAccessTokenUrl(String accessTokenUrl) {
+        this.accessTokenUrl = accessTokenUrl;
+    }
+
+    public String getMsgUrl() {
+        return msgUrl;
+    }
+
+    public void setMsgUrl(String msgUrl) {
+        this.msgUrl = msgUrl;
+    }
 }

+ 16 - 0
boman-wechat/src/main/java/com/boman/wechat/dto/WxMssVo.java

@@ -0,0 +1,16 @@
+package com.boman.wechat.dto;
+
+import com.boman.domain.TemplateData;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class WxMssVo {
+    private String touser;//用户openid
+    private String template_id;//模版id
+    private String page = "index";//默认跳到小程序首页
+    private String form_id;//收集到的用户formid
+    private String emphasis_keyword = "keyword1.DATA";//放大那个推送字段
+    private Map<String, TemplateData> data;//推送文字
+}

+ 10 - 0
boman-wechat/src/main/java/com/boman/wechat/service/WxPushService.java

@@ -0,0 +1,10 @@
+package com.boman.wechat.service;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WxPushService {
+
+    public String pushToUser(List<Long> userIds, Map<String, Object> params);
+
+}

+ 93 - 0
boman-wechat/src/main/java/com/boman/wechat/service/impl/WxPushServiceImpl.java

@@ -0,0 +1,93 @@
+package com.boman.wechat.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.utils.StringUtils;
+import com.boman.domain.SysUser;
+import com.boman.domain.TemplateData;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.system.api.RemoteUserService;
+import com.boman.wechat.config.WechatProperties;
+import com.boman.wechat.dto.WxMssVo;
+import com.boman.wechat.service.WxPushService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class WxPushServiceImpl implements WxPushService {
+    private static final Logger logger = LoggerFactory.getLogger(WxPushServiceImpl.class);
+
+    //用来请求微信的get和post
+    @Autowired
+    private RestTemplate restTemplate;
+    @Autowired
+    private WechatProperties properties;
+    @Autowired
+    private RemoteUserService remoteUserService;
+
+    /**
+     * 微信小程序推送给用户
+     */
+    @Override
+    public String pushToUser(List<Long> userIds, Map<String, Object> params) {
+        String templateId = properties.getTemplateId();
+
+        //获取access_token
+        String accessToken = getAccessToken(properties.getAppId(), properties.getSecret());
+        if(StringUtils.isEmpty(accessToken)) {
+            return "获取access_token失败";
+        }
+
+        String url = properties.getMsgUrl() + "?access_token=" + accessToken;
+        AjaxResult result = remoteUserService.selectUserByIds(userIds);
+        List<SysUser> users = (List<SysUser>) result.get("data");
+        if(users == null || users.size() <= 0) {
+            return "推送失败,没有选择推送人员";
+        }
+        List<WxMssVo> vos = new ArrayList<>();
+        for(SysUser user : users) {
+            if(StringUtils.isEmpty(user.getOpenId())) {
+                continue;
+            }
+            //拼接推送的模版
+            WxMssVo wxMssVo = new WxMssVo();
+            wxMssVo.setTouser(user.getOpenId());//用户openid
+            wxMssVo.setTemplate_id(templateId);//模版id
+            Map<String, TemplateData> msgMap = new HashMap<>(5);
+            for(String key : params.keySet()) {
+                TemplateData templateData = new TemplateData();
+                templateData.setValue(params.get(key));
+                msgMap.put(key, templateData);
+            }
+            wxMssVo.setData(msgMap);
+            vos.add(wxMssVo);
+        }
+
+        if(vos.size() == 0) {
+            return "没有可发送的用户,请确认所选用户是否订阅消息!";
+        }
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, vos, String.class);
+        logger.error("小程序推送结果={}", responseEntity.getBody());
+        return responseEntity.getBody();
+    }
+
+    /*
+     * 获取access_token
+     * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
+     * */
+    private String getAccessToken(String appid, String appsecret) {
+        //获取access_token
+        String url = properties.getAccessTokenUrl() + "&appid=" + properties.getAppId() + "&secret=" + properties.getSecret();
+        String json = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        return (String) jsonObject.get("access_token");
+    }
+}

+ 4 - 1
boman-wechat/src/main/resources/application.properties

@@ -1,4 +1,7 @@
 auth.wechat.sessionHost=https://api.weixin.qq.com/sns/jscode2session
+auth.wechat.msg_url=https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send
+auth.wechat.access_token_url=https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential
 auth.wechat.appId=wxf556d2b0c34da8cf
 auth.wechat.secret=8f90a52972268f82d5017a2ac29650c4
-auth.wechat.grantType=authorization_code
+auth.wechat.grantType=authorization_code
+auth.wechat.template_id=LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24