java微信公眾號第三方接入解析及全網(wǎng)檢查代碼示例
優(yōu)采云 發(fā)布時(shí)間: 2020-08-22 12:10java微信公眾號第三方接入解析及全網(wǎng)監測代碼示例
一、接入大體思路解析
這里主要是查看文檔的授權流程技術(shù)說(shuō)明,這里從開(kāi)發(fā)者角度介紹。
接入第三方的開(kāi)發(fā)者想必早已對公眾號開(kāi)發(fā)比較了解,第三方是代微信號實(shí)現功能的一個(gè)組件,所以其實(shí)陌陌方的開(kāi)發(fā)們也是這么考慮,為第三方的access_token起名為component_access_token。
1、首先獲取第三方
component_access_token
這個(gè)過(guò)程中會(huì )使用到陌陌服務(wù)器定期向我們服務(wù)器推送的component_verify_ticket數組,加上component_appid、component_appsecret等信息即可獲得。
2、獲取授權公眾號信息
類(lèi)似公眾號網(wǎng)頁(yè)授權,通過(guò)反彈的方式,微信公眾號運營(yíng)者可以通過(guò)陌陌掃碼的方式將公眾號授權給第三方,唯一有些不同的這兒在拼出授權跳轉頁(yè)面url后的第一步是引導用戶(hù)跳轉到該頁(yè)面上,再進(jìn)行掃碼,所以這個(gè)跳轉不是必須在陌陌外置瀏覽器中進(jìn)行。
拼出的url中的參數出了要用到component_access_token外還須要一個(gè)pre_auth_code預授權碼,可通過(guò)component_access_token獲得,具體的實(shí)效時(shí)間機制和component_access_token差不多。
用戶(hù)授權成功后會(huì )在redirect_url后接參數auth_code,類(lèi)似公眾號網(wǎng)頁(yè)授權的code值,通過(guò)auth_code和component_access_token等信息即可獲得該授權公眾號信息,若中間要與公眾號第三方平臺的帳號綁定再帶一個(gè)帳號標識參數即可。
3、帶公眾號實(shí)現業(yè)務(wù)
公眾號授權成功后第三方會(huì )得到該公眾號的authorizer_access_token,與公眾號的access_token功能相同,使用這個(gè)即可用微信公眾號的插口代公眾號實(shí)現業(yè)務(wù)。
有些不同的再第三方文檔里以有說(shuō)明。官方文檔
另外文檔上沒(méi)有提及的是,每當有公眾號授權成功后,微信服務(wù)器會(huì )將公眾號授權信息推送到授權風(fēng)波接收URL,即接收component_verify_ticket的插口。
4、關(guān)于加密揭秘
獲取陌陌服務(wù)器推送信息的時(shí)侯都是進(jìn)行加密的。
二、接入中發(fā)覺(jué)的幾個(gè)問(wèn)題1、微信的示例java代碼,XMLParse類(lèi)中
/**
* 提取出xml數據包中的加密消息
* @param xmltext 待提取的xml字符串
* @return 提取出的加密消息字符串
* @throws AesException
*/
public static Object[] extract(String xmltext) throws AesException {
Object[] result = new Object[3];
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(xmltext);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
NodeList nodelist1 = root.getElementsByTagName("Encrypt");
NodeList nodelist2 = root.getElementsByTagName("ToUserName");
System.out.println("nodelist2.item(0)="+nodelist2.item(0));
result[0] = 0;
result[1] = nodelist1.item(0).getTextContent();
//這里加了一個(gè)判斷,因為接收推送component_verify_ticket的解謎過(guò)程中沒(méi)有第三個(gè)參數,回報空指針異常
if(nodelist2.item(0) != null){
result[2] = nodelist2.item(0).getTextContent();
}
return result;
} catch (Exception e) {
e.printStackTrace();
throw new AesException(AesException.ParseXmlError);
}
}
2、文檔中:使用授權碼換取公眾號的插口調用憑據和授權信息
返回json信息最后少了一個(gè)}
{
"authorization_info": {
"authorizer_appid": "wxf8b4f85f3a794e77",
"authorizer_access_token": "QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM",
"expires_in": 7200,
"authorizer_refresh_token": "dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY",
"func_info": [
{
"funcscope_category": {
"id": 1
}
},
{
"funcscope_category": {
"id": 2
}
},
{
"funcscope_category": {
"id": 3
}
}
]
}
}
大家開(kāi)發(fā)時(shí)要注意json數據結構
三、關(guān)于代碼
在 微信公眾帳號第三方平臺全網(wǎng)發(fā)布源碼(java)- 實(shí)戰測試通過(guò) 代碼結構基礎上進(jìn)行更改