1. 程式人生 > >微信第三方平臺整合

微信第三方平臺整合

這一段時間集成了微信第三方平臺,坑還是蠻多的,記錄一下整合過程和遇到的坑

授權流程

這裡寫圖片描述
首先說一下過程,這個過程再微信開放平臺上有。開放平臺連結戳這
授權給第三方平臺首先要獲取預授權碼,然後用預授權碼引導使用者授權,最後成功授權返回授權碼。
這地方分三部分:
第一部分,如何獲取預授權碼。
第二部分,通過預授權碼引導使用者授權。
第三部分,返回授權碼獲取公眾號資訊。

一、如何獲取預授權碼

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秒內立即響應;而若有客服介面,則可以選擇暫時不響應,而選擇後續通過客服介面來發送訊息觸達粉絲。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述