微信第三方平臺整合
這一段時間集成了微信第三方平臺,坑還是蠻多的,記錄一下整合過程和遇到的坑
授權流程
首先說一下過程,這個過程再微信開放平臺上有。開放平臺連結戳這
授權給第三方平臺首先要獲取預授權碼,然後用預授權碼引導使用者授權,最後成功授權返回授權碼。
這地方分三部分:
第一部分,如何獲取預授權碼。
第二部分,通過預授權碼引導使用者授權。
第三部分,返回授權碼獲取公眾號資訊。
一、如何獲取預授權碼
1、在第三方平臺建立稽核通過後,微信伺服器會向其“授權事件接收URL”每隔10分鐘定時推送component_verify_ticket。第三方平臺方在收到ticket推送後也需進行解密(詳細請見【訊息加解密接入指引】),接收到後必須直接返回字串success。
首先需要了解一個加解密,微信平臺會有一個官方demo。接下來就是我遇到的第一個坑了。傳過來的xml解析失敗。
官網上解析的結果是這樣的:
想要解析,你得獲取微信伺服器傳過來的xml(傳來的timestamp,nonce,encrypt_type,msg_signature可以直接用request.getParameter獲取,但是xml需要讀取request的body部分)。然後按照demo上那樣解析。下面是我的方法:
/**
* 微信第三方解碼
* @param msgMap
* @param token
* @param encodingAesKey
* @param appId
* @param timestamp
* @param nonce
* @return
*/
public static String DecryptMsg(Map<String,Object> msgMap, String token, String encodingAesKey, String appId, String timestamp, String nonce){
String result = null;
try{
WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
String msgSignature = (String)msgMap.get("msg_signature");
String encrypt = (String)msgMap.get("encrypt_type");
String postXml = (String)msgMap.get("post_xml");
String format = postXml;
String fromXML = String.format(format, encrypt);
result = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);
}catch (Exception e){
e.printStackTrace();
}
return result;
}
接收到的xml:
<xml>
<AppId><![CDATA[xxxxxxxxxxxxxx]]></AppId>
<Encrypt><![CDATA[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]]></Encrypt>
</xml>
解析出來之後:
<xml><AppId><![CDATA[xxxxxxxxxxxxxx]]></AppId>
<CreateTime>1537153589</CreateTime>
<InfoType><![CDATA[component_verify_ticket]]></InfoType>
<ComponentVerifyTicket><![CDATA[xxxxxxxxxxxxxxxxxxxxxxxxxxx]]></ComponentVerifyTicket>
</xml>
然後一直報一個空指標的錯誤,我發現下面的程式碼解析失敗,因為XMLParse那個類找不到ToUserName的標籤。
就沒有<ToUserName>
這個頁籤,所以最後我改成了<AppId>
。
2、第三方平臺component_access_token是第三方平臺的下文中介面的呼叫憑據,也叫做令牌(component_access_token)。每個令牌是存在有效期(2小時)的,且令牌的呼叫不是無限制的,請第三方平臺做好令牌的管理,在令牌快過期時(比如1小時50分)再進行重新整理。
這裡沒啥說的,就是需要做的就是維護好令牌(持久化,啟動載入等)。到這就可以獲取到預授權碼(pre_auth_code)。
二、引導使用者授權
走到這,你會忽然發現,你跳轉的頁面完全不能授權,一直提示你的域名不對。因為這就是我遇見的第二個坑。
這邊的操作應該是這樣的:你需要寫一個頁面來授權,讓使用者去點選那個授權按鈕,按鈕的連結就是你拼接的那個url,廢話不多說,程式碼伺候:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div>
<input id="tolink" type="button" name="" value="授權跳轉" /></div>
<script>
var btn=document.getElementById("tolink");
btn.onclick=function(){
var ajax = new XMLHttpRequest();
ajax.open('get','http://abcd.com/authorizedurl');
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.status==200) {
window.location.href=ajax.responseText
}
}
}
</script>
</body>
</html>
這個url:http://abcd.com/authorizedurl
是用來獲取拼接後的url的
方式二:點選移動端連結快速授權
第三方平臺方可以生成授權連結,將連結通過移動端直接發給授權管理員,管理員確認後即授權成功。
然後點選頁面的授權按鈕,就可以正常進行授權了,授權的必須是公眾的管理員(繫結公眾號的那個),然後就可以授權了。
三、授權碼獲取公眾號資訊
該API用於獲取授權方的基本資訊,包括頭像、暱稱、帳號型別、認證型別、微訊號、原始ID和二維碼圖片URL。
需要特別記錄授權方的帳號型別,在訊息及事件推送時,對於不具備客服介面的公眾號,需要在5秒內立即響應;而若有客服介面,則可以選擇暫時不響應,而選擇後續通過客服介面來發送訊息觸達粉絲。