首页 > 编程语言 >Springboot小程序相关

Springboot小程序相关

时间:2024-10-30 10:32:18浏览次数:1  
标签:map code Springboot 程序 token new put 相关 String

记录一些与小程序相关的内容,例如登录,发送订阅消息等

1. 登录相关

1.1. 获取openid

/**
* code:由小程序生成
* appid:小程序id
* secret:密钥
**/
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) {
        // 获取token
        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");
        // 小程序唯一凭证id appid
        requestParam.put("appid", appid);
        // 小程序 appSecret
        requestParam.put("secret", secret);
        // 发送GET请求读取调用微信接口获取openid用户唯一标识
        result = HttpUtil.get(baseUrl, requestParam);
    } catch (Exception e) {
        throw new ServiceException(GENERATE_TOKEN_ERROR);
    }
    String token = JSON.parseObject(result).getString("access_token");
    //将token存到redis,有效期100分钟。官方接口返回的token有效期120分钟
    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 {
            // getAccessToken()在上面有贴过,这里就不贴了,直接调用
            String accessToken = getAccessToken();
            // region 推送小程序信息
            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);
            // 这个templateId需要在微信公众号中创建模板,之后使用模板id发送,与短信类似
            params.put("template_id", templateId);
            // page则为用户收到消息后点击消息跳转的页面,例如/index
            params.put("page", page);
            params.put("lang", "zh_CN");
            params.put("miniprogram_state", "formal");
            // 模板参数,2.1调用生成后传入当前方法
            params.put("data", data);
            String res = HttpRequest.post(msgUrl)
                    .header("Content-Type", "application/json")
                    // 这个toJSONString很关键
                    .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);
        }
    }

标签:map,code,Springboot,程序,token,new,put,相关,String
From: https://www.cnblogs.com/eaglex3/p/18515300

相关文章

  • 微信小程序连接阿里云物联网平台
    物联网平台产品创建通过网盘分享的文件:微信小程序联网阿里云平台链接:https://pan.baidu.com/s/1MjP47pZeIQMpnoDKAA_vVA?pwd=BFDJ提取码:BFDJ1.www.baidu.com阿里云控制台,进去后可以先注册账号2.产品的创建----------物联网平台 创建产品  添加设备   ......
  • 【毕业设计】基于SpringBoot + Vue的物资综合管理系统
    现代企业管理中,如何高效地进行物资管理,确保数据的准确性和安全性,是一项重要的需求。传统的手工管理方式不仅耗时,还容易出错,无法满足信息化时代的高效要求。本文探讨了一种基于Java开发的物资综合管理系统,旨在提供一套高效、可靠的物资管理解决方案。一、项目背景与意义在信息......
  • 【毕业设计】基于SpringBoot + Vue的国产动漫网站
    在互联网与动漫产业迅速发展的今天,越来越多的用户期待能在专业网站上获取最新、最全的国产动漫信息。基于这一需求,本文档详细介绍了一个国产动漫网站的设计与实现过程。该项目通过Java语言和MySQL数据库构建,实现了用户与动漫资源间的互动,旨在为国产动漫爱好者提供一站式的信息......
  • 小白手把手教学怎么用maven创建一个Springboot项目
    spring_boot⼀个使⽤了SpringBoot的项⽬⼯程,本质上来说和只使⽤SpringFramework的⼯程是⼀样的,如果使⽤Maven来管理,那它就是个标准的Maven⼯程,⼤概的结构就像下⾯这样。|-pom.xml|-src|-main|-java|-resources|-test|-java|-......
  • 【JVM第4课】程序计数器
    Java程序计数器(ProgramCounterRegister)是Java虚拟机(JVM)运行数据区的一个组成部分。每个线程都有它自己的程序计数器,这部分内存用于存储该线程下一条要执行的字节码指令的地址。如果该方法为本地方法(NativeMethod),则程序计数器的值为未定义。特点:线程私有:每个线程都拥有独立的......
  • java计算机毕业设计在线票务系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,在线票务系统已经成为现代生活中不可或缺的一部分。传统的售票方式面临着排队等候、购票速度慢、安全性差等问题,而在线票务......
  • java计算机毕业设计员工管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景、意义和目的随着信息技术的迅猛发展,企业管理和运营的方式也在不断变革。传统的手工管理模式已经无法满足现代企业对效率、准确性和实时性的要求。特......
  • 揭秘 SpringBoot AOP:让你的代码更优雅、更高效
    引言在现代软件开发中,编写高效、可维护的代码是每个开发者的追求。SpringBoot作为一个强大的开发框架,不仅仅提供了快速开发的能力,还通过AOP(面向切面编程)让开发者能够以更优雅的方式处理横切关注点。本文将深入探讨SpringBootAOP的原理、应用场景以及如何通过AOP让你的......
  • Java毕业设计-基于Springboot框架的文学创作类社交论坛系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • Java毕业设计-基于Springboot框架的学生信息管理系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......