Java微信公众号开发之通过微信公众号获取用户信息

作者:南=子 时间:2021-12-16 08:19:19 

最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了。

1、首先需要到微信网站去设置一下,我是直接用的微信测试号。

接口配置信息必须要填写的,所以说必须能将自己的服务发布出去

Java微信公众号开发之通过微信公众号获取用户信息

Java微信公众号开发之通过微信公众号获取用户信息

Java微信公众号开发之通过微信公众号获取用户信息

Java微信公众号开发之通过微信公众号获取用户信息

                             到此微信配置完毕,接下来就是直接上代码了

2、获取用户信息的方式一共是两种,前提都是用户关注微信公众号,一种是静默获取(snsapi_base,这种方式只能获取openid),另一种是授权获取(snsapi_userinfo,可以获取用户的详细信息)。

      先说第一种

(1)首先需要先访问微信的链接

https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxxxxxxxxxxxxx&redirect_uri=http://xxxxxx/open/openid&response_type=code&scope=snsapi_base

           这里的 uri就是直接回掉我们的服务地址,一定要记住,服务校验的判断,我是按照来判断的echostr(第二种方式也是这样)


package net.itraf.controller;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONObject;
@Controller
@RequestMapping("/open")
public class OpenController {
 @RequestMapping("/toOpenId")
 public @ResponseBody String getOpenId(String code,String echostr,HttpServletResponse res) throws IOException{
   if(echostr==null){
     String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx24d47d2080f54c5b&secret=95011ac70909e8cca2786217dd80ee3f&code="+code+"&grant_type=authorization_code";
     System.out.println(code);
     String openId="";
     try {
       URL getUrl=new URL(url);
       HttpURLConnection http=(HttpURLConnection)getUrl.openConnection();
       http.setRequestMethod("GET");
       http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
       http.setDoOutput(true);
       http.setDoInput(true);
       http.connect();
       InputStream is = http.getInputStream();
       int size = is.available();
       byte[] b = new byte[size];
       is.read(b);
       String message = new String(b, "UTF-8");
       JSONObject json = JSONObject.parseObject(message);
       openId = json.getString("openid");
       } catch (MalformedURLException e) {
         e.printStackTrace();
       } catch (IOException e) {
         e.printStackTrace();
       }
     return openId;
   }else{
     PrintWriter out = res.getWriter();
     out.print(echostr);
     return null;
   }
 }
 //做服务器校验
 @RequestMapping("/tovalid")
 public void valid(String echostr,HttpServletResponse res) throws IOException{
   PrintWriter out = res.getWriter();
   out.print(echostr);
 }
}

第二种

(1)

https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxxxxx&redirect_uri=http:// 域名

/open/openid&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect


package net.itraf.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/weixin")
public class Oauth2Action {
 @RequestMapping("/oauth")
 public void auth(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
   String echostr = request.getParameter("echostr");
   if(echostr==null){
     String appId = "wx24d47d2080f54c5b";
     String appSecret = "95011ac70909e8cca2786217dd80ee3f";
     //拼接
     String get_access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
         + "appid="
         + appId
         + "&secret="
         + appSecret
         + "&code=CODE&grant_type=authorization_code";
     String get_userinfo = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
     request.setCharacterEncoding("UTF-8");
     response.setCharacterEncoding("UTF-8");
     String code = request.getParameter("code");
     System.out.println("******************code=" + code);
     get_access_token_url = get_access_token_url.replace("CODE", code);
     String json = HttpsGetUtil.doHttpsGetJson(get_access_token_url);
     JSONObject jsonObject = JSONObject.fromObject(json);
     String access_token = jsonObject.getString("access_token");
     String openid = jsonObject.getString("openid");
     get_userinfo = get_userinfo.replace("ACCESS_TOKEN", access_token);
     get_userinfo = get_userinfo.replace("OPENID", openid);
     String userInfoJson = HttpsGetUtil.doHttpsGetJson(get_userinfo);
     JSONObject userInfoJO = JSONObject.fromObject(userInfoJson);
     String user_openid = userInfoJO.getString("openid");
     String user_nickname = userInfoJO.getString("nickname");
     String user_sex = userInfoJO.getString("sex");
     String user_province = userInfoJO.getString("province");
     String user_city = userInfoJO.getString("city");
     String user_country = userInfoJO.getString("country");
     String user_headimgurl = userInfoJO.getString("headimgurl");
     response.setContentType("text/html; charset=utf-8");
     PrintWriter out = response.getWriter();
     out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
     out.println("<HTML>");
     out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
     out.println(" <BODY>");
     out.print(" This is ");
     out.print(this.getClass());
     out.println(", using the POST method \n");
     out.println("openid:" + user_openid + "\n\n");
     out.println("nickname:" + user_nickname + "\n\n");
     out.println("sex:" + user_sex + "\n\n");
     out.println("province:" + user_province + "\n\n");
     out.println("city:" + user_city + "\n\n");
     out.println("country:" + user_country + "\n\n");
     out.println("<img src=/" + user_headimgurl + "/");
     out.println(">");
     out.println(" </BODY>");
     out.println("</HTML>");
     out.flush();
     out.close();
   }else{
     PrintWriter out = response.getWriter();
     out.print(echostr);
   }
 }
}

package net.itraf.controller;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class HttpsGetUtil {
 public static String doHttpsGetJson(String Url)
 {
   String message = "";
   try
   {
     System.out.println("doHttpsGetJson");//TODO:dd
     URL urlGet = new URL(Url);
     HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
     http.setRequestMethod("GET");   //必须是get方式请求  24      
     http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
     http.setDoOutput(true);
     http.setDoInput(true);
     System.setProperty("sun.net.client.defaultConnectTimeout", "30000");//连接超时30秒28  
     System.setProperty("sun.net.client.defaultReadTimeout", "30000"); //读取超时30秒29 30    
     http.connect();
     InputStream is =http.getInputStream();
     int size =is.available();
     byte[] jsonBytes =new byte[size];
     is.read(jsonBytes);
     message=new String(jsonBytes,"UTF-8");
   }
   catch (MalformedURLException e)
   {
      e.printStackTrace();
    }
   catch (IOException e)
    {
      e.printStackTrace();
    }
   return message;
 }
}

以上所述是小编给大家介绍的Java微信公众号开发之通过微信公众号获取用户信息网站的支持!

来源:http://www.cnblogs.com/yangming5423/archive/2017/05/18/6873267.html

标签:java,微信公众号,用户信息
0
投稿

猜你喜欢

  • Android Studio实现进度条效果

    2021-10-12 05:37:17
  • Android外部存储无法访问问题解决方法

    2021-12-17 06:52:12
  • springboot对压缩请求的处理方法

    2022-02-11 14:00:59
  • C#实现保存文件时重名自动生成新文件的方法

    2022-07-02 15:01:57
  • C#控制台程序中处理2个关闭事件的代码实例

    2021-11-21 03:45:40
  • Java实现删除排序链表中的重复元素的方法

    2022-11-28 08:27:22
  • C#中WPF使用多线程调用窗体组件的方法

    2023-04-24 11:47:57
  • Android 列表倒计时的实现的示例代码(CountDownTimer)

    2021-08-03 09:08:02
  • 探讨:将两个链表非降序合并为一个链表并依然有序的实现方法

    2023-06-23 01:41:38
  • Android判断手机是否联网及自动跳转功能(收藏版)

    2023-10-06 18:42:33
  • java高级用法之注解和反射讲义

    2023-10-08 14:40:16
  • 在当前Activity之上创建悬浮view之WindowManager悬浮窗效果

    2023-02-09 21:02:12
  • ProtoBuf动态拆分Gradle Module解析

    2022-01-06 17:45:21
  • Java sleep方法及中断方式、yield方法代码实例

    2023-10-22 10:59:49
  • Java程序员面试中的多线程问题总结

    2021-12-12 07:48:33
  • Android编程单选项框RadioGroup综合应用示例

    2022-01-12 19:16:29
  • android 版本检测 Android程序的版本检测与更新实现介绍

    2022-12-02 11:27:41
  • 8种android 对话框(Dialog)使用方法详解

    2023-07-09 18:23:44
  • MyBatisPlus3.x中使用代码生成器(全注释)

    2022-04-06 19:34:38
  • java 2d画图示例分享(用java画图)

    2023-07-25 22:03:52
  • asp之家 软件编程 m.aspxhome.com