剛做完微信公衆號項目,分享一下代碼,經驗!初寫博客,格式寫得不好,還請見諒。有不懂的可以留言或加qq 505281494交流下。
一.
第一步進行服務器接口配置,提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,開發者通過檢驗signature對請求進行校驗。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,否則接入失敗。加密/校驗流程如下:
1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信
(對應github源碼中的WXCommon.Validate方法,token需在此方法中配置 與填寫一致)
本地調試就需要做端口映射到外網,推薦ngrok,需指定80端口
(微信公衆平臺會通過80端口訪問本機)
如果啓用安全模式 可能遇到的問題:
消息的加解密接口JCE無限制權限策略
java.security.InvalidKeyException:illegalKey Size
異常java.security.InvalidKeyException:illegalKey Size的解決方案:
在官方網站下載JCE無限制權限策略文件,下載對應的jdk版本後解壓,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。如果安裝了JRE,將兩個jar文件放到%JRE_HOME% \lib\security目錄下覆蓋原來的文件,如果安裝了JDK,將兩個jar文件放到%JDK_HOME%\jre\lib\security目錄下覆蓋原來文件。
二:接口配置成功後,微信公衆號接收到的消息和事件推送都會以Xml數據包通過POST請求發送到此接口。如:
詳情見微信開發者文檔。
github中源碼中的工具包(MessageUtil)
parseXMLCrypt方法:安全模式下解析XML消息,然後封裝到一個map中。
ParseXML方法:明文模式下解析XML消息
getTextXmlMessage,getVoiceXmlMessage等方法:獲取文本,聲音回覆的XML格式消息。(回覆消息時需交換接收時XML的ToUserName和FromUserName)。
可根據消息,事件的XML標籤內容不同判斷用戶的操作,然後回覆相應的消息。儘量先回復消息,再處理之後的業務。因爲:
三:接口調用
WXCommonUtil. Getaccess_token:
首先獲得接口調用憑證。有效期:2小時。 存進redis中,設置過期時間。(需要appid和appsecret)
HttpRequestUtil.httpsRequest方法:
/**
* 發送https請求
*
*@param requestUrl 請求地址
*@param requestMethod 請求方式(GET、POST)
*@param postStr 提交的數據
*@return JSONObject(通過JSONObject.get(key)的方式獲取json對象的屬性值)
*/
MyX509TrustManager類:
發送Https請求時的證書信任管理器類,實現了接口X509TrustManager的類。 接口X509TrustManager有下述三個公有的方法需要我們實現:
⑴ oid checkClientTrusted(X509Certificate[]chain, String authType)
throws CertificateException
該方法檢查客戶端的證書,若不信任該證書則拋出異常。由於我們不需要對客戶端進行認證,因此我們只需要執行默認的信任管理器的這個方法。JSSE中,默認的信任管理器類爲TrustManager。
⑵ oid checkServerTrusted(X509Certificate[]chain, String authType)
throwsCertificateException
該方法檢查服務器的證書,若不信任該證書同樣拋出異常。通過自己實現該方法,可以使之信任我們指定的任何證書。在實現該方法時,也可以簡單的不做任何處理,即一個空的函數體,由於不會拋出異常,它就會信任任何證書。
⑶ X509Certificate[] getAcceptedIssuers()
返回受信任的X509證書數組。
一些常用的接口:(需用到access_token)
1. 根據openid獲取用戶消息
2. 發送模板消息
3. 自定義菜單
4. 獲取用戶列表
四.微信網頁授權登錄和帶參數的二維碼:
1.授權登錄跳轉網址:
獲取code後請求以下鏈接
可得到:
帶參數的二維碼:
然後會得到
url則爲二維碼的鏈接地址。