微信平臺開發
本文的部分鏈接,需要有微信公眾號平臺的開發賬號方可查看使用。
1.微信第三方平臺開發架構
微信服務器在自定義服務器與用戶終端之間,起到了橋接的作用,微信以XML形式對請求/響應進行轉發
2.第三方服務器驗證
簡述: 微信服務器向第三方服務器發送請求,請求參數包含signature、timestamp、nonce、echostr。第三方服務器,對這些參數進行驗證,驗證成功后,返回原樣的echostr,完成驗證。
服務器驗證有三種方式:明文、兼容、安全模式。
安全模式下驗證方式:
1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者獲得加密后的字符串可與signature對比,標識該請求來源于微信
第三方服務器URL,必須以http://或https://開頭,分別支持80端口和443端口
部分代碼示例:
//本例代碼使用的是明文測試
……
//獲取echostr
String echostr = request.getParameter("echostr");
if (echostr != null && echostr.length() > 1) {
result = echostr;
}
OutputStream os = response.getOutputStream();
// 返回echostr 完成驗證
os.write(result.getBytes("UTF-8"));
os.flush();
os.close();
……
3.自定義菜單
簡述:第三方平臺可以根據自己需要創建菜單,創建菜單的方式是向微信服務器發送POST請求,http 的body 是特定的json數據。
3.1 定時token獲取
官方文檔:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN
簡述:token 時第三方平臺向微信服務器發送請求時的身份證明,微信服務器根據開發者的appid、appsecret生成特定的token,有效期一般為2個小時,所以開發者需要定時獲取token。另外,token每天的獲取次數也是有限制的,根據不同賬號類型,次數限制也不同。
部分代碼:
//本例使用Timer
public class GetTokenTimerTask extends TimerTask{
@Override
public void run() {
InputStream in = null;
try {
in = GetTokenTimerTask.class.getResourceAsStream("/app.properties");
Properties props = new Properties();
props.load(in);
AccessTokenEntity tokenEntity = TokenProcess.getToken();
// 存儲token
props.setProperty("token", tokenEntity.getToken());
props.setProperty("maintain", tokenEntity.getMaintain());
props.store(new FileOutputStream(new File("app.properties")),props.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//執行
Timer timer=new Timer();
GetTokenTimerTask myTask=new GetTokenTimerTask();
// 第二個參數為延遲時間,第三個參數為循環時間,單位時毫秒ms
timer.schedule(myTask, 0, 2000);
3.2 創建自定義菜單
簡述:自定義菜單是第三方服務器,根據微信平臺的規定,封裝具體菜單展示形式的Json數據,通過Post方式傳遞給微信服務器。
自定義菜單接口可實現10種類型按鈕,包括點擊、跳轉、掃碼、選擇相冊等類型。詳細描述參照微信開發文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013&token=&lang=zh_CN
json數據示例:
{
"button":[
{
"type":"click",
"name":"菜單按鈕",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜單(含子菜單)",
"sub_button":[
{
"type":"view",
"name":"菜單跳轉",
"url":"http://www.baidu.com/"
},
{
"type":"click",
"name":"菜單按鈕2",
"key":"V1001_GOOD"
}]
}]
}
部分代碼示例:
//使用Jackson封裝解析Json數據,使用httpclient 向微信服務器發送Post請求
……
//jsonString 為上述Json示例中的json字符串,創建StringEntity注意使用UTF-8編碼,否則會出現亂碼問題
stringEntity = new StringEntity(jsonString, "UTF-8");
httpPost.setEntity(stringEntity);
httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
ResponseHandler<String> responseHandler = new BasicResponseHandler();
//發送Post請求,并獲取響應信息
responseBody = client.execute(httpPost, responseHandler);
……
注意:
1、自定義菜單最多包括3個一級菜單,每個一級菜單最多包含5個二級菜單。
2、一級菜單最多4個漢字,二級菜單最多7個漢字,多出來的部分將會以“...”代替。
3、創建自定義菜單后,菜單的刷新策略是,在用戶進入公眾號會話頁或公眾號profile頁時,如果發現上一次拉取菜單的請求在5分鐘以前,就會拉取一下菜單,如果菜單有更新,就會刷新客戶端的菜單。測試時可以嘗試取消關注公眾賬號后再次關注,則可以看到創建后的效果。
測試的時候記得取消關注、然后再次關注
3.3 創建個性化菜單
簡述:個性化菜單,就是為不同的用戶創建不同的用戶菜單展現形式。比如A用戶喜歡籃球,B用戶喜歡足球,為了體現平臺的人性化,我們為A類用戶設計了籃球類的菜單選項,為B類用戶設計了足球類的菜單選項。通過個性化菜單的配置,那么A用戶將會看到籃球專屬菜單,而B用戶會享受足球專屬菜單。
實現:個性化菜單創建方式同基本的菜單創建方式基本相同,不同的時需要添加matchrule 屬性,用來制定該菜單屬于哪一類人群
json數據示例:
{
"button":[
{
"type":"click",
"name":"NBA",
"key":"V1001_TODAY_MUSIC"
},
"button":[
{
"type":"click",
"name":"CBA",
"key":"V1001_TODAY_MUSIC"
}
"matchrule":{
"tag_id":"2",
"sex":"1",
"country":"中國",
"province":"廣東",
"city":"廣州",
"client_platform_type":"2",
"language":"zh_CN"
}
}
關于matchrule:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN
3.4 按鈕點擊事件響應
簡述:對于button類型的菜單項,第三方平臺需要根據它的key信息進行響應,比如點擊查看歷史文章菜單項,返回歷史文章信息。
實現:微信服務器在轉發請求時,會告知用戶請求的類型信息,對于菜單點擊來說,它屬于event 類型;而用戶發送的消息,屬于text 類型。所以根據請求類型,進行不同業務邏輯處理,實現不同功能需求。
部分代碼示例:
if("text".endsWith(xmlEntity.getMsgType())){
result = "文本測試!";
// 封裝xml文檔
result = new FormatXmlProcess().formatXmlAnswer(xmlEntity.getFromUserName(), xmlEntity.getToUserName(), result);
// result = new TulingApiProcess().getTulingResult(xmlEntity.getContent());
}
else if ("event".endsWith(xmlEntity.getMsgType())){
result = "菜單按鈕點擊!";
result = new FormatXmlProcess().formatXmlAnswer(xmlEntity.getFromUserName(), xmlEntity.getToUserName(), result);
}
4.消息回復
簡述:根據用戶發送的消息(圖片、文本信息等),公眾號做出及時的響應時每個公眾號必備的功能。公眾號現在支持回復文本、圖片、圖文、語音、視頻、音樂信息,回復消息方式有關注時自動回復、關鍵字回復
實現:對于信息的判斷邏輯,同3.4講到的類型判斷。本節重點講關鍵字回復功能,第三方平臺獲取到用戶輸入的關鍵字之后,根據匹配邏輯,推送相關的圖文、圖片等信息。
示例響應xml:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
5.小結
作為中繼器的微信服務器,主要起到了消息轉發、控制的作用。第三方平臺需要實現的核心功能是:
數據逐漸龐大之后,如何精確的匹配用戶關鍵詞,優化用戶交互。
大數據處理,精準信息推送,精準的用戶行為預測
設計更加優秀的交互H5頁面,利用微信的js-sdk 有效的宣傳,或者優化用戶與平臺的互動
微信商城、微信支付 安全等問題