全国咨询热线:18720358503

微信小程序营销推广_微信小程序后端(java)开发流

类别:行业新闻 发布时间:2021-01-06 浏览人次:

微信小程序后端(java)开发流程的详细步骤       这篇文章主要介绍了微信小程序后端开发流程的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

微信小程序后端接口开发

controller层

public class OauthController {
 @Autowired
 private WeChatService weChatService;
 * 微信授权用js_code换取openId
 * @param code
 * @return
 @GetMapping("/code2Session")
 public BaseResponse code2Session(String code) {
 ("code2Session,code={}", code);
 if (StringUtil.isEmpty(code)) {
 return BaseResponse.buildFail("参数异常");
 Code2SessionResponse res = weChatService.code2Session(code);
 ("code2Session,res={}", res);
 if (!ess()) {
 return BaseResponse.buildFail(res.getErrCode(), res.getErrMsg());
 return ess(res);

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 {

public Code2SessionResponse code2Session(String code) { String rawResponse = HttpClientUtil .get(String.format(WechatConstant.URL_CODE2SESSION, appId, appSecret, code)); ("rawResponse====={}", rawResponse); Code2SessionResponse response = JSON.parseObject(rawResponse, Code2SessionResponse.class); if (ess()) { cacheSessionKey(response); return response; private void cacheSessionKey(Code2SessionResponse response) { RedisCache redisCache = RedisCache.getInstance(); String key = RedisCacheKeys.getWxSessionKeyKey(response.getOpenId()); redisCache.setCache(key, , response.getSessionKey()); @Override public essToken() { essToken(false); @Override public essToken(boolean isForce) { RedisCache redisCache = RedisCache.getInstance(); String accessToken = null; if (!isForce) { accessToken = redisCache.getCache(essTokenKey(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); ("essToken:response={}", response); if (ess()) { redisCache.setCache(essTokenKey(appId), 7000, response.getAcessToken()); return response.getAcessToken(); return null;
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 httpClient = HttpClients.custom()
 // 设置连接池管理
 .setConnectionManager(pool)
 // 设置请求配置
 .setDefaultRequestConfig(getRequestConfig())
 // 设置重试次数
 .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false)).build();
 return httpClient;
 * 发送 post请求
 * @param httpUrl
 * 地址
 public static String post(String httpUrl) {
 // 创建httpPost
 HttpPost httpPost = new HttpPost(httpUrl);
 return request(httpPost);
 public static byte[] postRaw(String httpUrl) {
 // 创建httpPost
 HttpPost httpPost = new HttpPost(httpUrl);
 return requestRaw(httpPost);
 * 发送 get请求
 * @param httpUrl
 public static String get(String httpUrl) {
 // 创建get请求
 HttpGet httpGet = new HttpGet(httpUrl);
 return request(httpGet);
 * 发送 post请求(带文件)
 * @param httpUrl
 * 地址
 * @param ma凡科抠图
 * 参数
 * @param fileLists
 * 附件
 public static String post(String httpUrl, Map String, String ma凡科抠图, List File fileLists,
 String fileName) {
 HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
 MultipartEntityBuilder meBuilder = MultipartEntityBuilder.create();
 if (ma凡科抠图 != null) {
 for (String key : ma凡科抠图.keySet()) {
 meBuilder.addPart(key, new StringBody(ma凡科抠图.get(key), ContentType.TEXT_PLAIN));
 if (fileLists != null) {
 for (File file : fileLists) {
 FileBody fileBody = new FileBody(file);
 meBuilder.addPart(fileName, fileBody);
 HttpEntity reqEntity = meBuilder.build();
 httpPost.setEntity(reqEntity);
 return request(httpPost);
 public static String post(String httpUrl, Map String, String ma凡科抠图, List File fileLists) {
 return post(httpUrl, ma凡科抠图, fileLists, "file");
 public static String post(String httpUrl, List File fileLists) {
 return post(httpUrl, Collections.emptyMap(), fileLists, "file");
 * 发送 post请求
 * @param httpUrl
 * 地址
 * @param params
 * 参数(格式:key1=value1 key2=value2)
 public static String post(String httpUrl, String params) {
 HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
 try {
 // 设置参数
 if (params != null params.trim().length() 0) {
 StringEntity stringEntity = new StringEntity(params, "UTF-8");
 stringEntity.setContentType(CONTENT_TYPE_FORM_URL);
 httpPost.setEntity(stringEntity);
 } catch (Exception e) {
 e.printStackTrace();
 return request(httpPost);
 * 发送 post请求
 * @param ma凡科抠图
 * 参数
 public static String post(String httpUrl, Map String, String ma凡科抠图) {
 String param = convertStringParamter(ma凡科抠图);
 return post(httpUrl, param);

public static String post(String httpUrl, String content, String contentType) { // HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost // try { // // 设置参数 // if (StringUtils.isNotEmpty(content)) { // StringEntity stringEntity = new StringEntity(content, "UTF-8"); // stringEntity.setContentType(contentType); // httpPost.setEntity(stringEntity); // } // } catch (Exception e) { // e.printStackTrace(); // } // return request(httpPost); return new String(postRaw(httpUrl, content, contentType), StandardCharsets.UTF_8); public static byte[] postRaw(String httpUrl, String content, String contentType) { HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost try { // 设置参数 if (StringUtils.isNotEmpty(content)) { StringEntity stringEntity = new StringEntity(content, "UTF-8"); stringEntity.setContentType(contentType); httpPost.setEntity(stringEntity); } catch (Exception e) { e.printStackTrace(); return requestRaw(httpPost); * 发送 post请求 发送json数据 * @param httpUrl * 地址 * @param paramsJson * 参数(格式 json) public static String postJson(String httpUrl, String paramsJson) { return post(httpUrl, paramsJson, CONTENT_TYPE_JSON_URL); public static byte[] postJsonRaw(String httpUrl, String paramsJson) { return postRaw(httpUrl, paramsJson, CONTENT_TYPE_JSON_URL); * 发送 post请求 发送xml数据 * @param url 地址 * @param paramsXml 参数(格式 Xml) public static String postXml(String url, String paramsXml) { return post(url, paramsXml, CONTENT_TYPE_TEXT_HTML); * 将map集合的键值对转化成:key1=value1 key2=value2 的形式 * @param parameterMap * 需要转化的键值对集合 * @return 字符串 public static String convertStringParamter(Map parameterMap) { StringBuilder parameterBuffer = new StringBuilder(); if (parameterMap != null) { Iterator iterator = parameterMap.keySet().iterator(); String key = null; String value = null; while (iterator.hasNext()) { key = (String) iterator.next(); if (parameterMap.get(key) != null) { value = (String) parameterMap.get(key); } else { value = ""; parameterBuffer.append(key).append("=").append(value); if (iterator.hasNext()) { parameterBuffer.append(" return parameterBuffer.toString(); * 发送请求 * @param request * @return public static byte[] requestRaw(HttpRequestBase request) { CloseableHttpClient httpClient; CloseableHttpResponse response = null; // 响应内容 // String responseContent = null; byte[] rawResponse = null; try { // 创建默认的httpClient实例. httpClient = getNewHttpClient(); // 配置请求信息 request.setConfig(requestConfig); // 执行请求 response = httpClient.execute(request); // 得到响应实例 HttpEntity entity = response.getEntity(); // 可以获得响应头 // Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE); // for (Header header : headers) { // System.out.println(header.getName()); // } // 得到响应类型 // System.out.println(ContentType.getOrDefault(response.getEntity()).getMimeType()); // 判断响应状态 if (response.getStatusLine().getStatusCode() = 300) { throw new Exception("HTTP Request is ess, Response code is " + response.getStatusLine().getStatusCode()); if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { rawResponse = EntityUtils.toByteArray(entity); // responseContent = EntityUtils.toString(entity, CHARSET_UTF_8); EntityUtils.consume(entity); } catch (Exception e) { e.printStackTrace(); } finally { try { // 释放资源 if (response != null) { response.close(); } catch (IOException e) { e.printStackTrace(); return rawResponse; private static String request(HttpRequestBase req) { return new String(requestRaw(req), StandardCharsets.UTF_8); private static RequestConfig getRequestConfig() { if (requestConfig == null) { synchronized (HttpClientUtil.class) { if (requestConfig == null) { try { //System.out.println("初始化HttpClientTest~~~开始"); SSLContextBuilder builder = new SSLContextBuilder(); builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( builder.build()); // 配置同时支持 HTTP 和 HTP凡科抠图 Registry ConnectionSocketFactory socketFactoryRegistry = RegistryBuilder . ConnectionSocketFactory create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("htt凡科抠图", sslsf).build(); // 初始化连接管理器 pool = new PoolingHttpClientConnectionManager(socketFactoryRegistry); // 将最大连接数增加到200,实际项目最好从配置文件中读取这个值 pool.setMaxTotal(200); // 设置最大路由 pool.setDefaultMaxPerRoute(2); // 根据默认超时限制初始化requestConfig int socketTimeout = 10000; int connectTimeout = 10000; int connectionRequestTimeout = 10000; requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(connectionRequestTimeout) .setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout) .build(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); // 设置请求超时时间 requestConfig = RequestConfig.custom().setSocketTimeout(50000) .setConnectTimeout(50000).setConnectionRequestTimeout(50000).build(); return requestConfig; }

常量

public interface WechatConstant {
 Integer OK_STATUS = 0;
 String URL_CODE2SESSION = "sns/jscode2session appid=%s secret=%s js_code=%s grant_type=authorization_code";

String URL_GET_ACCESS_TOKEN = "cgi-bin/token grant_type=client_credential appid=%s secret=%s";
String URL_GET_IMAGE = "cgi-bin/media/get access_token=%s media_id=%s";
* 给公众号发送信息。参考advanced/tmplmsg action=faq token= lang=zh_CN String URL_SEND_TO_CHANNEL = "cgi-bin/message/template/send access_token=%s"; String URL_SEND_MESSAGE = "cgi-bin/message/custom/send access_token=%s"; * 发送模板消息。参考miniprogram/dev/api- String URL_SEND_TEMPLATE_MESSAGE = "cgi-bin/message/wxopen/template/send access_token=%s"; String URL_QR_CODE_UNLIMTED = "wxa/getwxacodeunlimit access_token=%s"; String URL_QR_CODE = "wxa/getwxacode access_token=%s"; * 获取标签下粉丝列表 String URL_ALL_FANS_OPENID = "cgi-bin/user/tag/get access_token=%s"; * 获取公众号已创建的标签 String URL_ALL_TAGS = "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 ess() { 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 和其他参数进行解密获取用户手机号

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


推荐阅读

微信小程序营销推广_微信小程序后端(java)开发流

手机微信微信小程序后端开发(java)开发设计步骤的详尽流程 本文关键详细介绍了手机微信微信小程序后端开发开发设计步骤的详尽流程,原文中根据实例编码详细介绍的十分详尽...

2021-01-06
青岛微信小程序_微信小程序点击顶部导航栏切换

手机微信微信小程序点一下顶端导航栏栏转换款式编码案例 本文关键详细介绍了手机微信微信小程序点一下顶端导航栏栏转换款式编码案例,原文中根据实例编码详细介绍的十分详...

2021-01-06
广州顺丰加码生鲜新零售赛道

十月8日,鸟儿CMS获知,原本日常生活进行D1轮两亿美金股权融资。该轮股权融资中,明德控投领投,北京市电子商务项目投资及其老公司股东鼎晖资产、高榕资产等跟投。原本团体是原...

2021-01-06
自助点餐小程序_jquery完成图片无缝滚动 蒙版遮盖

jquery完成照片无缝拼接翻转 蒙版遮掩实际效果 本文关键为大伙儿详尽详细介绍了jquery完成照片无缝拼接翻转,蒙版遮掩实际效果,原文中实例编码详细介绍的十分详尽,具备一定...

2021-01-06
小程序提供的功能_vue中使用WX

vue中应用WX-JSSDK的二种方式(强烈推荐) ·Yang 本文关键详细介绍了vue中应用WX-JSSDK的二种方式,每个方式根据案例编码给大伙儿详细介绍的十分详尽,具备一定的参照效仿使用价值,必...

2021-01-06
广州凡科互联网科技股份有限公司招聘市场培训

招聘人数:22职位信息(1)根据企业业务战略发展规划,构建商学院培训体系;制定培训政策和流程;(2)商学院的发展规划、经营方针、年度计划及日常管理工作事项;(3)组建企业...

2021-01-06
X

400-8700-61718720358503
企业邮箱2639601583@qq.com
官方微信