天天看点

微信公众号开发之授权登录

微信公众号开发之授权登录

1、微信公众号技术开发文档阅读

微信公众号的开发首先对开发文档的阅读,技术版本可能有变化,博客里面的内容一段时间过后,可能就出现有些小问题。

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

2、微信公众号开发工具

微信公众号开发工具,可以使用微信web开发者工具,可以很好的模拟微信公众号开发的大部分功能(微信公众号支付不行,目前,其他,如授权登录,消息模板,地理位置等等都是可以的)。

微信web开发者工具:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140

微信公众号开发之授权登录

只要关注就行,使用测试号,其他的账号使用需要关注你的测试号才能使用。

3、授权登录开发准备

3.1、使用第三方工具,生成内网映射,可以使用花生壳,生成一个可用的域名,在授权的时候使用

花生壳地址:https://hsk.oray.com/

3.2、可以使用微信公众号的测试号,项目上线请申请认证号,认证需要一些费用,但对于微信公众号的大部分的功能实现,已经足够了,目前微信公众号开发的微信支付是不支持的。

申请测试账号,微信公众平台:https://mp.weixin.qq.com/

微信公众号开发之授权登录

3.3、微信公众号授权登录的微信开发配置,网页授权获取用户基本信息修改

微信公众号开发之授权登录

域名是从花生壳中获取,在授权回调页面域名中不要加上http://,目前微信公众号开发的配置路径都是一样,不要添加http://

微信公众号开发之授权登录

这边有一个注意的地方,认证号即上线的时候微信公众号授权登录,需要上传一个文件到服务器中,这个在微信公众号认证号的配置的时候是有提示的,只需要上传认证文件,到服务器就行了。

4、微信授权登陆开发的步骤

1 第一步:用户同意授权,获取code

2 第二步:通过code换取网页授权access_token、openid

3 第三步:刷新access_token(如果需要)

4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

snsapi_base: 到第二步就结束了,获取到openid,其他操作在这个基础上(比如记录该用户访问时间次数信息)

snsapi_userinfo: 获取openid和用户资料(昵称、头像、国、省、城市、性别、权限)

第一步:

@RequestMapping("loginInit.do")
public String loginInit(HttpServletRequest request,HttpServletResponse response)  {
	    //回调地址,要跟下面的地址能调通(getWechatGZAccessToken.do)
	    String backUrl="http://3261045722cwy.vicp.io/wx/getWechatGZAccessToken.do";
	    /**
		*这儿一定要注意!!首尾不能有多的空格(因为直接复制往往会多出空格),其次就是参数的顺序不能变动
	    **/
	    //AuthUtil.APPID微信公众号的appId
	    String url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + AuthUtil.APPID+
				"&redirect_uri=" + URLEncoder.encode(backUrl,"UTF-8")+
				"&response_type=code" +
				"&scope=snsapi_userinfo" +
				"&state=STATE#wechat_redirect";
	    return "redirect:"+url;
}
           

下面就可以实现了,对于微信公众号一般做免登陆,可以将用户跟openid,进行绑定,查询是否已经绑定,从而不用进行用户登陆

@RequestMapping("getWechatGZAccessToken.do")
public String getWechatGZAccessToken(HttpServletRequest request,HttpServletResponse response) throws Exception{
		//微信公众号的APPID和APPSECRET
		String code=request.getParameter("code");
        String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + AuthUtil.APPID+
                "&secret=" +AuthUtil.APPSECRET+
                "&code=" +code+
                "&grant_type=authorization_code";
        String result = HttpClientManager.getUrlData(url);
		Map<String,Object> data = JSONObject.fromObject(result);
        String openid=data.get("openid").toString();
        String token=data.get("access_token").toString();
        //获取信息
        String infoUrl="https://api.weixin.qq.com/sns/userinfo?access_token=" +token+
                "&openid=" +openid+
                "&lang=zh_CN";
        String infoResult = HttpClientManager.getUrlData(infoUrl);
        
	}           

 HttpClientManager工具类

package com.baosteel.qcsh.wap.controllers.thirdpartylogin.wechat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class HttpClientManager {
	/**
	 * 执行url请求数据
	 * 
	 * @param urlStr
	 * @return
	 * @throws Exception
	 * @throws IOException
	 */
	public static String getUrlData(String urlStr) throws Exception {
		URL url = new URL(urlStr);
		URLConnection connection = url.openConnection();
		// 一旦发送成功,用以下方法就可以得到服务器的回应:
		String sCurrentLine = "";
		StringBuffer sTotalString = new StringBuffer();
		InputStream l_urlStream = connection.getInputStream();
		// 传说中的三层包装阿!
		BufferedReader l_reader = new BufferedReader(new InputStreamReader(
				l_urlStream, "UTF-8"));
		while ((sCurrentLine = l_reader.readLine()) != null) {
			sTotalString.append(sCurrentLine);
		}
		return sTotalString.toString();
	}

	/**
	 * 执行url请求数据
	 * 
	 * @param urlStr
	 * @return
	 * @throws Exception
	 * @throws IOException
	 */
	public static String postUrlData(String urlStr, String data)
			throws Exception {
		URL url = new URL(urlStr);
		HttpURLConnection http = (HttpURLConnection) url.openConnection();
		http.setRequestMethod("POST");
		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
		OutputStream os = http.getOutputStream();
		os.write(data.getBytes("UTF-8"));// 传入参数
		os.flush();
		os.close();
		// 一旦发送成功,用以下方法就可以得到服务器的回应:
		String sCurrentLine = "";
		String sTotalString = "";
		InputStream l_urlStream = http.getInputStream();
		// 传说中的三层包装阿!
		BufferedReader l_reader = new BufferedReader(new InputStreamReader(
				l_urlStream, "UTF-8"));
		while ((sCurrentLine = l_reader.readLine()) != null) {
			sTotalString += sCurrentLine;
		}
		return sTotalString;
	}
}
           

继续阅读