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 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;
}
}