1. 程式人生 > >微信網頁授權訪問實現方式,根據授權獲取微信openid

微信網頁授權訪問實現方式,根據授權獲取微信openid

在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的開發者中心頁配置授權回撥域名。請注意,這裡填寫的是域名(是一個字串),而不是URL,因此請勿加 http:// 等協議頭。

(1)登陸微信公眾號後臺,點選許可權介面點修改如圖:


(2)修改如圖


配置時要下載個MP_verify_BZf0ox6nPYbl3Fdv.txt檔案放到授權web專案下,部署的時候放到webapps/weixinpt目錄下面。說明:是地址加專案名:本次是weixinpt舉例的

在微信端填的url:標準

注意:redirect_uri地址必須urlencode處理

處理:這個地址是給微信公眾號的地址,要把地址裡面的紅色值換掉,你現在用的微信公眾號的appid的值。redirect_uri

地址要urlencode編碼再換到地址裡面去。把上面的地址放到,微信公眾號後臺自定義選單裡面

程式碼實現:

<script type="text/javascript">
	
	 var ls_openid="";
	 function getopenid()
	 { 
	  var APPID='<%=APPID %>';
	  var SECRETID='<%=SECRETID %>';
	  var path = "<%=request.getContextPath() %>/OAuth2Service?code=<%=request.getParameter("code").toString()%>&appid="+APPID+"&secret="+SECRETID;
	 
	   $.ajaxSetup({  
	     async : false  
	  });
	   
      $.get(path,function(data){	  	 
	  	 ls_openid=data;
	  	 loginopenid(ls_openid);
	  });  
    
	 }
	  function loginopenid(ls_openid){
var url = "<%=request.getContextPath() %>/wxIdLonginAction.do?wxid="+ls_openid;
 window.location.href=url;
 
 }
	 </script>

web.xml檔案配置
<servlet>
	<servlet-name>OAuth</servlet-name>
	<servlet-class>cn.com.zhongway.im.wechat.OAuth</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>OAuth</servlet-name>
	<url-pattern>/OAuth</url-pattern>
</servlet-mapping>
java類
/***********************************************************************
 * Module:  PublicAction.java
 * Author:  Administrator
 * Purpose: Defines the Class PublicAction
 ***********************************************************************/

package cn.com.zhongway.im.wechat;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.log4j.Logger;
import com.sun.corba.se.spi.legacy.connection.Connection;
public class OAuth extends HttpServlet {


	/**
	 * 通過code換取網頁授權access_token,根據授權返回頁面獲取的code值獲取openid
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
	
		String wxCode = request.getParameter("code");
        String appid =  request.getParameter("appid");
        String secret = request.getParameter("secret");
        //第一次請求 獲取access_token 和 openid
        String requestUrl = "";
        String oppid="";
        JSONObject oppidObj =null;
        String access_token ="";
        String openid ="";
        String requestUrl2="";
        String userInfoStr="";
        JSONObject wxUserInfo=null;
		try {
			 //獲取code後,請求以下連結獲取access_token
			 requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code="+wxCode+"&grant_type=authorization_code";
			 oppid = new HttpRequestor().doGet(requestUrl);
			 oppidObj =JSONObject.fromObject(oppid);
			 //獲取access_token
	         access_token = (String) oppidObj.get("access_token");
	         //獲取openid
	         openid = (String) oppidObj.get("openid");
	         //測試輸出
	         request.setAttribute("openid", openid);
	        //response.getWriter().print("openid:"+openid);
	         //拉取使用者資訊(需scope為 snsapi_userinfo)就是微信平臺填的連結,
	         //scope:snsapi_base (不彈出授權頁面,直接跳轉,只能獲取使用者openid)
	         //snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能獲取其資訊)
             /*requestUrl2 = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid+"&lang=zh_CN";
             userInfoStr = new HttpRequestor().doGet(requestUrl2);
             wxUserInfo =JSONObject.fromObject(userInfoStr);*/
             response.getWriter().print(openid);
             response.getWriter().flush();
		     response.getWriter().close();
	        
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
		

	}

	
	
	

	@Override
	public void destroy() {
		super.destroy();
	}

	@Override
	public void init() throws ServletException {
		super.init();
	}

	public boolean isChinese(String str) {
		boolean result = false;
		for (int i = 0; i < str.length(); i++) {
			int chr1 = (char) str.charAt(i);
			if (chr1 >= 19968 && chr1 <= 171941) {// 漢字範圍 \u4e00-\u9fa5 (中文)
				result = true;
			}
		}
		return result;
	}
	
	private Map pubErrorContent(Exception e,String id){
		Map errorcontent = new HashMap();
		String[] es = e.toString().split(":");
		String type = "";
		String keywords = "";
		String content = "";
		for(int i = 0 ; i < es.length ; i++){
			if(i==0){
				type = es[i];
			}
			if(i==1){
				keywords = es[i];
			}
			if(i==3){
				keywords = es[i];
			}
		}
		errorcontent.put("id", id);
		errorcontent.put("type", type);
		errorcontent.put("keywords", keywords);
		errorcontent.put("content", content);
		return errorcontent;
	}
	
	private Map pubInfoContent(String keywords,String info){
		return null;
	}
	
}

請求類
package cn.com.zhongway.im.wechat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.Map;
/**
 *處理OAuth2Service類微信連結url的的工具類,自己能處理可以不呼叫
 */
public class HttpRequestor {
	 private String charset = "utf-8";
	    private Integer connectTimeout = null;
	    private Integer socketTimeout = null;
	    private String proxyHost = null;
	    private Integer proxyPort = null;
	 
	    /**
	     * Do GET request
	     *
	     * @param url
	     * @return
	     * @throws Exception
	     * @throws IOException
	     */
	    public String doGet(String url) throws Exception {
	 
	        URL localURL = new URL(url);
	 
	        URLConnection connection = openConnection(localURL);
	        HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
	 
	        httpURLConnection.setRequestProperty("Accept-Charset", charset);
	        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
	 
	        InputStream inputStream = null;
	        InputStreamReader inputStreamReader = null;
	        BufferedReader reader = null;
	        StringBuffer resultBuffer = new StringBuffer();
	        String tempLine = null;
	 
	        if (httpURLConnection.getResponseCode() >= 300) {
	            throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
	        }
	 
	        try {
	            inputStream = httpURLConnection.getInputStream();
	            inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
	            reader = new BufferedReader(inputStreamReader);
	 
	            while ((tempLine = reader.readLine()) != null) {
	                resultBuffer.append(tempLine);
	            }
	 
	        } finally {
	 
	            if (reader != null) {
	                reader.close();
	            }
	 
	            if (inputStreamReader != null) {
	                inputStreamReader.close();
	            }
	 
	            if (inputStream != null) {
	                inputStream.close();
	            }
	 
	        }
	 
	        return resultBuffer.toString();
	    }
	 
	    /**
	     * Do POST request
	     *
	     * @param url
	     * @param parameterMap
	     * @return
	     * @throws Exception
	     */
	    public String doPost(String url, Map<?, ?> parameterMap) throws Exception {
	 
	        /* Translate parameter map to parameter date string */
	        StringBuffer parameterBuffer = new StringBuffer();
	        if (parameterMap != null) {
	            Iterator<?> iterator = parameterMap.keySet().iterator();
	            String key = null;
	            String value = null;
	            while (iterator.hasNext()) {
	                key = (String) iterator.next();
	                if (parameterMap.get(key) != null) {
	                    value = (String) parameterMap.get(key);
	                } else {
	                    value = "";
	                }
	 
	                parameterBuffer.append(key).append("=").append(value);
	                if (iterator.hasNext()) {
	                    parameterBuffer.append("&");
	                }
	            }
	        }
	 
	        System.out.println("POST parameter : " + parameterBuffer.toString());
	 
	        URL localURL = new URL(url);
	 
	        URLConnection connection = openConnection(localURL);
	        HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
	 
	        httpURLConnection.setDoOutput(true);
	        httpURLConnection.setRequestMethod("POST");
	        httpURLConnection.setRequestProperty("Accept-Charset", charset);
	        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
	        httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterBuffer.length()));
	 
	        OutputStream outputStream = null;
	        OutputStreamWriter outputStreamWriter = null;
	        InputStream inputStream = null;
	        InputStreamReader inputStreamReader = null;
	        BufferedReader reader = null;
	        StringBuffer resultBuffer = new StringBuffer();
	        String tempLine = null;
	 
	        try {
	            outputStream = httpURLConnection.getOutputStream();
	            outputStreamWriter = new OutputStreamWriter(outputStream);
	 
	            outputStreamWriter.write(parameterBuffer.toString());
	            outputStreamWriter.flush();
	 
	            if (httpURLConnection.getResponseCode() >= 300) {
	                throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
	            }
	 
	            inputStream = httpURLConnection.getInputStream();
	            inputStreamReader = new InputStreamReader(inputStream);
	            reader = new BufferedReader(inputStreamReader);
	 
	            while ((tempLine = reader.readLine()) != null) {
	                resultBuffer.append(tempLine);
	            }
	 
	        } finally {
	 
	            if (outputStreamWriter != null) {
	                outputStreamWriter.close();
	            }
	 
	            if (outputStream != null) {
	                outputStream.close();
	            }
	 
	            if (reader != null) {
	                reader.close();
	            }
	 
	            if (inputStreamReader != null) {
	                inputStreamReader.close();
	            }
	 
	            if (inputStream != null) {
	                inputStream.close();
	            }
	 
	        }
	 
	        return resultBuffer.toString();
	    }
	 
	    private URLConnection openConnection(URL localURL) throws IOException {
	        URLConnection connection;
	        if (proxyHost != null && proxyPort != null) {
	            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
	            connection = localURL.openConnection(proxy);
	        } else {
	            connection = localURL.openConnection();
	        }
	        return connection;
	    }
	 
	    /*
	     * Getter & Setter
	     */
	    public Integer getConnectTimeout() {
	        return connectTimeout;
	    }
	 
	    public void setConnectTimeout(Integer connectTimeout) {
	        this.connectTimeout = connectTimeout;
	    }
	 
	    public Integer getSocketTimeout() {
	        return socketTimeout;
	    }
	 
	    public void setSocketTimeout(Integer socketTimeout) {
	        this.socketTimeout = socketTimeout;
	    }
	 
	    public String getProxyHost() {
	        return proxyHost;
	    }
	 
	    public void setProxyHost(String proxyHost) {
	        this.proxyHost = proxyHost;
	    }
	 
	    public Integer getProxyPort() {
	        return proxyPort;
	    }
	 
	    public void setProxyPort(Integer proxyPort) {
	        this.proxyPort = proxyPort;
	    }
	 
	    public String getCharset() {
	        return charset;
	    }
	 
	    public void setCharset(String charset) {
	        this.charset = charset;
	    }

}


相關推薦

網頁授權訪問實現方式根據授權獲取openid

在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的開發者中心頁配置授權回撥域名。請注意,這裡填寫的是域名(是一個字串),而不是URL,因此請勿加 http:// 等協議頭。 (1)登陸微信公眾號後臺,點選許可權介面點修改如圖: (2)修改如圖 配置時要

中呼叫開啟手機預設瀏覽器開啟指定網頁URL的實現方式

微信跳轉瀏覽器提示的實現方式最近遇到一個需求、朋友找我製作一個在微信中的聊天框,或者公眾號選單釋出一條連結或者二維碼,。跳出微信開啟一個指定的我們自己的頁面,拿到這個需求後我們團隊分開去找資料研究方案,通過微信的開發文件、騰訊的第三方開發文件我們都查閱過資料但是最終只找到一些歷史性的資料也就是以前可以現在已經

網頁開發的一些感想順便附上中呼叫掃一掃史上最簡便的方法 5行程式碼實現H5掃一掃 HTML5掃一掃最簡便的辦法

呼叫範例完整程式碼下載: csdn的這個博文寫的有點囉嗦,建議移步這裡: 在網頁上點一個按鈕或者連結呼叫微信掃一掃然後返回結果我們繼續處理,很多人應該都會有這樣的需求,不過微信對這個空子比較嚴格,需要你的網頁有簽名,而簽名生成需要有一個微信公眾號的appk

域名檢測PHP隨機獲取能正常訪問的域名

curl return cti pan tran and .html col exe 用戶名和KEY請到www.weixin139.com獲取 <?php $url = "https://api.weixin139.com/weixin/domain/auto_ch

dubbo-monitor安裝監控中心管理控制臺安裝網頁一直訪問不到解決bug的方式記錄

log image 不能 控制臺 div tor png class clas 問題再現 第一步,重啟機器 第二步,按照dubbo-monitor需要開啟的服務,順序逐一進行啟動,之前的推翻全部重新再走一遍就通了,千萬不能死磕。。。很浪費時間。。。。 通過打印日誌追蹤

網頁全屏實現

/* 螢幕 */ function Screen() { //自動調整 this.resize = function (type, num) { var setFontSize = function () {

第五天-css基礎(浮動 網頁布局 定位方式清除定位)

gin 相對 hid col 絕對定位 左右 color 問題 oot 基礎知識-css第五天,今天學習了css主要知識浮動,和定位,都是關於網頁布局的。這個2塊知識用好了,後期做好看的動畫,布局就不成問題了。 浮動left 浮動的框可以向左或是向右移動,直到它的邊緣碰到包

即時通常見的幾種方式此處只做學習記錄

維護 時間 最簡 安裝 記錄 htm websocket 雙向 new 1. 輪詢 利用ajax每隔一段時間就請求一次服務器,服務器返回數據。 優點:最簡單的解決方案 缺點:對服務器壓力很大,浪費帶寬 2. 長輪詢 利用ajax請求服務器,當有數據變化

Python裏面幾種排序算法的比較sorted的底層實現雖然我們知道sorted的實現方式但是

增長 歸並排序 sha __main__ 代碼 復雜 位置 好的 strong 算法與數據結構基礎 原文鏈接:http://note.youdao.com/noteshare?id=7b9757930ce3cc9e0a5e61e4d0aa9ea2&sub=2726FFA02

bootstrap 多選按鈕實現方式js,jQuery刪除陣列中指定元素

bootstrap有許多,非常漂亮的設計,不用自己苦惱於css 的使用。 bootstrap使用,實現多選方法: 1、使用bootstrap的表格標籤,表格內容為PHP返回前端資料, <table class="table table-hover table-bordered"

懸浮佈局的最差實現方式懸浮頭部實現viewpager巢狀滑動

給部分程式碼看個大概實現,繼承 linearLayout,自己處理滑動,自己計運算元佈局中第一個佈局為摺疊部分。 其實,用scrollview,將listview以及懸浮部分高度設定為螢幕高度,效果直接,省事,滑動體驗更好。巢狀佈局也沒有滑動衝突 public class Scrollabl

單例模式最好的單例實現方式靜態內部類的方式

單例模式的優點: 1.在記憶體中只有一個物件,節約記憶體 2.避免頻繁的建立和銷燬物件,可以提高效能 3.避免對共享資源的多重佔用 4.可以全域性訪問 適用場景: 1.需要頻繁例項化然後銷燬的物件 2.

lua中class的一種實現方式單例擴充

方式 tab 方法 span 實用 ble 核心 攔截 說我 先上代碼 1 local _class={} 2 3 function class(super,singleton) 4 local class_type={} 5

wangEditor 修改 “視訊”選單 的實現方式達到上傳視訊的功能---完整版

(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory()

瀑布流的實現方式移動端的瀑布流資料多列表渲染方式

效果請看:連結 程式碼請看:連結 問題: 在H5的移動端開發中,經常會遇到類似瀑布流的佈局,近期做了一下總結。 大致有三種實現方式: 1. css3的column屬性實現 2. jquery,對高做陣列處理的定位型方式 3. js,對高做陣列處

【Android】android開發之splash閃屏頁的四種實現方式啟動頁的實現教程。

作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 首先給大家看一下今天實現的效果圖(其他三種都差不太多底下詳細介紹): 這個啟動頁實現的方法是四種,兩種是利用handler,其它兩種是利用了動畫的方式。 具體給大家貼一下

UIScrollView的自動佈局最簡單實現方式不用一句程式碼即可滾動

首先建立一個故事板,名字隨意,我取名叫Scroll.storyboard. 在右下角系統的元件庫中拖入一個viewcontroller,並設定為初始載入檢視控制器。具體為 然後在viewcontroller裡拖入一個scoll view,拖動scorllview的上下左右

wangEditor 修改 “視訊”選單 的實現方式達到上傳視訊的功能---精簡版

/* menu - video */ // 建構函式 function Video(editor) { this.editor = editor; this.$elem = $('<div class="w-e-menu"><i cl

mysql 新增使用者並授權訪問指定資料庫同時限制登入為指定IP段

記錄下以備查。 create user 'user'@'192.168.104.%' identified by '******'; create database database; grant a

分散式鎖的多種實現方式你瞭解嗎?

為什麼要使用分散式鎖? 在網際網路中很多場景下,我們為了保證資料的一致性,需要保證同一個方法,在同一時間,只能有一個執行緒在執行。這在單機環境中,我們有很多辦法實現,在java.util.concurrent包下,java提供了很多併發相關API,但這些API在分散式場景下