1. 程式人生 > >微信開放平臺----微信掃碼登入

微信開放平臺----微信掃碼登入

告知:所有操作是基於域名已備案,並且具有企業級微信公眾號!

1.準備工作

     1.1.註冊微信開放平臺帳號

     1.2.建立應用(網站應用),填寫資料

         注意: 

                  !填寫的域名與備案號必須一致. 

                 !!授權回撥域名必須與微信公共號的授權域名一致

                       微信開放平臺:

                    

                       微信公共平臺:  許可權介面(修改) --->  設定  ----> 填寫域名  !需要將xxx.txt檔案上傳到伺服器根目錄

                        

               !!!整個微信開放平臺填寫資訊的最好是一致的,比如說域名,聯絡人郵箱,

     1.3.申請成為開發者(不申請,沒有許可權呼叫微信掃碼登入介面)

                1.3.1.申請開通

                

               1.3.2.填寫資料

                         !保證資料真實就OK了

               1.3.3.拿命來!,....哦不,是交錢,300大洋

2.微信掃碼登入流程 圖(自己畫的...)

                     可以去看官網啦,這裡自己的理解,還有個問題,這個二維碼對於使用者來說是一個請求到我們伺服器,然後我們伺服器就 會返回一個二維碼給他,但是對於開發人員就不是了,這裡不要給我誤帶了,看看官網就知道了.

              

3.實現

       首先,前端肯定是有一個請求到後臺的,這個請求就是用於獲取微信登入二維碼的.

       3.1.1.前端請求

               例如:<a href="/wexinlogin/xxx">微信登入</a>,當然,後臺肯定是要進行對映的.

       3.2.1.組裝URL,傳送請求到微信

                 3.2.1.1.怎麼組裝?

                              !這個是伺服器向微信開放平臺傳送的,目的就是返回二維碼,供使用者掃.

                 3.2.1.2.怎麼發,拿什麼發?

                               居然是在伺服器上向其它網路獲取資源,那麼必定就是HttpClient(原諒我見識短,大家補充...)

package weixinlogin;

import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/***
* 微信掃碼登入:工具類
*/
public class wexinUtils {
    //引數
    public static final String APPID = "";
    public static final String APPSECRETID = "";
    //回撥地址
    public static final String CALLBACK = "";

    /***
     *
     * @param url :  組裝傳送請求的URL
     * @return
     * 該方法用於傳送請求到微信開放平臺,將返回值轉化為json
     */
    public static JSONObject getjson(String url) throws IOException {

        //初始化JSONObject
        JSONObject jsonObject = null;

        //初始化HttpClient(該物件用於在伺服器內部發送請求)
        DefaultHttpClient client = new DefaultHttpClient();

        //GET請求
        HttpGet httpGet = new HttpGet(url);

        //傳送請求
        HttpResponse response =  client.execute(httpGet);

        //獲取返回結果
        HttpEntity entity  = response.getEntity();

        //內容不為null
        if(entity!=null){
            //轉化字元為為JSON
            String result = EntityUtils.toString(entity,"UTF-8");
            //轉化為Json
            jsonObject =  jsonObject.fromObject(result);
        }
        //釋放
        httpGet.releaseConnection();
     return jsonObject;
    }

}

    !這裡回撥地址,跟之前稽核的哪個沒有一點關係,這個URL是伺服器真實存在的,並且能夠訪問得該資源.而哪個只是一個字串,沒有太多的作用(這是我的看法啦...,真實的希望各位大佬解釋一下啦...)

       3.3.1. 回撥資料怎麼獲取?     

                經歷上次請求後,如果使用者選擇了登入授權,那麼微信開放平臺就會將請求發到之前我們指定的URL去.這個時候就會有CODE返回了,通過這個Code與AppID\SecretID獲取Access_token,就可以獲取到OPENID,這個OPENID就是微信使用者唯一標識,通過這個標識,我們又可以組裝URL,進而獲取當前微信使用者資訊.   

package weixinlogin;

import io.cite.CiteRuntime;
import io.cite.plugin.cookie.cookie;
import io.cite.plugin.database.db;
import net.sf.json.JSONObject;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Map;

/***
 *  微信登入成功回撥,獲取access_token
 */
public class weixincallback {

    public void execute(CiteRuntime runtime) throws IOException, SQLException {

        //請求,響應物件
        HttpServletRequest request = runtime.getRequest();
        HttpServletResponse response = runtime.getResponse();

        //獲取Code
        String Code = request.getParameter("code");

        //通過Code/AppID/SecretID獲取access_token
        String url  ="https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + wexinUtils.APPID +
                "&secret=" + wexinUtils.APPSECRETID +
                "&code=" + Code +
                "&grant_type=authorization_code";

        //傳送請求獲取access_token
        JSONObject jsonobject =  wexinUtils.getjson(url);


        //微信登入使用者標識(用於處理業務)
        String openid = jsonobject.getString("openid");

        //獲取access_token
        String access_token = jsonobject.getString("access_token");


        //組裝獲取使用者資訊URL
        String userinfor  ="https://api.weixin.qq.com/sns/userinfo/access_token?appid=" + access_token + "&openid="+ openid
                            + "&lang=zh_CN";

        //傳送請求,獲取使用者資訊
        JSONObject userinforobj = wexinUtils.getjson(userinfor);

        //業務處理...

    }
}

最終結果: