新聞中心
如何使用示例代碼接入加解密,參考本文檔并使用示例代碼,加解密的接入將非常簡單。若想進(jìn)一步的了解細(xì)節(jié),請查看技術(shù)方案。 微信公眾平臺提供了C++、php、Java、Python和C# 5種語言的示例代碼,每種語言的類名和接口名均一致,下面以C++為例說明:

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出襄汾免費(fèi)做網(wǎng)站回饋大家。
函數(shù)說明
構(gòu)造函數(shù)
- // @param sToken: 公眾平臺上,開發(fā)者設(shè)置的Token
- // @param sEncodingAESKey: 公眾平臺上,開發(fā)者設(shè)置的EncodingAESKey
- // @param sAppid: 公眾號的appid
- WXBizMsgCrypt(const std::string &sToken,
- const std::string &sEncodingAESKey,
- const std::string &sAppid);
解密函數(shù)
- // 檢驗消息的真實性,并且獲取解密后的明文
- // @param sMsgSignature: 簽名串,對應(yīng)URL參數(shù)的msg_signature
- // @param sTimeStamp: 時間戳,對應(yīng)URL參數(shù)的timestamp
- // @param sNonce: 隨機(jī)串,對應(yīng)URL參數(shù)的nonce
- // @param sPostData: 密文,對應(yīng)POST請求的數(shù)據(jù)
- // @param sMsg: 解密后的明文,當(dāng)return返回0時有效
- // @return: 成功0,失敗返回對應(yīng)的錯誤碼
- int DecryptMsg(const std::string &sMsgSignature,
- const std::string &sTimeStamp,
- const std::string &sNonce,
- const std::string &sPostData,
- std::string &sMsg);
加密函數(shù)
- //將公眾號回復(fù)用戶的消息加密打包
- // @param sReplyMsg:公眾號待回復(fù)用戶的消息,xml格式的字符串
- // @param sTimeStamp: 時間戳,可以自己生成,也可以用URL參數(shù)的timestamp
- // @param sNonce: 隨機(jī)串,可以自己生成,也可以用URL參數(shù)的nonce
- // @param sEncryptMsg: 加密后的可以直接回復(fù)用戶的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串,當(dāng)return返回0時有效
- // return:成功0,失敗返回對應(yīng)的錯誤碼
- int EncryptMsg(const std::string &sReplyMsg,
- const std::string &sTimeStamp,
- const std::string &sNonce,
- std::string &sEncryptMsg);
使用方法
在安全模式或兼容模式下,url上會新增兩個參數(shù)encrypt_type和msg_signature。encrypt_type表示加密類型,msg_signature:表示對消息體的簽名。 url上無encrypt_type參數(shù)或者其值為raw時表示為不加密;encrypt_type為aes時,表示aes加密(暫時只有raw和aes兩種值)。公眾帳號開發(fā)者根據(jù)此參數(shù)來判斷微信公眾平臺發(fā)送的消息是否加密。
兼容模式和安全模式加解密的方法完全一樣,兼容模式的xml消息體比安全模式多了幾個明文字段,具體請查看《消息加解密詳細(xì)技術(shù)方案》。
實例化對象
使用構(gòu)造函數(shù),實例化一個對象,傳入公眾帳號的token, appid, EncodingAESKey。
解密
安全模式或者兼容模式下,公眾號收到以下帶密文消息體(“……”表示兼容模式下的明文字段):
- encrypt_msg =
- ……
調(diào)用DecryptMsg接口,傳入收到的url上的參數(shù):msg_signature(注意:不是signature,而是msg_signature), timestamp, nonce和接收到的encrypt_msg,若調(diào)用成功,sMsg則為輸出結(jié)果,其內(nèi)容為如下的明文的xml消息體:
1411035097 6060349595123187712
#p#
公眾帳號處理消息
生成需要回復(fù)給微信公眾平臺的xml消息體,假設(shè)回復(fù)以下內(nèi)容:
- res_msg =
1411034505 0
回包加密
調(diào)用EncryptMsg接口,傳入需要回復(fù)給微信公眾平臺的res_msg, timestamp, nonce,若加密成功,則sEncryptMsg為密文消息體,內(nèi)容如下:
1411034505
注意事項
EncodingAESKey長度固定為43個字符,從a-z,A-Z,0-9共62個字符中選取。 公眾帳號可以在公眾平臺的開發(fā)者中心的服務(wù)器配置修改
出于安全考慮,公眾平臺網(wǎng)站提供了修改EncodingAESKey的功能(在EncodingAESKey可能泄漏時進(jìn)行修改),所以建議公眾賬號保存當(dāng)前的和上一次的EncodinAESKey,若當(dāng)前EncodingAESKey解密失敗,則嘗試用上一次的EncodingAESKey的解密。回包時,用哪個Key解密成功,則用此Key加密對應(yīng)的回包
兼容模式消息體同時存在明文和密文,消息體會增至以前的3倍左右,開發(fā)者注意檢查系統(tǒng),防止因消息變長和URL參數(shù)增加而出現(xiàn)接收錯誤
如果url上無encrypt_type參數(shù)或者其值為raw,則回復(fù)明文,否則回復(fù)密文。兼容模式期間公眾賬號回復(fù)明文或密文均可(不要兩種類型都回)
函數(shù)錯誤返回碼
#p#
示例代碼下載
微信公眾平臺為開發(fā)者提供了5種語言的示例代碼(包括C++、php、Java、Python和C#版本) 點(diǎn)擊下載 ../static/assets/a5a22f38cb60228cb32ab61d9e4c414b.zip
微信公眾平臺接口調(diào)試工具
點(diǎn)擊進(jìn)入 http://mp.weixin.qq.com/debug
技術(shù)方案
1. EncodingAESKey長度固定為43個字符,從a-z,A-Z,0-9共62個字符中選取,公眾帳號可以在公眾平臺的開發(fā)者中心的服務(wù)器配置修改;
2. AES密鑰:AESKey=Base64_Decode(EncodingAESKey + “=”),EncodingAESKey尾部填充一個字符的“=”, 用Base64_Decode生成32個字節(jié)的AESKey;
3. AES采用CBC模式,秘鑰長度為32個字節(jié),數(shù)據(jù)采用PKCS#7填充;PKCS#7:K為秘鑰字節(jié)數(shù)(采用32),buf為待加密的內(nèi)容,N為其字節(jié)數(shù)。Buf需要被填充為K的整數(shù)倍。在buf的尾部填充(K-N%K)個字節(jié),每個字節(jié)的內(nèi)容是(K- N%K);
具體詳見:http://tools.ietf.org/html/rfc2315
5. 出于安全考慮,公眾平臺網(wǎng)站提供了修改EncodingAESKey的功能(在EncodingAESKey可能泄漏時進(jìn)行修改),所以建議公眾賬號保存當(dāng)前的和上一次的EncodingAESKey,若當(dāng)前EncodingAESKey生成的AESKey解密失敗,則嘗試用上一次的AESKey的解密?;匕鼤r,用哪個AESKey解密成功,則用此AESKey加密對應(yīng)的回包;
6. 兼容模式消息體同時存在明文和密文,消息體會增至以前的3倍左右,開發(fā)者注意檢查系統(tǒng),防止因消息變長和URL參數(shù)增加而出現(xiàn)接收錯誤;
7. 微信團(tuán)隊提供了多種語言的示例代碼(包括php、Java、C++、Python、C#),請開發(fā)者盡量使用示例代碼。(../static/assets/a5a22f38cb60228cb32ab61d9e4c414b.zip )
下面以普通文本消息為例,詳細(xì)說明公眾平臺對消息體加解密的方法和流程,其它普通消息和事件消息的加解密可以此類推。
公眾賬號接收用戶消息
消息體加密
現(xiàn)有消息為明文,格式如下:
- msg =
1348831860 1234567890123456
兼容模式期間同時保留明文和密文,消息格式如下:
- new_msg=
1348831860 1234567890123456
安全模式下,消息體只有密文,格式如下:
- new_msg=
- 其中,msg_encrypt = Base64_Encode( AES_Encrypt[ random(16B) + msg_len(4B) + msg + $AppId] )
AES加密的buf由16個字節(jié)的隨機(jī)字符串、4個字節(jié)的msg_len(網(wǎng)絡(luò)字節(jié)序)、msg和$AppId組成,其中msg_len為msg的長度,$AppId為公眾帳號的AppId
AESKey =Base64_Decode(EncodingAESKey + “=”),32個字節(jié)
url上增加參數(shù)encrypt_type,encrypt_type的值為raw時表示為不加密,encrypt_type的值為aes時,表示aes加密(暫時只有raw和aes兩種值),無encrypt_type參數(shù)同樣表示不加密
消息體簽名
為了驗證消息體的合法性,公眾平臺新增消息體簽名,開發(fā)者可用以驗證消息體的真實性,并對驗證通過的消息體進(jìn)行解密
在url上增加參數(shù):msg_signature
msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))
消息體驗證和解密
開發(fā)者先驗證消息體簽名的正確性,驗證通過后,再對消息體進(jìn)行解密。
驗證方式
1. 開發(fā)者計算簽名,dev_msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))
2. 比較dev_msg_signature和URL上帶的msg_signature是否相等,相等則表示驗證通過
解密方式如下:
- 1. aes_msg=Base64_Decode(msg_encrypt)
- 2. rand_msg=AES_Decrypt(aes_msg)
- 3. 驗證尾部$AppId是否是自己的AppId,相同則表示消息沒有被篡改,這里進(jìn)一步加強(qiáng)了消息簽名驗證
- 4. 去掉rand_msg頭部的16個隨機(jī)字節(jié),4個字節(jié)的msg_len,和尾部的$AppId即為最終的xml消息體
公眾賬號向用戶回復(fù)消息
如果url上無encrypt_type或者其值為raw,則回復(fù)明文,否則按照上述的加密算法加密回復(fù)密文。兼容模式期間公眾賬號回復(fù)明文或密文均可(不要兩種類型都回)
回復(fù)消息體的簽名與加密
現(xiàn)有消息格式:
- msg=
12345678
加密后消息格式:
- new_msg=
timestamp
其中,msg_encrypt=Base64_Encode(AES_Encrypt [random(16B)+ msg_len(4B) + msg + $AppId])
random(16B)為16字節(jié)的隨機(jī)字符串;msg_len為msg長度,占4個字節(jié)(網(wǎng)絡(luò)字節(jié)序),$AppId為公眾賬號的AppId
AESKey =Base64_Decode(EncodingAESKey + “=”),32個字節(jié)
msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))
timestamp、nonce回填請求中的值或者重新生成均可
本文名稱:何使用示例代碼接入加解密及技術(shù)方案
分享網(wǎng)址:http://m.5511xx.com/article/copgeeh.html


咨詢
建站咨詢
