微信小程序 springboot后台如何获取用户的openid

 更新时间:2019年09月23日 10:54:12   作者:SupermanH  
这篇文章主要介绍了微信小程序 springboot后台如何获取用户的openid,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

openid可以标识一个用户,session_key会变,所以来获取一下openid。

openid不能在微信小程序中直接获取,需要后台发送请求到微信的接口,然后微信返回一个json格式的字符串到后台,后台处理之后,再返回到微信小程序。

发布的小程序需要https的域名,而测试的时候可以使用http。

小程序在app.js中,修改login()中的内容:

// 登录
  wx.login({
   success: res => {
    // 发送 res.code 到后台换取 openId, sessionKey, unionId
    if (res.code) {
     wx.request({
      url: 'http://localhost:84/user/login',
      method: 'POST',
      data: {
       code: res.code
      },
      header: {
       'content-type': 'application/x-www-form-urlencoded'
      },
      success(res) {
       console.log("openid:"+res.data.openid);
       if (res.data.openid != "" || res.data.openid!=null){
        // 登录成功
        wx.setStorageSync("openid", res.data.openid);//将用户id保存到缓存中
        wx.setStorageSync("session_key", res.data.session_key);//将session_key保存到缓存中
       }else{
        // 登录失败
        // TODO 跳转到错误页面,要求用户重试


        return false;
       }
      }
     })
    } else {
     console.log('获取用户登录态失败!' + res.errMsg)
    }
   }
  })

这里请求的http://localhost:84/user/login

后台的处理类:

package com.ft.feathertrade.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.ft.feathertrade.entity.OpenIdJson;
import com.ft.feathertrade.utils.HttpUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
public class LoginHandler {

  private String appID = "";
  private String appSecret = "";

  @PostMapping("/user/login")
  public String userLogin(@RequestParam("code") String code) throws IOException {
    String result = "";
    try{//请求微信服务器,用code换取openid。HttpUtil是工具类,后面会给出实现,Configure类是小程序配置信息,后面会给出代码
      result = HttpUtil.doGet(
          "https://api.weixin.qq.com/sns/jscode2session?appid="
              + this.appID + "&secret="
              + this.appSecret + "&js_code="
              + code
              + "&grant_type=authorization_code", null);
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    ObjectMapper mapper = new ObjectMapper();
    OpenIdJson openIdJson = mapper.readValue(result,OpenIdJson.class);
    System.out.println(result.toString());
    System.out.println(openIdJson.getOpenid());
    return result;
  }

}

HttpUtil工具类:

package com.ft.feathertrade.utils;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.httpclient.HttpStatus;//此类需要添加maven依赖或jar包

/** 将此依赖添加到pom.xml中
 <dependency>
 <groupId>commons-httpclient</groupId>
 <artifactId>commons-httpclient</artifactId>
 <version>3.1</version>
 </dependency>
 **/

public class HttpUtil {

  public static String doGet(String urlPath, HashMap<String, Object> params)
      throws Exception {
    StringBuilder sb = new StringBuilder(urlPath);
    if (params != null && !params.isEmpty()) { // 说明有参数
      sb.append("?");

      Set<Entry<String, Object>> set = params.entrySet();
      for (Entry<String, Object> entry : set) { // 遍历map里面的参数
        String key = entry.getKey();
        String value = "";
        if (null != entry.getValue()) {
          value = entry.getValue().toString();
          // 转码
          value = URLEncoder.encode(value, "UTF-8");
        }
        sb.append(key).append("=").append(value).append("&");
      }

      sb.deleteCharAt(sb.length() - 1); // 删除最后一个&
    }
    // System.out.println(sb.toString());
    URL url = new URL(sb.toString());
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setConnectTimeout(5000); // 5s超时
    conn.setRequestMethod("GET");

    if (conn.getResponseCode() == HttpStatus.SC_OK) {// HttpStatus.SC_OK ==
      // 200
      BufferedReader reader = new BufferedReader(new InputStreamReader(
          conn.getInputStream()));
      StringBuilder sbs = new StringBuilder();
      String line;
      while ((line = reader.readLine()) != null) {
        sbs.append(line);
      }
      return sbs.toString();
    }
    return null;
  }
}

OpenIdJson的实体类:

package com.ft.feathertrade.entity;

public class OpenIdJson {
  private String openid;
  private String session_key;

  public String getOpenid() {
    return openid;
  }

  public void setOpenid(String openid) {
    this.openid = openid;
  }

  public String getSession_key() {
    return session_key;
  }

  public void setSession_key(String session_key) {
    this.session_key = session_key;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 实例分析java对象的序列化和反序列化

    实例分析java对象的序列化和反序列化

    序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化
    2018-09-09
  • Spring观察者模式之事件发布订阅实现和源码详解

    Spring观察者模式之事件发布订阅实现和源码详解

    这篇文章主要介绍了Spring观察者模式之事件发布订阅实现和源码详解,Spring认为发布订阅主题,其实可以理解为事件驱动的编码,先来实现以下Spring容器中的事件发布订阅,需要的朋友可以参考下
    2024-01-01
  • jdk1.8的环境配置过程

    jdk1.8的环境配置过程

    Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上,本文给大家讲解jdk1.8的环境配置过程,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • java冒泡排序算法代码

    java冒泡排序算法代码

    这篇文章介绍了java冒泡排序算法代码,有需要的朋友可以参考一下
    2013-10-10
  • Spring session实现共享单点登录案例过程解析

    Spring session实现共享单点登录案例过程解析

    这篇文章主要介绍了Spring session实现共享单点登录案例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java编程中的vector类用法学习笔记

    Java编程中的vector类用法学习笔记

    Vector通常被用来实现动态数组,即可实现自动增长的对象数组,和C++一样vector类同样被Java内置,下面就来看一下vector类的基本用法.
    2016-05-05
  • SpringAop中的Advice通知实例

    SpringAop中的Advice通知实例

    这篇文章主要介绍了SpringAop中的Advice通知详解,Spring的AOP功能中一个关键概念是通知Advice与切点Pointcut表达式相关联在特定节点织入一些逻辑,Spring提供了五种类型的通知,需要的朋友可以参考下
    2023-09-09
  • Maven介绍与配置+IDEA集成Maven+使用Maven命令小结

    Maven介绍与配置+IDEA集成Maven+使用Maven命令小结

    Maven是Apache软件基金会的一个开源项目,是一个优秀的项目构建管理工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作,本文给大家介绍Maven介绍与配置+IDEA集成Maven+使用Maven命令,感兴趣的朋友一起看看吧
    2024-01-01
  • 你可知HashMap为什么是线程不安全的

    你可知HashMap为什么是线程不安全的

    这篇文章主要介绍了你可知HashMap为什么是线程不安全的,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 关于SpringBoot大文件RestTemplate下载解决方案

    关于SpringBoot大文件RestTemplate下载解决方案

    这篇文章主要介绍了SpringBoot大文件RestTemplate下载解决方案,最近结合网上案例及自己总结,写了一个分片下载tuling/fileServer项目,需要的朋友可以参考下
    2021-10-10

最新评论