首先最近正在练习微信小程序刚刚写了一个获取用户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保存起来,以便后期需求的使用
                }
              })
            }
          })
        }
      }
    })

 

一些详细的参数请参考微信api:https://mp.weixin.qq.com/debug/wxadoc/dev/api/open.html#wxgetuserinfoobject

 

 

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

 


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. "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. "code为空");  
11. else {  
12. "APPID", WxConfig.APPID).replace("SECRET", WxConfig.APPSECRECT)  
13. "JSCODE", code).replace("authorization_code", WxConfig.GRANTTYPE);  
14. "GET", null);  
15. if (jsonObject != null) {  
16. try {  
17. // 业务操作  
18. "openid");  
19.                     wechatService.selectUserByOpenId(openid, headurl, nickname, sex, country, province, city);  
20. return openid;  
21. catch (Exception e) {  
22. "业务操作失败");  
23.                     e.printStackTrace();  
24.                 }  
25. else {  
26. "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是配置一些你的小程序   信息


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. null;  
25. try {  
26. // 创建SSLContext对象,并使用我们指定的信任管理器初始化  
27. new MyX509TrustManager() };  
28. "SSL", "SunJSSE");  
29. null, tm, new java.security.SecureRandom());  
30. // 从上述SSLContext对象中得到SSLSocketFactory对象  
31.             SSLSocketFactory ssf = sslContext.getSocketFactory();  
32.   
33. new URL(requestUrl);  
34.             HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();  
35.             conn.setSSLSocketFactory(ssf);  
36.   
37. true);  
38. true);  
39. false);  
40. // 设置请求方式(GET/POST)  
41.             conn.setRequestMethod(requestMethod);  
42.   
43. // 当outputStr不为null时向输出流写数据  
44. if (null != outputStr) {  
45.                 OutputStream outputStream = conn.getOutputStream();  
46. // 注意编码格式  
47. "UTF-8"));  
48.                 outputStream.close();  
49.             }  
50.   
51. // 从输入流读取返回内容  
52.             InputStream inputStream = conn.getInputStream();  
53. new InputStreamReader(inputStream, "utf-8");  
54. new BufferedReader(inputStreamReader);  
55. null;  
56. 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. null;  
66.             conn.disconnect();  
67.             jsonObject = JSONObject.fromObject(buffer.toString());  
68. catch (ConnectException ce) {  
69. "连接超时");  
70. catch (Exception e) {  
71. "请求异常");  
72.         }  
73. return jsonObject;  
74.     }  
75. }

 


    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类。


    1. public void selectUserByOpenId(String openid, String headurl, String nickname, String sex, String country,  
    2.             String province, String city) {  
    3. //用户地址  
    4. "";  
    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. "数据暂未修改");  
    9. return;  
    10. else{  
    11. try {  
    12.                         mapper.updateUserMseeage(openid,nickname,headurl,sex,userip);  
    13. "修改数据成功");  
    14. catch (Exception e) {  
    15. "修改数据失败");  
    16.                         e.printStackTrace();  
    17.                     }  
    18.                       
    19.                 }  
    20. else{//用户为空进行  
    21. try {  
    22. "";  
    23. 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. "初始化错误");  
    27.                     e.printStackTrace();  
    28.                 }  
    29.             }  
    30.     }

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