记录一些与小程序相关的内容,例如登录,发送订阅消息等
1. 登录相关
1.1. 获取openid
| |
| |
| |
| |
| |
| public String getOpenid(String code) { |
| String data = "appid=" + appid + "&" + |
| "secret=" + secret + "&" + |
| "js_code=" + code + "&" + |
| "grant_type=" + "authorization_code"; |
| JSONObject jsonObject = JSONObject.parseObject(HttpUtil.get("https://api.weixin.qq.com/sns/jscode2session?" + data)); |
| return jsonObject.getString("openid"); |
| } |
1.2. 登录
这块主要是获取openid后,查询是否存在与该openid绑定的账号,有则调用登录,返回登录信息,如果没有,则直接注册新用户
1.3. 获取手机号
手机号登录与openid直接登录相同,我这边写的是,先调用openid登录,如果当前用户未注册,则先不注册,将openid存入redis,返回openidToken,前端调起手机号选择,用户选择手机号后,调用手机号登录,将code与openidToken返回,后端获取手机号就可以获取到用户手机号了,现在可以创建新用户,存入openid与手机号
| public String getPhone(String code) { |
| |
| String appletToken = String.valueOf(getAccessToken()); |
| |
| Map<String,Object> paramMap = new HashMap<>(); |
| paramMap.put("code",code); |
| String res = HttpRequest.post("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + appletToken) |
| .header("Content-Type", "application/json").body(JSONUtils.toJSONString(paramMap)).execute().body(); |
| return JSONObject.parseObject(res).getJSONObject("phone_info").getString("phoneNumber"); |
| } |
| |
| public String getAccessToken() { |
| String result; |
| if (redisUtil.hasKey("AppletToken")) { |
| return redisUtil.get("AppletToken").toString(); |
| } |
| try { |
| String baseUrl = "https://api.weixin.qq.com/cgi-bin/token"; |
| HashMap<String, Object> requestParam = new HashMap<>(); |
| requestParam.put("grant_type", "client_credential"); |
| |
| requestParam.put("appid", appid); |
| |
| requestParam.put("secret", secret); |
| |
| result = HttpUtil.get(baseUrl, requestParam); |
| } catch (Exception e) { |
| throw new ServiceException(GENERATE_TOKEN_ERROR); |
| } |
| String token = JSON.parseObject(result).getString("access_token"); |
| |
| redisUtil.set("AppletToken", token, 100 * MyConstants.MINUTER); |
| return token; |
| } |
2. 发送订阅消息
2.1. 创建参数
| public Map<String, Object> createParams(String name,String phone,String time,String reason){ |
| Map<String, Object> objMap = new HashMap<>(5); |
| |
| Map<String, String> map = new HashMap<>(1); |
| map.put("value", name); |
| objMap.put("thing1", map); |
| |
| map = new HashMap<>(1); |
| map.put("value", phone); |
| objMap.put("phone_number7", map); |
| |
| map = new HashMap<>(1); |
| map.put("value", time); |
| objMap.put("time2", map); |
| |
| map = new HashMap<>(1); |
| map.put("value", reason); |
| objMap.put("thing11", map); |
| |
| return objMap; |
| } |
2.2. 发送订阅消息
| public void msgSend(String templateId, String page, Map<String, Object> data,String openId) { |
| try { |
| |
| String accessToken = getAccessToken(); |
| |
| String msgUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken; |
| |
| Map<String, Object> params = new HashMap<>(6); |
| |
| params.put("touser", openId); |
| |
| params.put("template_id", templateId); |
| |
| params.put("page", page); |
| params.put("lang", "zh_CN"); |
| params.put("miniprogram_state", "formal"); |
| |
| params.put("data", data); |
| String res = HttpRequest.post(msgUrl) |
| .header("Content-Type", "application/json") |
| |
| .body(JSONUtils.toJSONString(params)).execute().body(); |
| JSONObject msgResultObject = JSONObject.parseObject(res); |
| if (!"0".equals(msgResultObject.get("errcode").toString())) { |
| throw new RuntimeException("发送订阅消息失败," + msgResultObject.get("errmsg")); |
| } |
| } catch (Exception e) { |
| throw new RuntimeException("发送订阅消息失败," + e); |
| } |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步