1. 程式人生 > >微信支付之獲得openid(主動獲得和被動獲得)

微信支付之獲得openid(主動獲得和被動獲得)

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();
        }
    }*/




}