微信 公眾平臺 開發(fā)(授權(quán)一)

hello 大家好悠就,最近公司的項目在做微信公眾號的二次開發(fā),我也在這里做一個微信公眾號的開發(fā)整理。
首先微信公眾號的開發(fā)離不開微信開發(fā)文檔臊岸,雖然有些小坑但是畢竟是官方文檔,還是要靠著開發(fā)文檔進行尊流,下面就是微信開發(fā)文檔的連接:微信公眾平臺開發(fā)文檔
好了帅戒,有了開發(fā)文檔我們就可以進行微信的開發(fā)了首先我們進行微信的二次開發(fā)就需要進行接入⊙录迹看一下微信給出的微信公眾號的接入提示:
1.文檔上描述的是三個步驟:

1逻住、填寫服務器配置
2、驗證服務器地址的有效性
3迎献、依據(jù)接口文檔實現(xiàn)業(yè)務邏輯
首先是服務器的配置:也就是授權(quán)時候的回調(diào)地址瞎访,微信開發(fā)需要授權(quán),授權(quán)接口不是一個同步接口吁恍,因為是在微信頁中打開連接扒秸,所以不能使用接口調(diào)用同步返回的方式等待授權(quán)返回播演,微信服務器會進行回調(diào)來確認完成授權(quán),回調(diào)的地址在授權(quán)的時候作為一個請求參數(shù)伴奥,在微信頁請求微信服務器写烤。那么微信怎么才能認識你的回調(diào)地址呢,需要配置一個服務器的域名拾徙,只有配置了域名洲炊,微信才能認識你的回調(diào)地址。我們進行服務器的配置:
服務器配置只有服務號才能使用锣吼,如下圖:

41EE.tmp.jpg

大家在權(quán)限借口中可以看見這個 網(wǎng)頁授權(quán)獲取用戶基本信息 后面的 修改點擊進去

4472.tmp.jpg

標注的這個頁面授權(quán)域名就是咱們需要配置的微信授權(quán)回調(diào)域名地址选浑。。
配置好了之后咱們就可一進行微信授權(quán)的開發(fā)了玄叠。
微信授權(quán)有兩種方式古徒,但是在進行之前咱們必須知道幾個名詞
openId:就是用戶關注了微信公眾號之后用戶在微信那邊的一個憑證。每個用戶只有一個而且是關注的時候就已經(jīng)分配了读恃,而且這個憑證會一直保留隧膘,就算你取消關注了也不會刪除,下次關注了還是這個openID寺惫。除非你換一個微信賬號疹吃。
code:這個是進行授權(quán)授權(quán)code,微信回調(diào)的時候會使用這個code。
access_token:這個是獲取openID的憑證西雀,微信里有兩個access_token萨驶,一個是咱們心在說的獲取openID的,還有一個是調(diào)用每個接口的憑證艇肴,這兩個是不一樣的腔呜,大家先了解下。
好了再悼,有了這三個名詞的概念咱們就可以先進行微信授權(quán)認證了核畴。后面咱們在總結(jié)其他接口。
授權(quán)頁面是這樣的:

5269.tmp.jpg

這里就是微信的授權(quán)頁冲九,點擊這個確認就是可以顯示用戶的頭像谤草,昵稱等的一些私人信息。有了這些私人信息咱們就可以做一些事情了莺奸,搞起來丑孩。
今天咱們就看一下微信授權(quán):
網(wǎng)頁授權(quán)有兩種方式:snsapi_base和snsapi_userinfo。區(qū)別就是:
1灭贷、以snsapi_base為scope發(fā)起的網(wǎng)頁授權(quán)温学,是用來獲取進入頁面的用戶的openid的,并且是靜默授權(quán)并自動跳轉(zhuǎn)到回調(diào)頁的氧腰。用戶感知的就是直接進入了回調(diào)頁(往往是業(yè)務頁面)
2枫浙、以snsapi_userinfo為scope發(fā)起的網(wǎng)頁授權(quán)刨肃,是用來獲取用戶的基本信息的。但這種授權(quán)需要用戶手動同意箩帚,并且由于用戶同意過真友,所以無須關注,就可在授權(quán)后獲取該用戶的基本信息紧帕。
3盔然、用戶管理類接口中的“獲取用戶基本信息接口”,是在用戶和公眾號產(chǎn)生消息交互或關注后事件推送后是嗜,才能根據(jù)用戶OpenID來獲取用戶基本信息愈案。這個接口,包括其他微信接口鹅搪,都是需要該用戶(即openid)關注了公眾號后站绪,才能調(diào)用成功的。
通過文檔中的描述嗎丽柿,咱們就可以看出來恢准,snsapi_base方式只能是獲取用戶的openID,不能獲取用戶的其他私人信息甫题,今天咋們先試試這種方式馁筐。
微信的API:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=${微信公眾號的APPID}&redirect_uri=${網(wǎng)頁授權(quán)的回調(diào)地址}&response_type=${回調(diào)類型默認就是這個:code}&scope=${微信授權(quán)權(quán)限:snsapi_bas
e}&state=${重定向后會帶上state參數(shù)}#wechat_redirect
這個就是咱們需要授權(quán)使用的API。參數(shù)就是${}中的描述坠非,可以在官方文檔上看詳細的說明敏沉。大家要注意的一點就是上面的鏈接需要在微信頁打開,所以大家必須在前端location炎码。我們后端只是提供這個鏈接就可以啦盟迟。

    public Map<String, Object> locationAuthUrl(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
        LOGGER.info("用戶獲取auth_code");
        Map<String, Object> codeMap = Maps.newHashMap();
        codeMap.put("redirectUrl", weChatService.getAuthorityCode(request));
        return codeMap;
    }
    private static String AUTH_CODE_URL_BASE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=%s&scope=%s&state=%s%s";

    public String getAsuthorityCode(AuthorityCodeRequest request) {
        String url = String.format(AUTH_CODE_URL_BASE, request.getAppid(), request.getRedirectUri(),
                request.getResponseType(), request.getScope(), request.getState(), request.getWechatRedirect());
        LOGGER.info("WeChatManageService get authority Code url :{}", url);
        return url;
    }

由于公司規(guī)范我就不做詳細代碼的粘貼了,這個方法就是給前端同學返回一個權(quán)限認證的連接辅肾,這個連接需要前端同學在微信頁打開队萤。微信打開只有會回調(diào)我們的,配置的回調(diào)地址轮锥,當然可以是前端地址也可以是后端啦矫钓,我這里配置的是后端地址,域名就是咱們微信平臺上配置的域名舍杜,只有這樣微信服務器才認你的域名P履取!既绩!切記概龄。

request.getRedirectUri()

好了微信服務器回調(diào)我們這個地址的連接是這樣的:

https://ljweb.hongdianfund.com/statics/wx/login?code=041QJiw52NW5tM0o2Sv52syrw52QJiw2&state=STATE

這個就是微信服務器的回調(diào)地址他會帶上兩個參數(shù):code和state,但是我們現(xiàn)在只關注code饲握,state我們不care私杜。得到了這個code我們可以調(diào)用接口查詢access_token了蚕键。注意這個code是微信當做參數(shù)傳遞過來的。我們直接取來使用就可以啦衰粹。
獲取access_token的地址是:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=%s

這里需要一個appId和secret锣光,這兩個參數(shù)都在我們的公眾平臺上可以獲取到,這個code就是咱們微信帶過來的請求參數(shù)铝耻。grant_type這個參數(shù)是一個默認值:authorization_code.

        String url = String.format(USER_BASE_INFO, request.getAppId(), request.getSecret(), request.getCode(),
                request.getGrantType());
        WeChatUserBaseInfo userBaseInfo = null;
        try {
            LOGGER.info("getWeChatUserBaseInfo userId:{}, channelId:{}, url:{}", userId, channelId, url);
            String result = HttpClientUtils.sendHttpsGet(url);
            userBaseInfo = GsonHolder.getGson().fromJson(result, WeChatUserBaseInfo.class);
            LOGGER.info("getWeChatUserBaseInfo userId:{}, channelId:{}, response:{}", userId, channelId, userBaseInfo);
        } catch (Exception ex) {
            LOGGER.error("getWeChatUserBaseInfo error userId:{}, channelId:{}", userId, channelId, ex);
        }
public class WeChatUserBaseInfo implements Serializable {
    @SerializedName("access_token")
    private String accessToken;
    @SerializedName("expires_in")
    private String expiresIn;
    @SerializedName("refresh_token")
    private String refreshToken;
    @SerializedName("openid")
    private String openId;
    @SerializedName("scope")
    private String scope;
/*
get  set  方法誊爹。。瓢捉。频丘。
*/
}

調(diào)用返回值中有一個參數(shù)是,access_token和openid泡态,openID和access_token這個是咱們調(diào)用用戶詳細信息使用的參數(shù)搂漠。但是要是只是簡單授權(quán)的話其實走到這一步就OK了。我們拿到了用戶的openId就可以做一些事情了某弦。后面咱們在說snsapi_userinfo方式的授權(quán)状答。歡迎大家指正,學習刀崖。后面我附上微信交互圖惊科,這樣大家更清晰理解授權(quán)機制。
下面是直接調(diào)用微信的API返回的亮钦,說明必須在微信頁打開:


泳道流程圖(垂直).png

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
</head>
<body>
<script type="text/javascript">
var ua = navigator.userAgent.toLowerCase();
var isWeixin = ua.indexOf('micromessenger') != -1;
var isAndroid = ua.indexOf('android') != -1;
var isIos = (ua.indexOf('iphone') != -1) || (ua.indexOf('ipad') != -1);
if (!isWeixin) {
document.head.innerHTML = '<title>抱歉馆截,出錯了</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0"><link rel="stylesheet" type="text/css" ;
document.body.innerHTML = '<div class="weui_msg"><div class="weui_icon_area"><i class="weui_icon_info weui_icon_msg"></i></div><div class="weui_text_area"><h4 class="weui_msg_title">請在微信客戶端打開鏈接</h4></div></div>';
}
</script>
</body>
</html>

上面就是關于微信的簡潔交互,大家可以互相討論蜂莉,學習蜡娶。
查看我的更多文章:codeinventor

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市映穗,隨后出現(xiàn)的幾起案子窖张,更是在濱河造成了極大的恐慌,老刑警劉巖蚁滋,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宿接,死亡現(xiàn)場離奇詭異,居然都是意外死亡辕录,警方通過查閱死者的電腦和手機睦霎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來走诞,“玉大人副女,你說我怎么就攤上這事◎己担” “怎么了碑幅?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵戴陡,是天一觀的道長。 經(jīng)常有香客問我沟涨,道長猜欺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任拷窜,我火速辦了婚禮开皿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篮昧。我一直安慰自己赋荆,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布懊昨。 她就那樣靜靜地躺著窄潭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酵颁。 梳的紋絲不亂的頭發(fā)上嫉你,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音躏惋,去河邊找鬼幽污。 笑死,一個胖子當著我的面吹牛簿姨,可吹牛的內(nèi)容都是我干的距误。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扁位,長吁一口氣:“原來是場噩夢啊……” “哼准潭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起域仇,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤刑然,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后暇务,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泼掠,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年般卑,在試婚紗的時候發(fā)現(xiàn)自己被綠了武鲁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爽雄。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝠检,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挚瘟,到底是詐尸還是另有隱情叹谁,我是刑警寧澤饲梭,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站焰檩,受9級特大地震影響憔涉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜析苫,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一兜叨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衩侥,春花似錦国旷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至峦萎,卻和暖如春屡久,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爱榔。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工被环, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人详幽。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓蛤售,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妒潭。 傳聞我的和親對象是個殘疾皇子悴能,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容