微信支付之獲得openid(主動獲得和被動獲得)
阿新 • • 發佈:2019-01-23
1、主動獲得:通過網頁授權獲得openid 在攔截器中獲取存放到session中
2、被動獲得:通過使用者的動作微信會向程式傳送xml,通過解析xml獲得個人資訊 流程如下:
點選公眾號的按鈕—->微信向程式傳送xml—解析出使用者資訊
一、主動獲取
設定攔截器
//這個是網頁授權的地址
public static String Auth_Url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect" ;
package com.team.weixin.filter;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse ;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.team.weixin.model.Code_ge_user_info;
import com.team.weixin.model.WeixinContext ;
import com.team.weixin.model.WinxinFinalValue;
import com.team.weixin.util.WeixinUtil;
public class WeixinFilter implements Filter{
private static final Logger log = Logger.getLogger(WeixinFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest hRequest = (HttpServletRequest) request;
HttpServletResponse hResponse = (HttpServletResponse) response;
String agent = hRequest.getHeader("User-Agent");
if (agent != null && agent.toLowerCase().indexOf("micromessenger") >= 0) {
String code = request.getParameter("code");
String state = request.getParameter("state");
log.info("code:" + code + " state:" + state);
String path = hRequest.getRequestURL().toString();
String query = hRequest.getQueryString();
if (query != null) {
path = path + "?" + query;
}
log.info("path:"+path);
/**
* TODO域名修改
*/
if(!path.contains("toindex")){//攔截
chain.doFilter(hRequest, hResponse);
return;
}
if (code != null && state != null && state.equals("1")) {//授權過
// 通過Code獲取openid來進行授權
String openid = null;
try {
openid = WeixinUtil.ge_openid_by_code(code);
log.info("[doFilter] openid:"+ openid);
if (StringUtils.isNotEmpty(openid)) {
hRequest.getSession().setAttribute("openid", openid);
}
} catch (Exception e1) {
log.info("catch exception :"+e1.getMessage());
if(!path.contains("toindex")){
hResponse.sendRedirect(path);
}
}
} else {//沒授權過
String uri = WinxinFinalValue.Auth_Url;
uri = uri.replace("APPID", WinxinFinalValue.AppID)
.replace("REDIRECT_URI",URLEncoder.encode(path, "UTF-8"))
.replace("SCOPE", "snsapi_userinfo")
.replace("STATE", "1");
log.info("[沒授權過]"+uri);
System.out.println();
hResponse.sendRedirect(uri);
return;
}
}
chain.doFilter(hRequest, hResponse);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
二、被動獲取 在初始化微信的servlet裡邊獲得 post方法下是微信返回的xml 解析xml就得到了使用者資訊
package com.team.weixin.init;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.http.client.ClientProtocolException;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.google.gson.JsonObject;
import com.team.exception.CustomException;
import com.team.model.SysUser;
import com.team.service.SysUserService;
import com.team.weixin.model.ReceiveXmlEntity;
import com.team.weixin.model.WeixinContext;
import com.team.weixin.model.WinxinFinalValue;
import com.team.weixin.util.Jackson;
import com.team.weixin.util.SecurtiyKit;
import com.team.weixin.util.WeixinUtil;
import net.sf.json.JSONObject;
@Controller
public class IntiWexin {
@Resource
private SysUserService sysUserService;
@RequestMapping(value = "/wget", method = RequestMethod.GET)
public void init_weixin(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
String[] arrs = { WinxinFinalValue.Token, timestamp, nonce };
Arrays.sort(arrs);
StringBuffer sbf = new StringBuffer();
for (String a : arrs) {
sbf.append(a);
}
String sha1 = SecurtiyKit.sha1(sbf.toString());
System.out.println(sha1.equals(signature));
if (sha1.equals(signature)) {
resp.getWriter().write(echostr);
}
}
@RequestMapping(value = "/wget", method = RequestMethod.POST)
public void geInfo(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String str = null;
StringBuilder strxml = new StringBuilder();
while ((str = br.readLine()) != null) {
System.out.println(str);
strxml.append(str);
}
ReceiveXmlEntity rxe = WeixinUtil.getMsgEntity(strxml.toString());
WinxinFinalValue.OpenId=rxe.getFromUserName();
session.setAttribute("p", 444);
// init_user(rxe);
}
// 初始化使用者 //獲取使用者的 基本資訊 放到資料庫裡
/*public void init_user(ReceiveXmlEntity rxe) {
String urls = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + WeixinContext.getAccess_token()
+ "&openid=" + rxe.getFromUserName() + "&lang=zh_CN";
try {
String s_user = WeixinUtil.to_get(urls);
//ge_user_info
SysUser user = WeixinUtil.ge_user_info(Jackson.json_to_map(s_user));
try {
//對接自己的程式
SysUser sysUser=new SysUser();
sysUser.setOpenid(user.getOpenid());
List<SysUser> list=sysUserService.list(sysUser);
//判斷使用者是否關注
if(list.size()>0&&list!=null){
//不做處理
}else{
sysUserService.add(user);
}
} catch (CustomException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
}