微信小程序获取用户openid,头像昵称信息,后台java代码

https://blog.csdn.net/qq_39851704/article/details/79025557

 

首先最近正在练习微信小程序刚刚写了一个获取用户openid的代码,貌似之前的小程序可以直接在前台获取openid,现在应该不行了,必须要经过自己的服务器,通过自己的服务器去获取openid,下面就给大家上代码,我也是新手不喜勿喷.

小程序前端 app.js

 

wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        if(res.code){
          wx.getUserInfo({
            success: function(res_user){
              wx.request({
                url: 'http://192.168.xx.xx:8080/test/v1/getOpenId', //这里是本地请求路径,可以写你自己的本地路径,也可以写线上环境
                data: {
                  code: res.code,//获取openid的话 需要向后台传递code,利用code请求api获取openid
                  headurl: res_user.userInfo.avatarUrl,//这些是用户的基本信息
                  nickname:res_user.userInfo.nickName,//获取昵称
                  sex:res_user.userInfo.gender,//获取性别
                  country: res_user.userInfo.country,//获取国家
                  province: res_user.userInfo.province,//获取省份
                  city: res_user.userInfo.city//获取城市
                },
                success: function(res){
                  wx.setStorageSync("openid", res.data)//可以把openid保存起来,以便后期需求的使用
                }
              })
            }
          })
        }
      }
    })
 
 

 

下来就是Java     上面这是controller,其中有些地方也是取别人的优点写的 

 

[java] view plain copy
 
  1. @ResponseBody  
  2. @RequestMapping(value = "/getOpenId", method = RequestMethod.GET) // 获取用户信息  
  3. public String getOpenId(@Param("code") String code, @RequestParam("headurl") String headurl,  
  4.         @RequestParam("nickname") String nickname, @RequestParam("sex") String sex,  
  5.         @RequestParam("country") String country, @RequestParam("province") String province,  
  6.         @RequestParam("city") String city) {  
  7.     String WX_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";  
  8.     try {  
  9.         if (StringUtils.isBlank(code)) {  
  10.             System.out.println("code为空");  
  11.         } else {  
  12.             String requestUrl = WX_URL.replace("APPID", WxConfig.APPID).replace("SECRET", WxConfig.APPSECRECT)  
  13.                     .replace("JSCODE", code).replace("authorization_code", WxConfig.GRANTTYPE);  
  14.             JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET"null);  
  15.             if (jsonObject != null) {  
  16.                 try {  
  17.                     // 业务操作  
  18.                     String openid = jsonObject.getString("openid");  
  19.                     wechatService.selectUserByOpenId(openid, headurl, nickname, sex, country, province, city);  
  20.                     return openid;  
  21.                 } catch (Exception e) {  
  22.                     System.out.println("业务操作失败");  
  23.                     e.printStackTrace();  
  24.                 }  
  25.             } else {  
  26.                 System.out.println("code无效");  
  27.             }  
  28.         }  
  29.     } catch (Exception e) {  
  30.         e.printStackTrace();  
  31.     }  
  32.     return "错误";  
  33. }  //可能代码复制过来,错位了,你们自己格式化一下吧。  

    首先获取openid根据文档需要访问一个https接口 如下:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

 

appid是你小程序的appid,secret是你小程序的appsercet,js_code是前台登陆成功后返回给你的code,grant_type为固定值authorization_code.

 

appid跟secret的查看在微信公众平台:https://mp.weixin.qq.com/

 

注意:appid跟secret只有小程序的管理员可以看到,如果只是有权限的话,还是看不到,必须管理员扫码才可以看到,进去之后就在 设置→→→开发设置

 

 controller中涉及到三个类,CommonUtil是用来请求微信接口的,TrustManager是管理器,WxConfig是配置一些你的小程序   信息

[java] view plain copy
 
  1. import java.io.BufferedReader;  
  2. import java.io.InputStream;  
  3. import java.io.InputStreamReader;  
  4. import java.io.OutputStream;  
  5. import java.net.ConnectException;  
  6. import java.net.URL;  
  7.   
  8. import javax.net.ssl.HttpsURLConnection;  
  9. import javax.net.ssl.SSLContext;  
  10. import javax.net.ssl.SSLSocketFactory;  
  11. import javax.net.ssl.TrustManager;  
  12.   
  13. import net.sf.json.JSONObject;  
  14.   
  15. public class CommonUtil {  
  16.     /** 
  17.      * 发送https请求 
  18.      * @param requestUrl 请求地址 
  19.      * @param requestMethod 请求方式(GET、POST) 
  20.      * @param outputStr 提交的数据 
  21.      * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) 
  22.      */  
  23.     public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {  
  24.         JSONObject jsonObject = null;  
  25.         try {  
  26.             // 创建SSLContext对象,并使用我们指定的信任管理器初始化  
  27.             TrustManager[] tm = { new MyX509TrustManager() };  
  28.             SSLContext sslContext = SSLContext.getInstance("SSL""SunJSSE");  
  29.             sslContext.init(null, tm, new java.security.SecureRandom());  
  30.             // 从上述SSLContext对象中得到SSLSocketFactory对象  
  31.             SSLSocketFactory ssf = sslContext.getSocketFactory();  
  32.   
  33.             URL url = new URL(requestUrl);  
  34.             HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();  
  35.             conn.setSSLSocketFactory(ssf);  
  36.   
  37.             conn.setDoOutput(true);  
  38.             conn.setDoInput(true);  
  39.             conn.setUseCaches(false);  
  40.             // 设置请求方式(GET/POST)  
  41.             conn.setRequestMethod(requestMethod);  
  42.   
  43.             // 当outputStr不为null时向输出流写数据  
  44.             if (null != outputStr) {  
  45.                 OutputStream outputStream = conn.getOutputStream();  
  46.                 // 注意编码格式  
  47.                 outputStream.write(outputStr.getBytes("UTF-8"));  
  48.                 outputStream.close();  
  49.             }  
  50.   
  51.             // 从输入流读取返回内容  
  52.             InputStream inputStream = conn.getInputStream();  
  53.             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
  54.             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
  55.             String str = null;  
  56.             StringBuffer buffer = new StringBuffer();  
  57.             while ((str = bufferedReader.readLine()) != null) {  
  58.                 buffer.append(str);  
  59.             }  
  60.   
  61.             // 释放资源  
  62.             bufferedReader.close();  
  63.             inputStreamReader.close();  
  64.             inputStream.close();  
  65.             inputStream = null;  
  66.             conn.disconnect();  
  67.             jsonObject = JSONObject.fromObject(buffer.toString());  
  68.         } catch (ConnectException ce) {  
  69.             System.out.println("连接超时");  
  70.         } catch (Exception e) {  
  71.             System.out.println("请求异常");  
  72.         }  
  73.         return jsonObject;  
  74.     }  
  75. }  

 

[java] view plain copy
 
  1. import java.security.cert.CertificateException;  
  2. import java.security.cert.X509Certificate;  
  3.   
  4. import javax.net.ssl.TrustManager;  
  5. import javax.net.ssl.X509TrustManager;  
  6.   
  7. /** 
  8.  * 类名: MyX509TrustManager.java</br>  
  9.  * 描述: 信任管理器</br>  
  10.  * 开发人员:wangl</br> 
  11.  * 创建时间: 2018-01-09</br> 
  12.  */  
  13. public class MyX509TrustManager implements X509TrustManager {  
  14.   
  15.     // 检查客户端证书  
  16.     public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {  
  17.     }  
  18.   
  19.     // 检查服务器端证书  
  20.     public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {  
  21.     }  
  22.   
  23.     // 返回受信任的X509证书数组  
  24.     public X509Certificate[] getAcceptedIssuers() {  
  25.         return null;  
  26.     }  
  27. }  


   

有了这两个类就可以获取到用户的openid了,大家都知道,保存用户的昵称跟头像是没什么用的,但是需求有需要,只好保存 了,下面我贴出业务层代码,哈哈哈哈哈,我只是在瞎搞,自己练习,如果代码有什么可笑的地方不要喷我。

 

    如果用户更换了头像或者昵称,我们并不知道用户什么时候更换,所以我想了一种方法,判断用户是否改变数据,如果改变数据的话,我们再进行数据库的操作,如果不改变的话直接return返回,结束操作。

   下面这段代码是ServiceImpl类。

[java] view plain copy
 
  1. public void selectUserByOpenId(String openid, String headurl, String nickname, String sex, String country,  
  2.             String province, String city) {  
  3.             String userip = country+province+city;//用户地址  
  4.             String usersex = "";  
  5.             User user = mapper.selectUser(openid);  
  6.             if(user!=null){//如果用户不等于空  
  7.                 if(user.getNickname().equals(nickname)&&user.getHeadurl().equals(headurl)&&user.getSex().equals(sex)&&user.getUserip().equals(userip)){  
  8.                     System.out.println("数据暂未修改");  
  9.                     return;  
  10.                 }else{  
  11.                     try {  
  12.                         mapper.updateUserMseeage(openid,nickname,headurl,sex,userip);  
  13.                         System.out.println("修改数据成功");  
  14.                     } catch (Exception e) {  
  15.                         System.out.println("修改数据失败");  
  16.                         e.printStackTrace();  
  17.                     }  
  18.                       
  19.                 }  
  20.             }else{//用户为空进行  
  21.                 try {  
  22.                     String phone = "";  
  23.                     String createtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());  
  24.                     mapper.initUser(openid,nickname,headurl,phone,sex,userip,createtime);  
  25.                 } catch (Exception e) {  
  26.                     System.out.println("初始化错误");  
  27.                     e.printStackTrace();  
  28.                 }  
  29.             }  
  30.     }  

   首先根据得到的openid查询一次数据库,判断是否存在这个用户,如果没有的话进行数据初始化,如果有的话判断用户的数据跟新得到的数据进行比较,相等不做操作,不想等再进行数据修改,这样就可以得到用户的新数据。但是总感觉哪里不对劲。

posted @ 2018-06-12 11:56  java_阿杰  阅读(2894)  评论(0编辑  收藏  举报