Java实现小程序基础开发

这篇具有很好参考价值的文章主要介绍了Java实现小程序基础开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java实现小程序基础开发

描述

继上篇Java整合公众号基本功能实现,现继续完善与公众号管理绑定的小程序功能开发
实现公众号与小程序配套使用
现实现小程序的注册,手机号授权登录,Jsapi授权、小程序与公众号关系

小程序配置类

@Configuration
@RequiredArgsConstructor
@ConditionalOnClass(WxMaService.class)
@EnableConfigurationProperties()
public class WxMaConfiguration {
    private final MiniappConfigMapper miniappConfigMapper;
    /**
     * 默认配置
     */
    private static Map<String, WxMaService> wxMaServices = new HashMap<>();
    /**
     * jsapi配置
     */
    private static Map<String, WxMaJsapiService> WxMaJsapiServices = new HashMap<>();
    /**
     * 用户配置(获取用户客户代码)
     */
    private static Map<String, Integer> MINI_USER_CONF = new HashMap<>();

    public static Map<String, WxMaService> getMpServices() {
        return wxMaServices;
    }

    public static Integer getCustomId(String appid) {
        return MINI_USER_CONF.get(appid);
    }

    public static Map<String, WxMaJsapiService> getWxMaJsapiServices() {
        return WxMaJsapiServices;
    }
    
    /**
     * 小程序多客户
     * @return
     */
    @Bean
    public Object mpServices() {
        List<MiniappConfig> blueWxConfigs = miniappConfigMapper.selectList(Wrappers.emptyWrapper());
        for (MiniappConfig a : blueWxConfigs) {
            WxMaDefaultConfigImpl configStorage = new WxMaDefaultConfigImpl();
            configStorage.setAppid(a.getAppid());
            configStorage.setSecret(a.getSecret());
            configStorage.setToken(a.getToken());
            configStorage.setAesKey(a.getAeskey());
            configStorage.setMsgDataFormat(a.getMsgDataFormat());
            WxMaService service = new WxMaServiceImpl();
            service.setWxMaConfig(configStorage);
            WxMaJsapiService wxMaJsapiService = new WxMaJsapiServiceImpl(service);
            wxMaServices.put(a.getCustomerCode() + ":" + a.getAppid(), service);
            WxMaJsapiServices.put(a.getCustomerCode() + ":" + a.getAppid(), wxMaJsapiService);
            MINI_USER_CONF.put(a.getAppid(), a.getCustomerId());
        }
        return Boolean.TRUE;
    }
}

Jsapi签名

/**
 * 微信小程序获取jsapi签名
 */
@Slf4j
@RestController
@RequestMapping(value = "/miniapp/jsapi",produces = MediaType.APPLICATION_JSON_VALUE)
public class MiniappJsApiController {

	/**
     * 消息处理
     */
    @GetMapping(value = "/{customCode}")
    public WxJsapiSignature authGet(@PathVariable("customCode") String customCode,
                          @RequestParam(name = "url") String url) {
         WxJsapiSignature jsapiSignature = null;
        try {
            log.info("接收到获取接口,customCode=[{}],url=[{}]", customCode, url);
            if (customCode == null || StringUtil.isAnyBlank(url)) {
                log.error("请求参数非法,请核实!");
                return jsapiSignature;
            }
            WxMaJsapiService wxMaJsapiService = WxMaConfiguration.getWxMaJsapiServices().get(customCode);
            if (wxMaJsapiService == null) {
                log.error("没有找到该客户的配置,customCode=[{}]", customCode);
                return jsapiSignature;
            }
            jsapiSignature = wxMaJsapiService.createJsapiSignature(url);
        } catch (Exception e) {
            log.error("WxJsApiController authGet 失败{}", ExceptionUtil.getStackTraceAsString(e));
        }
        return jsapiSignature ;
    }
}

小程序入口

/**
 * 小程序入口
 */
@Slf4j
@RestController
@RequestMapping(value = "/miniapp/portal",produces = MediaType.APPLICATION_JSON_VALUE)
public class MiniappPortalController {

	@GetMapping(value = "/{customCode}", produces = "text/plain;charset=utf-8")
    public String authGet(@PathVariable("customCode") String customCode,
                          @RequestParam(name = "signature", required = false) String signature,
                          @RequestParam(name = "timestamp", required = false) String timestamp,
                          @RequestParam(name = "nonce", required = false) String nonce,
                          @RequestParam(name = "echostr", required = false) String echostr) {
        log.info("\n接收到来自微信服务器的认证消息:signature = [{}], timestamp = [{}], nonce = [{}], echostr = [{}]",
                signature, timestamp, nonce, echostr);
                if (StringUtil.isAnyBlank(signature, timestamp, nonce, echostr)) {
            throw new IllegalArgumentException("请求参数非法,请核实!");
        }
        if (customCode == null) {
            customCode = "";
        }
        if (WxMaConfiguration.getMpServices().get(customCode).checkSignature(timestamp, nonce, signature)) {
            return echostr;
        }
        return "非法请求";
    }


	@PostMapping(value = "/{customCode}", produces = "application/xml; charset=UTF-8")
    public String post(@PathVariable("customCode") String customCode,
                       @RequestBody String requestBody,
                       @RequestParam("msg_signature") String msgSignature,
                       @RequestParam("encrypt_type") String encryptType,
                       @RequestParam("signature") String signature,
                       @RequestParam("timestamp") String timestamp,
                       @RequestParam("nonce") String nonce) {
        log.info("\n接收微信请求:[msg_signature=[{}], encrypt_type=[{}], signature=[{}]," +
                        " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
                msgSignature, encryptType, signature, timestamp, nonce, requestBody);
        if (customCode == null) {
            customCode = "";
        }
        final boolean isJson = Objects.equals(WxMaConfiguration.getMpServices().get(customCode).getWxMaConfig().getMsgDataFormat(),
                WxMaConstants.MsgDataFormat.JSON);
        if (StringUtil.isBlank(encryptType)) {
            // 明文传输的消息
            WxMaMessage inMessage;
            if (isJson) {
                inMessage = WxMaMessage.fromJson(requestBody);
            } else {//xml
                inMessage = WxMaMessage.fromXml(requestBody);
            }
            System.out.println(inMessage);
            return "success";
        }
        if ("aes".equals(encryptType)) {
        	WxMaMessage inMessage;
            if (isJson) {
                inMessage = WxMaMessage.fromEncryptedJson(requestBody, WxMaConfiguration.getMpServices().get(1).getWxMaConfig());
            } else {//xml
                inMessage = WxMaMessage.fromEncryptedXml(requestBody, WxMaConfiguration.getMpServices().get(1).getWxMaConfig(),
                        timestamp, nonce, msgSignature);
            }
            return "success";
        }
        throw new RuntimeException("不可识别的加密类型:" + encryptType);
    }
}

小程序登录

/**
 * 小程序登录入口
 **/
@RequiredArgsConstructor
@Slf4j
@RestController
@RequestMapping(value = "/miniapp/login", produces = MediaType.APPLICATION_JSON_VALUE)
public class MiniappLoginController {

    /**
     * code登录,只要先拿到微信的sessionKey
     *
     * @param code 微信code
     */
    @ClearAuth
    @GetMapping("/codeLogin")
    public OMiniappLoginVO codeLogin(@RequestParam("code") String code,
                                     @RequestParam(value = "appid", required = false) String appid) {
        OMiniappLoginVO oMiniappLoginVO = new OMiniappLoginVO();
        // 通过code调用微信个人信息接口
        WxMaJscode2SessionResult session = null;
        WxMaService wxMaService = WxMaConfiguration.getMpServices().get(MiniappConstant.PARENT_CODE + ":" + appid);
        session = wxMaService.getUserService().getSessionInfo(code);
        log.info("获取结果为:{}", JSONObject.toJSONString(session));
        String sessionKey = session.getSessionKey();
        //获取微信的openId
        String openId = session.getOpenid();
        //获取微信的unionId,这个和公众号的unionId是一样的,所以可以根据这个来获取公众号用户来确定绑定关系
        String unionId = session.getUnionid();
        Integer customId = WxMaConfiguration.getCustomId(appid);
        //查看是否绑定过
        MiniappUserParent bindUserParent = miniappUserParentMapper.selectOneByOpenId(openId, customId);
        //这个miniappId业务上自行处理,这个主要是记录使用小程序的记录用户,与业务平台的用户一个绑定关系,可以通过这个来关联处理
        Long miniappId = null;
        MpUserParent mpUserParent = mpUserParentMapper.selectOneByUnionId(unionId);
		if (bindUserParent == null) {
            MiniappUserParent miniappUserParent = getMiniappUserParent(unionId, appid);
            miniappUserParent.setOpenId(openId);
            miniappUserParentMapper.insert(miniappUserParent);
            miniappId = miniappUserParent.getMiniappId();
        } else {
            miniappId = bindUserParent.getMiniappId();
        }
        String sessionId = IdUtil.fastSimpleUUID();
		oMiniappLoginVO.setSessionId(sessionId);
        oMiniappLoginVO.setSessionKey(sessionKey);
        return oMiniappLoginVO;
    }


    /**
     * 手机号码授权登录(先调上面的接口,拿到sessionKey)
     *
     * @param iMiniappPhoneLoginVO 机密数据
     * * @param encryptedData  机密数据
     * * @param iv   iv数据
     * * @param appid  
     * @return
     */
    @PostMapping("/phoneLogin.json")
    public void phone(@Valid @RequestBody IPhoneLoginVO iPhoneLoginVO) {
        MiniappUserDTO userDTO = UserUtil.getUser();
        String sessionKey = userDTO.getSessionKey();
        Long miniappId = userDTO.getMiniappId();
        String sessionId = miniappUser.getSessionId();
        String thirdBindingId = iMiniappPhoneLoginVO.getThirdBindingId();
        String appKey = null;
        String encryptedData = iMiniappPhoneLoginVO.getEncryptedData();
        String iv = iMiniappPhoneLoginVO.getIv();
        log.info("encryptedData={},iv={},sessionKey={}", encryptedData, iv, sessionKey);
        String appid = iMiniappPhoneLoginVO.getAppid();
        //获取缓存的数据
        WxMaService wxMaService = WxMaConfiguration.getMpServices().get(MiniappConstant.PARENT_CODE + ":" + appid);
        //解密
        WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);
        log.info("phoneNoInfo数据:{}", phoneNoInfo);
        //获取手机号
        String phone = phoneNoInfo.getPhoneNumber();
        /判断该手机号有没注册过,如果有直接进行一个绑定,没有新增
        AppUserDTO appUserDTO = appUserMapper.selectByPhone(phone);
        if (appUserDTO != null) {
        
        } else {
        
        }
    }
}

文章来源地址https://www.toymoban.com/news/detail-771895.html

到了这里,关于Java实现小程序基础开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java实现微信小程序登录(服务端)

            微信小程序的登录,这里只涉及到后端代码,所以默认你是申请了一个小程序并且有了appid和secret。不管怎么说,还是放上官方的文档链接: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html https://links.jianshu.com/go?to=https%3A%2F%2Fdevelopers.weixin.qq.com%2Fminipr

    2024年02月01日
    浏览(35)
  • 使用Java实现微信小程序订阅消息

    首先到微信小程序的官网,选择合适自己的订阅消息模板。 寻找到适合自己的模板之后,记住模板ID,点开详情,记住每个字段id 微信小程序订阅消息官网文档介绍地址:小程序订阅消息 | 微信开放文档 (qq.com) 微信小程序订阅消息接口:发送订阅消息 | 微信开放文档 (qq.com

    2024年02月03日
    浏览(46)
  • 基于Java+微信小程序实现《医院管理系统小程序》

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到哟 2022-2024年

    2024年02月06日
    浏览(47)
  • 基于java微信小程序商城系统设计与实现

    开发概要 小程序开发:微信开发者工具(MINA框架) 后台环境:JDK1.8 + Tomcat8 后台开发语言:Java 后台开发框架:springboot 后台模板引擎:Thymeleaf 后台开发工具:Idea2020 数据库:mysql8 数据库管理工具:navicat 其他开发语言:html + css +javascript

    2024年02月11日
    浏览(43)
  • 微信小程序: java实现获取手机号方式

    目录 1. 现在比较简单的方式 - 接口名 --- 功能描述 - 调用方式 --- HTTPS 调用 --- 第三方调用 --- 请求参数 --- 返回参数 2. 实现方式 1. 加入fastjson依赖  2. http请求类 3. Json串工具类 4.接口方法 3.另外介绍一点access_token 微信官方文档介绍:  getPhoneNumber --- 功能描述 该接口需配合手机

    2024年02月16日
    浏览(67)
  • 微信小程序 | 基于小程序+Java+WebSocket实现实时聊天功能

    此文主要实现在小程序内聊天对话功能,使用Java作为后端语言进行支持,界面友好,开发简单。 2.1、注册微信公众平台账号。 2.2、下载安装IntelliJ IDEA(后端语言开发工具),Mysql数据库,微信Web开发者工具。 1.创建maven project 先创建一个名为SpringBootDemo的项目,选择【New Proje

    2024年02月02日
    浏览(52)
  • 基于java微信小程序影视点评系统设计与实现

    开发概要 小程序开发:微信开发者工具(MINA框架) 后台环境:JDK1.8 + Tomcat8 后台开发语言:Java 后台开发框架:springboot 后台模板引擎:Thymeleaf 后台开发工具:Idea2020 数据库:mysql8 数据库管理工具:navicat 其他开发语言:html + css +javascript

    2024年02月11日
    浏览(32)
  • 微信小程序基于java实现v2支付,提现,退款

    v2微信官方文档 封装支付请求实体 controller接口暴露层 payFoodOrder 支付接口实现类 获取请求ip wxform.setNotifyUrl(WechatUtil.getPayNotifyUrl() + WXPAY_NOTIFY_URL_FOOD_ORDER); 这个回调地址是你自己代码里面定义的回调接口,例如你定义的controller回调接口url是 feedback/wx/notifurl , 即是 wxform.setNoti

    2024年02月09日
    浏览(52)
  • 基于java微信小程序论坛交流系统设计与实现

    开发概要 小程序开发:微信开发者工具(MINA框架) 后台环境:JDK1.8 + Tomcat8 后台开发语言:Java 后台开发框架:springboot 后台模板引擎:Thymeleaf 后台开发工具:Idea2020 数据库:mysql8 数据库管理工具:navicat 其他开发语言:html + css +javascript

    2024年02月11日
    浏览(38)
  • 基于java微信小程序疫苗预约系统设计与实现

    开发概要 小程序开发:微信开发者工具(MINA框架) 后台环境:JDK1.8 + Tomcat8 后台开发语言:Java 后台开发框架:springboot 后台模板引擎:Thymeleaf 后台开发工具:Idea2020 数据库:mysql8 数据库管理工具:navicat 其他开发语言:html + css +javascript

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包