一、准备

1、一个微信公众号,也可以申请一个测试号。

测试号申请网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

2、云主机,将项目部署在云服务上。

3、设置回调页面。(域名)

微信公众平台开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432

二、获取过程

1、用户同意授权,获取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

解析:appid:公众号的唯一标识(将APPID替换成自己的APPID)

redirect_uri:回页面(将REDIRECT_URI替换成回调页面,我是用的是Controller的路径:

http://域名/项目名/getcode   需要编码,编码方法详见utf-8编码文章)

response_type:返回值类型,值为是code

cope:应用授权作用域,snsapi_base 不弹出授权页面,可以直接跳转,只能获取用户openid,

snsapi_userinfo ,弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只

要用户授权,也能获取其信息 。(我们使用snsapi_userinfo)

替换完成后:访问网址,获取到code值,这个值在5分钟之后失效

2、通过code获得页面授权access_token

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

解析:

appid:公众号的唯一标识(将APPID替换成自己的appid)

secret:替换公众号的appsecret(将SECRET替换成公告中号的appsecret

code:刚刚获取的code值

替换完成后:访问网址,返回:

{ "access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID",

"scope":"SCOPE" }

3、获取用户信息

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

解析:

access_token:替换成access_token的值

openid:替换成openid的值

替换完成后:访问网址,返回用户信息(json数据包)

{    "openid":" OPENID"," nickname": NICKNAME,"sex":"1",    "province":"PROVINCE""city":"CITY","country":"COUNTRY","headimgurl":    "http://thirdwx.qlogo.cn/mmopen/
g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46","privilege":[ "PRIVILEGE1" "PRIVILEGE2"  ],"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

可以看到我们获取到的用户的信息。

三、https工具类

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ConnectException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import net.sf.json.JSONObject;public class Util {/*** 发送https请求* * @param requestUrl 请求地址,获取access_token的网址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpsRequest(String requestUrl, String requestMethod) {JSONObject jsonObject = null;try {// 1.创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 2.从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();//3.创建URL对象,打开连接URL url = new URL(requestUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ssf);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 4.设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);         // 5.从输入流读取返回内容,读的的返回的内容InputStream inputStream = conn.getInputStream();//将字节流转成字符流,然后一行一行的读,每读一行,拼接一次InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuffer buffer = new StringBuffer();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}//打印这个字符串System.out.println("返回信息:"+buffer);// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;conn.disconnect();//转换成json对象jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {System.out.println(ce.toString());//log.error("连接超时:{}", ce);} catch (Exception e) {//log.error("https请求异常:{}", e);System.out.println(e.toString());}return jsonObject;}//写测试。public static void main(String[] args) {//根据code得到accesstoken, openidJSONObject o = httpsRequest("https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx0156cb18976c3f90&secret=1bcb2d21ce527777ca4593bf452f48dc&code=071ZFuGj05fLQn1GszGj00fuGj0ZFuGa&grant_type=authorization_code","GET");      String access_token = o.getString("access_token");String openid = o.getString("openid");//根据accesstoken, openid得到用户信息String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";url = url.replace("ACCESS_TOKEN", access_token);url = url.replace("OPENID", openid);System.out.println(url);JSONObject o2 = httpsRequest(url,"GET");System.out.println("昵称是:"+o2.getString("nickname"));System.out.println("姓名是:"+o2.getString("sex"));System.out.println("头像是:"+o2.getString("headimgurl"));}
}

四、使用

@Controller
public class WeiXinController{@RequestMapping("/getcode")    public String getCode(HttpServletRequest request){//1.得到微信返给的codeString code = request.getParameter("code");//2.根据code得到access_token和openidString url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";url = url.replace("APPID", "wxbf9210646fd3bb89");url = url.replace("SECRET", "9c7874ad52b1f5ba54c5985e52ef1b82");url = url.replace("CODE", code);JSONObject obj = Util.httpsRequest(url, "GET");        //3.根据access_token和openid得到用户信息String url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";url2 = url2.replace("ACCESS_TOKEN", obj.getString("access_token"));url2 = url2.replace("OPENID", obj.getString("openid"));JSONObject obj2 =Util.httpsRequest(url2, "GET");//4.把当前用户信息放在session中request.getSession().setAttribute("userinfo", obj2);       //5. 页面跳转到index.html        return "redirect:index.html";}
}
//发送https请求的MyX509TrustManager类
public class MyX509TrustManager implements X509TrustManager {// 检查客户端证书public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}// 检查服务器端证书public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}// 返回受信任的X509证书数组public X509Certificate[] getAcceptedIssuers() {return null;}
}

访问时,就要先访问获取code的替换信息后的网址。

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

java的微信公众号开发零(授权登陆,版本一)相关推荐

  1. 微信公众号开发之授权

    微信公众号开发之授权 开发前准备 首先准备自己的服务器资源,已有服务器的请忽略服务器资源. 我这里演示新浪云服务器环境搭建:(新注册号有免费云豆可用) 服务器资源(https://sae.sina.c ...

  2. 微信公众号 用户绑定 php,微信公众号开发——网页授权实现简化用户绑定

    本教程的学习条件: 了解微信公众号开发的基本知识.已经申请了微信公众号并设置了开发模式等.如果不了解,请先到微信官方平台学习 需要服务器端开发的基本技能,本文主要讲解流程,基本不涉及具体开发语言. 首 ...

  3. 微信公众号开发之授权登录(前端vue篇)

    前序: 由于之前一直是后端直接调用微信授权后,拿到相关信息后再返回给我(就是以前的前后端不分离),所以对微信公众号开发的微信授权登录还一直处于懵逼情况,直到今天有一个项目需要前后端分离,要前端主动去获 ...

  4. java之微信公众号开发

    微信公众号介绍: 微信公众号分为服务号.订阅号.企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以.而我们所说的微信公众号开发是指的是订阅号和服务号,而官方给的两个号的相关权限的解释: 1. ...

  5. 微信公众号开发-网页授权——配置测试账号

    思路分析: 1.创建测试账号并且配置测试账号的授权回调域名. 2.由前端发起授权请求,微信收到请求后(若是首次打开,并且未关注公众号,微信会弹出授权页,提示用户授权)将重定向到请求url中配置的red ...

  6. 微信公众号开发之授权获取用户信息

    微信开发交流群:148540125 系列文章参考地址 极速开发微信公众号 欢迎留言.转发.打赏 项目源码参考地址 点我点我--欢迎Start 前几篇文章已讲完如何导入项目,如何启动配置项目,如何成为开 ...

  7. url 微信公众号开发 配置失效_微信公众号开发之授权登录

    一.UnionId和openId 微信登录最重要的两个返回信息,一个是UnionId,一个是OpenId.两者之间有着必然的联系. UnionID机制的作用说明:如果开发者拥有多个移动应用.网站应用和 ...

  8. Java 进行微信公众号开发遇到的一些坑

    前言 最近试水了一下微信公众号,花了一天开发,记录下其中的坑,分享给大家.附上公众号二维码,实现讲笑话的功能,欢迎大家关注. 该公众号实现功能: 1.发送任意内容,随机返回笑话 2.笑话调用了网上开发 ...

  9. 微信公众号开发用户授权报“redirect_uri 参数错误“如何处理

    大部分原因是微信公众号后台的网页授权网址有误或者填写不对引起的. redirect_uri域名与后台配置不一致,错误代码:10003 1. 2.

最新文章

  1. ListView中CheckBox使用问题
  2. Linux 内核里的“智能指针”【转】
  3. Eclipse配置 Maven 异常处理
  4. DockOne微信分享( 九十一):打造百亿级数据处理量的弹性调度容器平台
  5. 服务器输入字符在客户端显示,管理 Unicode 服务器与非 Unicode 客户端之间的数据转换...
  6. 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈...
  7. 什么是php工作流,什么是工作流?
  8. django 跳转其他网站_Django 实战 | 搭一个 GitHub 用户展示网站 04
  9. Linux Socket C语言网络编程:Pthread Socket [code from GitHub, for study]
  10. ssh传输越多越慢_Linux下分析网站访问慢原因
  11. eclipse实用编辑快捷键
  12. 影响世界的100个管理定律
  13. 玩转Safari:扩展插件说明
  14. fastboot 操作
  15. 迪杰斯特拉算法和弗洛伊德算法
  16. 商品3D展示来啦,HMS Core3D建模服务助力电商发展
  17. 应用计算机解数学模型之我见,初中数学建模教学之我见
  18. SS2H框架搭建,基础上篇
  19. 【Redis技术探索】「底层架构原理」帮你从底层彻底吃透AOF技术原理(入门第二步)
  20. C++--顺时针打印矩阵

热门文章

  1. 【接口自动化学习笔记】python+requests+excel实现接口自动化
  2. 微信公众号消息列表首次大改版!自媒体“均贫富”前夜?
  3. Win8.1 kb2919355安装不上怎么办?
  4. EGE五子棋(调节窗口大小,悔棋,重开,鼠标点击)
  5. 基于JavaWeb的个人空间个人网站个人博客系统设计与实现
  6. HTML怎么打双引号,双引号怎么打出来
  7. JM(264)基础知识整理
  8. Win7蓝屏代码0X0000007B可能是SATA mode问题
  9. 计算机会议名称和简写(CV/NLP)
  10. java--遇到NoSuchMethodError通用解决思路