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

Posted to-red

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序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;
    
View Code

 参考自:https://blog.csdn.net/qq_20372833/article/details/89597420

以上是关于微信小程序springboot后台获取用户的openid的主要内容,如果未能解决你的问题,请参考以下文章

小程序微信登录

uniapp:微信小程序获取用户手机号

微信小程序:java后台获取openId

微信小程序通过getPhoneNumber后台PHP解密获取用户手机号码

为啥别人访问我微信小程序获取不到openID

微信小程序 uniapp wx.startLocationUpdateBackground前后台实时获取用户位置消息 获取用户使用设备的GPS开启状态