微信公众平台获取openid在公众号的开发中有很多用途,前段时间为实现用户使用公众号在登录一次以后可以免密登陆而使用了openid。开发过程中遇到了一些问题,在这里向需要且还没有获取到openid的米娜桑分享一下简单的流程及部分代码,和一些问题的解决方式,给初次接触微信openid的朋友们一个参考。目的只在于获取openid,至于优化及应用上诸君请自由发挥。

首先了解openid是什么,一个微信号与一个公众号对应一个固定不变的openid。所以一个微信号在一个公众号下的openid是不变的,如果换了一个对应的公众号,那就是另一个openid了。且只有在微信自带浏览器中打开的项目才可获取到。
准备:

首先你要有一个公众号,还有一个外网可访问的域名,我的公众号类型是企业号,这里就以企业号为例了。获取openid需要的公众号的 appid 和 secret(登陆公众平台 开发----->基本配置中的开发者ID(AppID)和 开发者密码(AppSecret)就是)。其次是设置网页授权域名(登陆公众平台 设置----->公众号设置------>功能设置----->网页授权域名 按步骤操作并设置就好),这个域名就是你获取openid的web项目发布的域名,这里注意服务器请一定跑在80端口。

流程:

1.调用https://open.weixin.qq.com/connect/oauth2/authorize接口获取到code

2.得到code作为一个参数调用https://api.weixin.qq.com/sns/oauth2/access_token接口获取到openid

因为只是简单的获取到openid,这里只放两个servlet与用到的工具类代码:

第一个是获取code用的WxCodeServlt

public class WxCodeServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
//这里要将你的授权回调地址处理一下,否则微信识别不了
String redirect_uri=URLEncoder.encode("/*你的授权回调地址*/", "UTF-8");
//简单获取openid的话参数response_type与scope与state参数固定写死即可
StringBuffer url=new StringBuffer("https://open.weixin.qq.com/connect/oauth2/authorize?redirect_uri="+redirect_uri+
"&appid="+/*你的appid*/+"&response_type=code&scope=snsapi_base&state=1#wechat_redirect");
response.sendRedirect(url.toString());//这里请不要使用get请求单纯的将页面跳转到该url即可

}

当用户用微信进入我们的网页并调用到WxCodeServlet之后,若参数无误,设置的网页授权域名正确,微信就会重定向页面到我们提交的回调地址,同时我们想要的code也会被传过来

而这个回调地址就是我们的第二个servlet WxOpenIdServlet

public class WxOpenIdServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html");

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String code = request.getParameter("code");//获取code
Map params = new HashMap();
params.put("secret", "/*你的secret*/");
params.put("appid", "/*你的appid*/");
params.put("grant_type", "authorization_code");
params.put("code", code);
String result = HttpGetUtil.httpRequestToString(
"https://api.weixin.qq.com/sns/oauth2/access_token", params);
JSONObject jsonObject = JSONObject.fromObject(result);

String openid = jsonObject.get("openid").toString();
System.out.println("得到的openid为:"+openid);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

在这里我要补充一下了,一位朋友获取到code后去请求却被微信反悔了一个错误码"errcode":40125,对应的错误是appsecret无效,可是填写的appsecret与公众平台中的appsecret一致。这个问题在开发时我也遇到过,解决方式是重置appsecret,当初也没在意,现在看来这个问题挺频繁的,所以在这里再补充一下。

其中用到了一个工具类HttpGetUtil JSON需要的包这里就不说了

public class HttpGetUtil {

public static String httpRequestToString(String url,
Map<String,String> params) {
String result = null;
try {
InputStream is = httpRequestToStream(url, params);
BufferedReader in = new BufferedReader(new InputStreamReader(is,
"UTF-8"));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
}
result = buffer.toString();
} catch (Exception e) {
return null;
}
return result;
}

private static InputStream httpRequestToStream(String url,
Map<String, String> params) {
InputStream is = null;
try {
String parameters = "";
boolean hasParams = false;
for(String key : params.keySet()){
String value = URLEncoder.encode(params.get(key), "UTF-8");
parameters += key +"="+ value +"&";
hasParams = true;
}
if(hasParams){
parameters = parameters.substring(0, parameters.length()-1);
}

url += "?"+ parameters;

URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("contentType", "utf-8");
conn.setConnectTimeout(50000);
conn.setReadTimeout(50000);
conn.setDoInput(true);
//设置请求方式,默认为GET
conn.setRequestMethod("GET");

is = conn.getInputStream();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}

}

至此如果各个步骤都没有出错的话,当我们的WxCodeServlet被调用后,控制台就能打印出来刚才通过微信打开我们网页并调用到WxCodeServlet的微信用户对应我们公众平台的openid了

注意问题:

1.网页授权域名设置如果与提交的回调地址的域名不对应,微信是无法回调到的。

2.单纯的获取openid使用的授权方式是静态授权,不需要经过用户许可的(用户看不到授权的过程),而想要获取用户的头像昵称等信息是另一种授权(用户端会弹出授权窗口),在此就不介绍了。

3.提交的回调地址格式为 http://xxxx.xxxx.com/xxxxx/WxOpenIdServlet,使用java.net 包里的URLEncoder.encode("url","utf-8")处理后提交

4.如遇到问题,请耐心细心的回头按步骤检查资料信息以及代码。

转载于:https://www.cnblogs.com/niudaxianren/p/9999515.html

简单的实现微信获取openid相关推荐

  1. 微信获取openID以及token

    微信的openID和token是唯一的身份标识.非常重要,其中token的有效期只有两个小时(官方可能修改). 获取openID事例: 官方文档 1 第一步:用户同意授权,获取code https:/ ...

  2. vue 微信(企业微信)获取openId

    项目背景: 一个H5活动页,获取企业微信的用户openId,然后通过openId调用接口判断用户是否是第一次登陆,第一登陆跳转index,不是第一次调转about. 开发: 参考很多博客,用了中转页面 ...

  3. 微信获取openid方法

    绑定appId 配置API key 生成证书 设置支付授权目录 设置授权域名(获取openid的域名) openid:openid是微信用户在appid下的唯一用户标识(appid不同,则获取到的op ...

  4. 「前端」微信获取openId,静默授权与非静默授权

    首先了解一下静默与非静默授权的区别 静默授权「snsapi_base」 以 snsapi_base 为 scope 发起的网页授权,不用用户手动授权,跳转授权回到回调页面,只能获取用户openId 非 ...

  5. java微信获取openId和sessionKey

    流程如下: 小程序端调用由微信提供的wx.login()方法,获取登录凭证(code) 获取到code之后,到服务端换取openId以及sessionKey,服务端此时需要发送请求到微信,用code换 ...

  6. 微信获取openId

    router.beforeEach(function(to, from, next){//中间页等待跳转if(to.meta.requireCheck=="WaitLogin"){ ...

  7. H5在微信中获取openid

    H5在微信中获取openid 为什么要获取openid openId是用户在当前公众号下的唯一标识('身份证').在微信中进行微信分享.支付等操作时需要用户的openid.H5要在微信中获取到用户op ...

  8. Uniapp 接入微信H5登录,并获取openid和unionid 含Sql、PHP完整代码

    Uniapp 接入微信H5登录,并获取openid和unionid 实现目标:通过微信H5接入微信获取openid和unionid.用户头像,以及实现登录. 实现目标,如图: 具体实现 MySQL代码 ...

  9. 微信获取openId--java

    微信获取openId首先需要获取code,通过code代换出openId.现在我们通过微信测试号来获取openId: 配置好微信测试号后首先需要一个微信号关注测试号 直接通过微信号扫描测试号管理中的测 ...

最新文章

  1. Convolutional-MLPs改造
  2. join 高性能_内置的数据无法实现高性能
  3. 【pyqt5学习】——graphicView显示matplotlib图像
  4. mysql mgr 配置_MySQL5.7 MGR安装配置
  5. springmvc登录拦截器访问报错 SyntaxError: expected expression, got ''
  6. 【GPU编程】基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习
  7. 玩转 SpringBoot 2.x 之使用 SpringDataJpa 篇
  8. Oracle PL/SQL编程之变量
  9. Visual C++ 2010 (中文)学习版 安装教程
  10. 下载qq付费音乐的demo
  11. 千万流量大型分布式系统架构设计实战(干货)
  12. 工业控制系统的体系架构
  13. ttest函数使用方法_TTEST 函数 - EXCEL 2010 中文帮助文档
  14. 优学院大学计算机基础课程答案,标准答案2020优学院形势与政策(全国版)2019-2020学年第一学期...
  15. 高效能人士的七个习惯简介
  16. Windows Home Server V2 Code Name Vail Preview
  17. nyoj-1182旅游【三进制状态压缩dp】
  18. HDU 6069 Counting Divisors
  19. 自己写的一点福利代码(一)
  20. OneNote中英文格式不同,OneNote无法修改英文字体,OneNote默认英文字体为Calibri无法修改的问题。

热门文章

  1. 新手学习DaVinci笔记一:查找资料篇
  2. spring security认证的底层实现
  3. Linux基础(一)----- Linux常用命令
  4. 数据导出到Excel
  5. 【译】 Google: Still in The Search 搜索巨人Google的伟大转变 (四)
  6. Android Service演义
  7. hsf 架构_java分布服务:我打赌,没人可以这么精短的讲出分布服务架构吧
  8. html加载less,javascript – 动态加载less.js规则
  9. maven java archetype_使用Maven Archetype创建Java项目模板
  10. java 执行html里的js_如何用java执行指定页面中的js代码