获取微信openid

openid定义

为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的OpenID。所以一个微信号在一个公众号下的openid是不变的,如果换了一个对应的公众号,那就是另一个openid了。且只有在微信自带浏览器中打开的项目才可获取到。

准备条件

因为一个openid对应一个微信用户一个公众号,所以首先你要有一个公众号,还有一个外网可访问的域名,我的公众号类型是企业号,这里就以企业号为例。

获取openid需要的公众号的 appid 和 secret(登陆公众平台 开发----->基本配置中的开发者ID(AppID)和 开发者密码(AppSecret)就是)。

其次是设置网页授权域名(登陆公众平台 设置----->公众号设置------>功能设置----->网页授权域名 按步骤操作并设置就好),这个域名就是你获取openid的web项目发布的域名,这里注意服务器请一定跑在80端口

基本流程:

openid作为用户信息的一部分,要获取到需要调用微信两个开放授权接口,接口遵循OAuth 2.0协议。开放授权标准允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用,也就是我们常用的微信登录、微博登录等等,英文好的同学可以看看OAuth 2.0 Authorization Framework。

我整理了一下整体的流程,画了一个时序图。

[图片上传失败...(image-88fd53-1530609529394)][图片上传失败...(image-dbf507-1530609470358)]

其中两次调用了微信嗯验证服务器。

  1. 调用open.weixin.qq.com/connect/oau… 接口获取到code,注意这个接口只获取openid,scope参数设置为snsapi_base,这样不需要用户确认和关注公众号。

不知道你有没有疑问,为什么不直接获取openId,还需要获取一个code呢?

是因为code相当于一个临时票据,能够验证失效时间、可获取信息的内容、微信用户、appid等等。

  1. 得到code作为一个参数,加上appId和appsecret,调用api.weixin.qq.com/sns/oauth2/… 接口获取到openid。

注意,appsecret是比较重要的参数要放到后台进行请求。返回的重要参数又openId和access_token,用openId和access_token可以获取用户的基本信息,位置性别等等等,我们这里只讲获取openId,原理类似,想看参考微信网页授权。

代码

前端

  function openId(){//测试var callbackUrl = link.skip + itemId;var appid = link.appid;var redirect_uri = encodeURI(callbackUrl);var code = requestUtil.getParameter('code');if (code && localStorage.getItem('code') != code) {//微信回调含code调用免登陆接口,否则跳转微信验证$.ajax({type: 'get',url: link.path+"/v1/wechatUser/info?code=" + code,async: false,success: function (res) {if(res.code == 1000) {localStorage.setItem('code', code);var openId = res.data.openId;localStorage.setItem('openId', openId);}}});} else {window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appid + '&redirect_uri=' + redirect_uri  + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect';}}
复制代码

后端

    public void getOpenId(HttpServletRequest request, HttpServletResponse response,String code) throws UnsupportedEncodingException {response.setContentType("text/html");request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");Map params = new HashMap();params.put("secret", "");params.put("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.parseObject(result);String openid = jsonObject.get("openid").toString();System.out.println("得到的openid为:"+openid);}
复制代码
 static class HttpGetUtil {public static String httpRequestToString(String url,Map 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 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);//设置请求方式,默认为GETconn.setRequestMethod("GET");is = conn.getInputStream();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return is;}}
复制代码

问题补充

authorize接口:

  1. authorize接口,只能通过微信,或者微信开发这工具打开(需要加开发权限)。

access_token接口:

  1. 如果返回40163错误,是因为code已经被用过,code只有一次生命,用完作废。如果出现了code请检查一下接口1相关的代码,是不是对code进行了保存等等。

感谢

感谢各位看完这篇文章,如果有问题或不清楚直接留言,或者加vx34108314。

转载于:https://juejin.im/post/5ccf9743e51d456e5238ca45

如何获取微信openId相关推荐

  1. 微信公众号开发系列-获取微信OpenID

    在微信开发时候在做消息接口交互的时候需要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID,接收事件推送方式和网页授权获取用户基本信息方式获取. 1.通过接收被动消息方式获 ...

  2. 微信开放平台 获取微信openid和unionid

    <?php //官方文档 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login ...

  3. vue获取微信登陆权限_vue 授权获取微信openId操作

    1.获取url中参数code: 根据code 获取openId:调用后台接口获取openId . function getUrlKey(name){//获取url 参数 return decodeUR ...

  4. PHP获取微信openid(静默式不需要用户同意)!

    业务需求 因为需要在用户没有关注公众号的情况下获取用户openid,又不需要用户关注,所以需要静默获取一下用户的openid.前提是你需要在微信内打开. 相关代码 以snsapi_base为scope ...

  5. uniapp云开发云函数获取微信openid

    产品类型:目前只有微信小程序. 目标:授权登录,建立用户体系. 框架:uniapp+云开发+云函数. 方案一:通过官方提供的 univerify 插件 官方文档:uni一键登录 - uni-app官网 ...

  6. 域名微信拦截html代码,多域名下获取微信openId,通过拦截器注解实现,减少代码量以及业务混淆...

    一个注解,一个拦截器,还有一个中转html页(来源网上,稍微修改),原理看拦截器的类注解.package com.xxx.admin.interceptor; import com.xxx.core. ...

  7. SpringBoot获取微信openid(java)

    工具类 public class ComonUtils {public static StringBuffer appendUrl(StringInput code) {StringBuffer in ...

  8. 获取微信openid

    其实原理上讲,可以批量获取openid后,逐条匹配详细信息,并保存到本地,然后找出你需要的用户openid信息. 然而,今天网上偶然发现神人们居然有各种招式 https://www.zhihu.com ...

  9. uniapp获取微信openid - 微信提现 - 登录授权 - AndroidStudio离线打包微信登陆

    效果图 主要步骤 (详细步骤有配图) 登录微信开放平台,获取AppID + AppSecret https://open.weixin.qq.com/

最新文章

  1. 13JavaScript中的简单数据类型与复杂数据类型
  2. 题目1171:C翻转
  3. js中const,var,let区别
  4. linux:exec族函数, exec族函数配合fork使用,system 函数,popen 函数
  5. MySQL的一级索引和二级索引介绍,HBase中提到的二级索引【笔记自用】
  6. WinSock2编程之打造完整的SOCKET池
  7. Linux中的文件搜索 locate,find,grep ,whereis和which命令的使用
  8. ASP.NET Core 指定环境发布(hosting environment)
  9. linux用户密码转换为明文,Linux运维知识之linux下抓取内存中明文密码mimipenguin
  10. linux实验总结及心得_安全实验室 | 内网渗透—Linux权限维持技巧总结
  11. 广告创意还是侮辱女性?全棉时代卸妆巾广告被骂上热搜......
  12. es6 数组去重_《前端算法系列》数组去重
  13. PHP与Javascript的混合测试
  14. php_D3_“简易聊天室 ”实现的关键技术 详解
  15. Picture exceed the maximum allowable rotation range
  16. 企业软件是最难编写的软件
  17. APE转MP3的转换码率说明
  18. 虚拟化VMware简介5——DRS 与 DPM 详解
  19. idea当中批量替换变量名字
  20. 编码首行缩进使用Tab键好还是空格好?

热门文章

  1. Google的Java开发规范
  2. 零基础Java学习之数组
  3. linux 把命令行结果赋值给变量;linux if语句 ; command log
  4. 用进化算法来优化SVM的参数C和Gamma——利用SCOOP库进行分布式加速计算
  5. swust oj 962
  6. luogu 2051 中国象棋
  7. OpenCV实时美颜摄像并生成H264视频流
  8. asp.net C#生成和解析二维码代码
  9. 弹出无toobar的网页
  10. DateGridView的外观美化