1. 程式人生 > >java實現微信公眾號授權登入獲取使用者資訊流程

java實現微信公眾號授權登入獲取使用者資訊流程

參考地址微信公眾號開發文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432

前提:需要申請認證的微信公眾號;獲取對應的APPID和APPSECRET;並且還需要獲取到使用者資訊許可權(點選“修改“新增伺服器的域名地址),前期工作安裝測試賬號為例給大家展示下:

1)、公眾測試賬號獲取

  登入完即可獲取到一個測試公眾賬號的資訊。主要有appId和appsecret兩個引數,這將唯一標示一個公眾號,並且需要將他們作為引數獲取使用者的資訊。

2)、關注公眾號

   使用者只有關注了這個公眾號了,才能通過開啟有公眾號資訊的連結去授權第三方登入,並獲取使用者資訊的操作。故我們還需要用我們的微信關注微訊號,操作如下:   還是剛剛那個登入成功後跳轉的頁面,我們可以看到,該頁面有一個二維碼,我們可以通過掃描該二維碼進行關注,關注成功在右邊的“使用者列表”會多一個使用者的資訊。如下圖所示:

3)配置回撥函式   我們在微信客戶端訪問第三方網頁(即我們自己的網頁)的時候,我們可以通過微信網頁授權機制,我們不僅要有前面獲取到的appid和appsecret還需要有當使用者授權之後,回撥的域名設定,即使用者授權後,頁面會跳轉到哪裡。具體的配置如下:

  還是在剛剛的頁面,有一個“網頁授權獲取使用者基本資訊”,點選後面的修改

     填寫回調的域名:   如果你的網址沒有被列入過黑名單,就會在頂部出現
 然後,域名配置就成功了!可以進行開發了。

一。授權開發的流程(詳情的東西請以官網為準,在此就不多說了):具體而言,網頁授權流程分為四步:

1、引導使用者進入授權頁面同意授權,獲取code

2、通過code換取網頁授權access_token(與基礎支援中的access_token不同)

3、如果需要,開發者可以重新整理網頁授權access_token,避免過期

4、通過網頁授權access_token和openid獲取使用者基本資訊(支援UnionID機制)

二.按照如上流程我就不多說廢話直接粘程式碼供大家參考,請大家多多指教(程式碼裡的所有APPID,APPSECRET都是使用的官網提供測試賬號

1.設計一個公用網路請求工具類:

package com.wxutil.auth;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.springframework.util.DigestUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class WXAuthUtil {
    public static final String APPID="wx9b39273dce55dc2f";
    public static final String APPSECRET ="06f175852111045f81ebf62db28a44a0";
    private static final String TOKEN = "immco";
    public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException {
        JSONObject jsonObject =null;
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet =new HttpGet(url);
        HttpResponse response =  client.execute(httpGet);
        HttpEntity entity =response.getEntity();
        if(entity!=null)
        {
            //把返回的結果轉換為JSON物件
            String result =EntityUtils.toString(entity, "UTF-8");
            jsonObject =JSON.parseObject(result);
        }
        
        return jsonObject;
    }
   
}

2.微信登入的實現類(裡面包含引導action和確認登入後的回撥函式):

package com.wxutil.controller;


import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.text.ParseException;
import java.util.UUID;


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


import org.apache.http.client.ClientProtocolException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;


import com.alibaba.fastjson.JSONObject;
import com.wxutil.auth.SHA1;
import com.wxutil.auth.WXAuthUtil;



/** 
* @author  lbh 
* @date 建立時間:2018年1月18日 下午12:35:11 
* @version 1.0 
* @parameter  
* @since  
* @return  
*/


@Controller
@RequestMapping("/wx")
public class WXLoginController {
    private static final Logger logger = Logger.getLogger(WXLoginController.class);
/**
 * 公眾號微信登入授權
 * @param request
 * @param response
 * @return
 * @throws ParseException
 * @author  lbh 
 * @date 建立時間:2018年1月18日 下午7:33:59  
 * @parameter
 */
    @RequestMapping(value = "/wxLogin", method = RequestMethod.GET)
    public String wxLogin(HttpServletRequest request,
            HttpServletResponse response)
            throws ParseException {
        //這個url的域名必須要進行再公眾號中進行註冊驗證,這個地址是成功後的回撥地址
        String backUrl="http://d84e26b6.ngrok.io/WX_auth/wx/callBack";
        // 第一步:使用者同意授權,獲取code
        String url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+WXAuthUtil.APPID
                + "&redirect_uri="+URLEncoder.encode(backUrl)
                + "&response_type=code"
                + "&scope=snsapi_userinfo"
                + "&state=STATE#wechat_redirect";

        logger.info("forward重定向地址{" + url + "}");
        //response.sendRedirect(url);
        return "redirect:"+url;//必須重定向,否則不能成功
    }
/**
 * 公眾號微信登入授權回撥函式
 * @param modelMap
 * @param req
 * @param resp
 * @return
 * @throws ServletException
 * @throws IOException
 * @author  lbh 
 * @date 建立時間:2018年1月18日 下午7:33:53  
 * @parameter
 */
    @RequestMapping(value = "/callBack", method = RequestMethod.GET)
    public String callBack(ModelMap modelMap,HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
         * start 獲取微信使用者基本資訊
         */
        String code =req.getParameter("code");
      //第二步:通過code換取網頁授權access_token
         String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+WXAuthUtil.APPID
                + "&secret="+WXAuthUtil.APPSECRET
                + "&code="+code
                + "&grant_type=authorization_code";

        System.out.println("url:"+url);
        JSONObject jsonObject = WXAuthUtil.doGetJson(url);
        /*
         { "access_token":"ACCESS_TOKEN",
            "expires_in":7200,
            "refresh_token":"REFRESH_TOKEN",
            "openid":"OPENID",
            "scope":"SCOPE" 
           }
         */
        String openid = jsonObject.getString("openid");
        String access_token = jsonObject.getString("access_token");
        String refresh_token = jsonObject.getString("refresh_token");
        //第五步驗證access_token是否失效;展示都不需要
        String chickUrl="https://api.weixin.qq.com/sns/auth?access_token="+access_token+"&openid="+openid;

        JSONObject chickuserInfo = WXAuthUtil.doGetJson(chickUrl);
        System.out.println(chickuserInfo.toString());
        if(!"0".equals(chickuserInfo.getString("errcode"))){
            // 第三步:重新整理access_token(如果需要)-----暫時沒有使用,參考文件https://mp.weixin.qq.com/wiki,
            String refreshTokenUrl="https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+openid+"&grant_type=refresh_token&refresh_token="+refresh_token;

            JSONObject refreshInfo = WXAuthUtil.doGetJson(chickUrl);
            /*
             * { "access_token":"ACCESS_TOKEN",
                "expires_in":7200,
                "refresh_token":"REFRESH_TOKEN",
                "openid":"OPENID",
                "scope":"SCOPE" }
             */
            System.out.println(refreshInfo.toString());
            access_token=refreshInfo.getString("access_token");
        }
       
       // 第四步:拉取使用者資訊(需scope為 snsapi_userinfo)
       String infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token
                + "&openid="+openid
                + "&lang=zh_CN";
        System.out.println("infoUrl:"+infoUrl);
        JSONObject userInfo = WXAuthUtil.doGetJson(infoUrl);
        /*
         {    "openid":" OPENID",
            " nickname": NICKNAME,
            "sex":"1",
            "province":"PROVINCE"
            "city":"CITY",
            "country":"COUNTRY",
            "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
            "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
            "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
            }
         */
        System.out.println("JSON-----"+userInfo.toString());
        System.out.println("名字-----"+userInfo.getString("nickname"));
        System.out.println("頭像-----"+userInfo.getString("headimgurl"));
        /*
         * end 獲取微信使用者基本資訊
         */
        //獲取到使用者資訊後就可以進行重定向,走自己的業務邏輯了。。。。。。
        //接來的邏輯就是你係統邏輯了,請自由發揮
       
        return "login";
    }
    
}


相關推薦

java實現公眾授權登入獲取使用者資訊流程

參考地址微信公眾號開發文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 前提:需要申請認證的微信公眾號;獲取對應的APPID和APPSECRET;並且還需要獲取到使用者資訊許可權

Asp.net 如何實現公眾授權登入

第一個類:封裝好微信配置檔案 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using Newton

公眾授權登入java實現

步驟: 1、 使用第三方工具,生成內網對映 2、 微信公眾平臺使用測試賬號 3、 測試賬號中需要配置自己的域名,並關注該臨時測試使用的公眾號 4、 下載一個瀏覽器的二維碼外掛 4、 編碼測試 使用花生殼進行內網穿透 注意,因為我使用的是808

公眾 授權登入 JAVA

微信授權登入 java 首先 騰訊那麼大的公司 文件寫的那麼low 微信那麼火 demo寫的那麼差 我就想說一句  微信簡直就是在歧視Java   我這邊自己整合了下 微信支付和微信登入 java的程式碼  我打包出來了 不是讓你們直接使用的 是需要你們自己看看 借鑑的 h

java實現公眾房卡牛牛六人平臺開發搭建文章采集接口程序

package ecs util 系統 public address 用戶id 狀態 get 日誌實體類,用戶記錄用戶登錄登出 LogRec.javapackage q.dms.test; import java.util.Date; /** 實體類 包含用戶登錄的id,

用localStorage實現公眾自動登入

實現微信公眾號自動登入功能,我之前是想用cookie去實現,畢竟cookie可以在java後臺進行操作,但是在微信公眾號一直測試失敗,查資料說是微信授權會進行一次跳轉,無法將cookie攜帶到頁面,暫時還沒想到什麼好的解決方案,所以換了另一種方式用localStorage去實現自動登入功能,

java實現公眾支付

前面做了app微信支付的回撥處理,現在需要做微信公眾號的支付,花了一天多時間,終於折騰出來了!鑑於坑爹的微信官方沒有提供java版的demo,所以全靠自己按照同樣坑爹的文件敲敲敲,所以記錄下來,以供自己及後來人參考,不足之處,還請指正。 首先,我們貼出呼叫支付介面的H5頁

公眾授權登入weixin4j開發

登入微信公眾號配置網頁授權目錄 在專案中引入maven依賴 <dependency> <groupId>com.foxinmy</groupId> <artifactId>weixin4j-m

公眾授權登入

說明:如果使用者在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取使用者基本資訊,進而實現業務邏輯。 1、授權回撥域名 首先,先登入微信公眾平臺填寫授權回撥頁面域名(可以申請公眾平臺測試賬號進行開發),回撥頁面域名是你的第三方跳轉域名,不需要加http,

公眾授權登入一(laravel)

namespace App\Http\Controllers; use Illuminate\Http\Request; use Validator; use Session; use App\Http\Requests; use App\Http\Controller

公眾授權登入之二(tp5)

public function _initialize(){//檢視使用者是否授權登入過 沒有的話跳轉到授權登入頁面 if(empty(session::get('user'))) { $this->redirect('user/login');

公眾模擬登入,獲取公眾歷史連結

好久沒寫部落格啦,這次寫一下最近的一個好玩的.大家有時看到一個公眾號覺得特別好玩,想看它所有的以前的連結咋辦?從手機端挨個翻啊...太費勁了不是?所以我就想從公眾號裡是不是有這東西能獲取,果然被俺發現啦哈哈話不多說,直接上內容啦,粗略的寫了下,看不懂的話 再問我吧,只為了提供

小程式授權登入獲取使用者資訊詳解

今天來說一下微信小程式的授權登入獲取使用者資訊,首先我們看微信提供的小程式開發文件: https://blog.csdn.net/qq_41971087/article/details/82466647 微信登入的流程和步驟: 步驟:(個人): 第一步:微信小程式

php 實戰 公眾 開發(獲取使用者資訊

PHP 微信開發(獲取使用者資訊): 獲取使用者資訊的大致演算法是 使用者授權登入第三方網站, 重點:scope引數: snsapi_basic 靜默登入,不需要使用者授權,只能獲取到openid; snsapi_userinfo ,需要使用者點選授權

公眾網頁開發——獲取使用者資訊

用於自查,學習請至:官方文件 1.獲取access_token 公眾號可以使用AppID和AppSecret呼叫本介面來獲取access_token。AppID和AppSecret可在“微信公眾平臺-開發-基本配置”頁中獲得(需要已經成為開發者,且帳號沒

JAVA帶你一步一步實現公眾開發(一)--接入微公眾平臺

(一)接入流程解析 在我們的開發過程中無論如何最好的參考工具當然是我們的官方文件了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html 通過上面我們可以看出其中接入微信公眾平臺開發,開發者需要按照如下

公眾平臺授權登入java版)

微信公眾平臺授權登入獲取使用者openid。 微信公眾平臺地址:https://mp.weixin.qq.com/ 微信平臺配置: 2、修改配置 2.1  業務域名配置 JS介面安全域名、網頁授權域名 同理操作就可以了,正常操作業務域名就完成了,剩下兩個步驟直

java解決公眾網頁授權域名只能填寫一個的問題

做微信開發的,必不可少的涉及到微信網頁授權,來獲取使用者資訊的功能。想要實現公眾號通過微信網頁授權機制,來獲取使用者基本資訊,必須先到公眾平臺官網中的“開發 - 介面許可權 - 網頁服務 - 網頁帳號 - 網頁授權獲取使

基於ThinkPHP3.2.3的OAuth2.0網頁授權 公眾網頁登入 改裝

首先我參考的這位仁兄的,感謝他地址 http://blog.csdn.net/a5435431941/article/details/61615851 仁兄沒有給sql,我的弄好了上傳出來 地址: http://download.csdn.net/detail/qq_27

基於java公眾二次開發視頻教程

質量 經典 數據分析 大數據 spark leet hadoop 專家 擴展 query 詳情請交流 QQ 709639943 00、基於java的微信公眾號二次開發視頻教程 00、leetcode 算法 面試 00、北風網 零基礎到數據(大數據)分析專家-首席分