微信小程序后端java开发流程具体步骤有哪些详细细节?

2026-04-05 20:381阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1366个文字,预计阅读时间需要6分钟。

微信小程序后端java开发流程具体步骤有哪些详细细节?

微信小程序后端开发流程概述为以下两个步骤:

1.前端调用 wx.login 获取 code,然后使用 wx.getUserInfo 获取用户昵称和头像。

微信小程序后端java开发流程具体步骤有哪些详细细节?

2.服务端根据 code 获取 openid,接口地址:https://d/

微信小程序后端开发流程根据官网总结为两个步骤

1、前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像

2、服务端根据code去微信获取openid, 接口地址: developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html%EF%BC%9B%E5%90%8C%E6%97%B6%EF%BC%8C%E6%9B%B4%E6%96%B0%E7%94%A8%E6%88%B7%E6%98%B5%E7%A7%B0%E5%A4%B4%E5%83%8F%E7%AD%89%E8%B5%84%E6%96%99

微信小程序后端接口开发

controller层

public class OauthController { @Autowired private WeChatService weChatService; /** * 微信授权用js_code换取openId * @param code * @return */ @GetMapping("/code2Session") public BaseResponse code2Session(String code) { log.info("code2Session,code={}", code); if (StringUtil.isEmpty(code)) { return BaseResponse.buildFail("参数异常"); } Code2SessionResponse res = weChatService.code2Session(code); log.info("code2Session,res={}", res); if (!res.isSuccess()) { return BaseResponse.buildFail(res.getErrCode(), res.getErrMsg()); } return BaseResponse.buildSuccess(res); } /** * 解密获取手机号 * @param request * @param response * @param param * @return */ public BaseResponse decryptGetPhone(HttpServletRequest request, HttpServletResponse response, @RequestBody OauthParam param) { if (!StringUtil.isEmpty(param.getOpenId())) {//微信授权登录 String sessionKey = weChatService.getSessionKey(param.getOpenId()); if (StringUtil.isEmpty(sessionKey)) { return BaseResponse.buildFail("会话不存在"); } Sha1Utils sha = new Sha1Utils(); // 获取用户信息 log.debug("微信登陆 sessionKey = {}", sessionKey); String userInfoStr = sha.decryptWXAppletInfo(sessionKey, param.getEncryptedData(), param.getIv()); if (StringUtil.isEmpty(userInfoStr)) { return BaseResponse.buildFail("无法获取用户信息"); } JSONObject json = JSONObject.parseObject(userInfoStr); //绑定微信的手机号 String tel = json.getString("purePhoneNumber"); Assert.isTrue(!StringUtils.isEmpty(tel), "无法获取用户手机号"); BaseResponse baseResponse=new BaseResponse(); baseResponse.setResultInfo(tel); baseResponse.setState(0); return baseResponse; } } }

接口

public interface WeChatService { /** * 用code换取openid * * @param code * @return */ Code2SessionResponse code2Session(String code); /** * 获取凭证 * * @return */ String getAccessToken(); /** * 获取凭证 * * @param isForce * @return */ String getAccessToken(boolean isForce); String getSessionKey(String openId); }

实现类

public class WeChatServiceImpl implements WeChatService { //获取配置文件数据 @Value("${wechat.miniprogram.id}") private String appId; @Value("${wechat.miniprogram.secret}") private String appSecret; @Reference private SysUserService sysUserService; @Override public Code2SessionResponse code2Session(String code) { String rawResponse = HttpClientUtil .get(String.format(WechatConstant.URL_CODE2SESSION, appId, appSecret, code)); log.info("rawResponse====={}", rawResponse); Code2SessionResponse response = JSON.parseObject(rawResponse, Code2SessionResponse.class); if (response.isSuccess()) { cacheSessionKey(response); } return response; } private void cacheSessionKey(Code2SessionResponse response) { RedisCache redisCache = RedisCache.getInstance(); String key = RedisCacheKeys.getWxSessionKeyKey(response.getOpenId()); redisCache.setCache(key, 2147483647, response.getSessionKey()); } @Override public String getAccessToken() { return getAccessToken(false); } @Override public String getAccessToken(boolean isForce) { RedisCache redisCache = RedisCache.getInstance(); String accessToken = null; if (!isForce) { accessToken = redisCache.getCache(RedisCacheKeys.getWxAccessTokenKey(appId)); } if (StringUtil.isNotEmpty(accessToken)) { return accessToken; } String rawResponse = HttpClientUtil .get(String.format(WechatConstant.URL_GET_ACCESS_TOKEN, appId, appSecret)); AccessTokenResponse response = JSON.parseObject(rawResponse, AccessTokenResponse.class); log.info("getAccessToken:response={}", response); if (response.isSuccess()) { redisCache.setCache(RedisCacheKeys.getWxAccessTokenKey(appId), 7000, response.getAcessToken()); return response.getAcessToken(); } return null; } @Override public String getSessionKey(String openId) { RedisCache redisCache = RedisCache.getInstance(); String key = RedisCacheKeys.getWxSessionKeyKey(openId); String sessionKey = redisCache.getCache(key); return sessionKey; } }

用到的解密工具类

public class Sha1Utils { public static String decryptWXAppletInfo(String sessionKey, String encryptedData, String iv) { String result = null; try { byte[] encrypData = Base64.decodeBase64(encryptedData); byte[] ivData = Base64.decodeBase64(iv); byte[] sessionKeyB = Base64.decodeBase64(sessionKey); AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(sessionKeyB, "AES"); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] doFinal = cipher.doFinal(encrypData); result = new String(doFinal); return result; } catch (Exception e) { //e.printStackTrace(); log.error("decryptWXAppletInfo error",e); } return null; } }

网络请求工具类

public class HttpClientUtil { // utf-8字符编码 public static final String CHARSET_UTF_8 = "utf-8"; // HTTP内容类型。 public static final String CONTENT_TYPE_TEXT_HTML = "text/xml"; // HTTP内容类型。相当于form表单的形式,提交数据 public static final String CONTENT_TYPE_FORM_URL = "application/x-www-form-urlencoded"; // HTTP内容类型。相当于form表单的形式,提交数据 public static final String CONTENT_TYPE_JSON_URL = "application/json;charset=utf-8"; // 连接管理器 private static PoolingHttpClientConnectionManager pool; // 请求配置 private static volatile RequestConfig requestConfig; private static CloseableHttpClient getNewHttpClient() { CloseableHttpClient api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"; String URL_GET_ACCESS_TOKEN = "api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; String URL_GET_IMAGE = "file.api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s"; /** * 给公众号发送信息。参考mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=708366329&lang=zh_CN */ String URL_SEND_TO_CHANNEL = "api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s"; String URL_SEND_MESSAGE = "api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s"; /** * 发送模板消息。参考developers.weixin.qq.com/miniprogram/dev/api-backend/sendMiniTemplateMessage.html */ String URL_SEND_TEMPLATE_MESSAGE = "api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=%s"; String URL_QR_CODE_UNLIMTED = "api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"; String URL_QR_CODE = "api.weixin.qq.com/wxa/getwxacode?access_token=%s"; /** * 获取标签下粉丝列表 */ String URL_ALL_FANS_OPENID = "api.weixin.qq.com/cgi-bin/user/tag/get?access_token=%s"; /** * 获取公众号已创建的标签 */ String URL_ALL_TAGS = "api.weixin.qq.com/cgi-bin/tags/get?access_token=%s"; }

使用到的实体类

public class Code2SessionResponse implements Serializable { public static Integer RESPONSE_OK = 0; @JSONField(name = "openid") private String openId; @JSONField(name = "session_key") private String sessionKey; @JSONField(name = "unionid") private String unionId; @JSONField(name = "errcode") private Integer errCode; @JSONField(name = "errmsg") private String errMsg; public boolean isSuccess() { return this.errCode == null || RESPONSE_OK.equals(this.errCode); } }

总结:微信小程序的后端开发主要就是对用户进行授权 , 1、前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像 2.首先通过微信授权用js_code换取openId,来获取openId,前端传微信的参数 code字段 3.然后解密获取手机号 前端需要传openId encryptedData iv 等字段来获取用户的的授权手机号

这些信息都获取后 接着就是调用后端的登陆接口,登陆接口如果只有授权登录就是我们将接口参数为下图最后三个字段为前端必填字段

主要步骤是根据前端的openId获取sessionKey 然后根据sessionKey 和其他参数进行解密获取用户手机号

通过解密获取授权登录的手机号,然后根据自己的业务逻辑处理即可,这样我们就可以根据授权的手机号进行授权登录

标签:详细

本文共计1366个文字,预计阅读时间需要6分钟。

微信小程序后端java开发流程具体步骤有哪些详细细节?

微信小程序后端开发流程概述为以下两个步骤:

1.前端调用 wx.login 获取 code,然后使用 wx.getUserInfo 获取用户昵称和头像。

微信小程序后端java开发流程具体步骤有哪些详细细节?

2.服务端根据 code 获取 openid,接口地址:https://d/

微信小程序后端开发流程根据官网总结为两个步骤

1、前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像

2、服务端根据code去微信获取openid, 接口地址: developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html%EF%BC%9B%E5%90%8C%E6%97%B6%EF%BC%8C%E6%9B%B4%E6%96%B0%E7%94%A8%E6%88%B7%E6%98%B5%E7%A7%B0%E5%A4%B4%E5%83%8F%E7%AD%89%E8%B5%84%E6%96%99

微信小程序后端接口开发

controller层

public class OauthController { @Autowired private WeChatService weChatService; /** * 微信授权用js_code换取openId * @param code * @return */ @GetMapping("/code2Session") public BaseResponse code2Session(String code) { log.info("code2Session,code={}", code); if (StringUtil.isEmpty(code)) { return BaseResponse.buildFail("参数异常"); } Code2SessionResponse res = weChatService.code2Session(code); log.info("code2Session,res={}", res); if (!res.isSuccess()) { return BaseResponse.buildFail(res.getErrCode(), res.getErrMsg()); } return BaseResponse.buildSuccess(res); } /** * 解密获取手机号 * @param request * @param response * @param param * @return */ public BaseResponse decryptGetPhone(HttpServletRequest request, HttpServletResponse response, @RequestBody OauthParam param) { if (!StringUtil.isEmpty(param.getOpenId())) {//微信授权登录 String sessionKey = weChatService.getSessionKey(param.getOpenId()); if (StringUtil.isEmpty(sessionKey)) { return BaseResponse.buildFail("会话不存在"); } Sha1Utils sha = new Sha1Utils(); // 获取用户信息 log.debug("微信登陆 sessionKey = {}", sessionKey); String userInfoStr = sha.decryptWXAppletInfo(sessionKey, param.getEncryptedData(), param.getIv()); if (StringUtil.isEmpty(userInfoStr)) { return BaseResponse.buildFail("无法获取用户信息"); } JSONObject json = JSONObject.parseObject(userInfoStr); //绑定微信的手机号 String tel = json.getString("purePhoneNumber"); Assert.isTrue(!StringUtils.isEmpty(tel), "无法获取用户手机号"); BaseResponse baseResponse=new BaseResponse(); baseResponse.setResultInfo(tel); baseResponse.setState(0); return baseResponse; } } }

接口

public interface WeChatService { /** * 用code换取openid * * @param code * @return */ Code2SessionResponse code2Session(String code); /** * 获取凭证 * * @return */ String getAccessToken(); /** * 获取凭证 * * @param isForce * @return */ String getAccessToken(boolean isForce); String getSessionKey(String openId); }

实现类

public class WeChatServiceImpl implements WeChatService { //获取配置文件数据 @Value("${wechat.miniprogram.id}") private String appId; @Value("${wechat.miniprogram.secret}") private String appSecret; @Reference private SysUserService sysUserService; @Override public Code2SessionResponse code2Session(String code) { String rawResponse = HttpClientUtil .get(String.format(WechatConstant.URL_CODE2SESSION, appId, appSecret, code)); log.info("rawResponse====={}", rawResponse); Code2SessionResponse response = JSON.parseObject(rawResponse, Code2SessionResponse.class); if (response.isSuccess()) { cacheSessionKey(response); } return response; } private void cacheSessionKey(Code2SessionResponse response) { RedisCache redisCache = RedisCache.getInstance(); String key = RedisCacheKeys.getWxSessionKeyKey(response.getOpenId()); redisCache.setCache(key, 2147483647, response.getSessionKey()); } @Override public String getAccessToken() { return getAccessToken(false); } @Override public String getAccessToken(boolean isForce) { RedisCache redisCache = RedisCache.getInstance(); String accessToken = null; if (!isForce) { accessToken = redisCache.getCache(RedisCacheKeys.getWxAccessTokenKey(appId)); } if (StringUtil.isNotEmpty(accessToken)) { return accessToken; } String rawResponse = HttpClientUtil .get(String.format(WechatConstant.URL_GET_ACCESS_TOKEN, appId, appSecret)); AccessTokenResponse response = JSON.parseObject(rawResponse, AccessTokenResponse.class); log.info("getAccessToken:response={}", response); if (response.isSuccess()) { redisCache.setCache(RedisCacheKeys.getWxAccessTokenKey(appId), 7000, response.getAcessToken()); return response.getAcessToken(); } return null; } @Override public String getSessionKey(String openId) { RedisCache redisCache = RedisCache.getInstance(); String key = RedisCacheKeys.getWxSessionKeyKey(openId); String sessionKey = redisCache.getCache(key); return sessionKey; } }

用到的解密工具类

public class Sha1Utils { public static String decryptWXAppletInfo(String sessionKey, String encryptedData, String iv) { String result = null; try { byte[] encrypData = Base64.decodeBase64(encryptedData); byte[] ivData = Base64.decodeBase64(iv); byte[] sessionKeyB = Base64.decodeBase64(sessionKey); AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(sessionKeyB, "AES"); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] doFinal = cipher.doFinal(encrypData); result = new String(doFinal); return result; } catch (Exception e) { //e.printStackTrace(); log.error("decryptWXAppletInfo error",e); } return null; } }

网络请求工具类

public class HttpClientUtil { // utf-8字符编码 public static final String CHARSET_UTF_8 = "utf-8"; // HTTP内容类型。 public static final String CONTENT_TYPE_TEXT_HTML = "text/xml"; // HTTP内容类型。相当于form表单的形式,提交数据 public static final String CONTENT_TYPE_FORM_URL = "application/x-www-form-urlencoded"; // HTTP内容类型。相当于form表单的形式,提交数据 public static final String CONTENT_TYPE_JSON_URL = "application/json;charset=utf-8"; // 连接管理器 private static PoolingHttpClientConnectionManager pool; // 请求配置 private static volatile RequestConfig requestConfig; private static CloseableHttpClient getNewHttpClient() { CloseableHttpClient api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"; String URL_GET_ACCESS_TOKEN = "api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; String URL_GET_IMAGE = "file.api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s"; /** * 给公众号发送信息。参考mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=708366329&lang=zh_CN */ String URL_SEND_TO_CHANNEL = "api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s"; String URL_SEND_MESSAGE = "api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s"; /** * 发送模板消息。参考developers.weixin.qq.com/miniprogram/dev/api-backend/sendMiniTemplateMessage.html */ String URL_SEND_TEMPLATE_MESSAGE = "api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=%s"; String URL_QR_CODE_UNLIMTED = "api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"; String URL_QR_CODE = "api.weixin.qq.com/wxa/getwxacode?access_token=%s"; /** * 获取标签下粉丝列表 */ String URL_ALL_FANS_OPENID = "api.weixin.qq.com/cgi-bin/user/tag/get?access_token=%s"; /** * 获取公众号已创建的标签 */ String URL_ALL_TAGS = "api.weixin.qq.com/cgi-bin/tags/get?access_token=%s"; }

使用到的实体类

public class Code2SessionResponse implements Serializable { public static Integer RESPONSE_OK = 0; @JSONField(name = "openid") private String openId; @JSONField(name = "session_key") private String sessionKey; @JSONField(name = "unionid") private String unionId; @JSONField(name = "errcode") private Integer errCode; @JSONField(name = "errmsg") private String errMsg; public boolean isSuccess() { return this.errCode == null || RESPONSE_OK.equals(this.errCode); } }

总结:微信小程序的后端开发主要就是对用户进行授权 , 1、前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像 2.首先通过微信授权用js_code换取openId,来获取openId,前端传微信的参数 code字段 3.然后解密获取手机号 前端需要传openId encryptedData iv 等字段来获取用户的的授权手机号

这些信息都获取后 接着就是调用后端的登陆接口,登陆接口如果只有授权登录就是我们将接口参数为下图最后三个字段为前端必填字段

主要步骤是根据前端的openId获取sessionKey 然后根据sessionKey 和其他参数进行解密获取用户手机号

通过解密获取授权登录的手机号,然后根据自己的业务逻辑处理即可,这样我们就可以根据授权的手机号进行授权登录

标签:详细