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)地址。我們進行服務器的配置:
服務器配置只有服務號才能使用锣吼,如下圖:
大家在權(quán)限借口中可以看見這個 網(wǎng)頁授權(quán)獲取用戶基本信息 后面的 修改點擊進去
標注的這個頁面授權(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)頁面是這樣的:
這里就是微信的授權(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返回的亮钦,說明必須在微信頁打開:
<!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