#!/usr/bin/env python # -*- coding: utf-8 -*- ######################################################################### # Author: jonyqin # Created Time: Thu 11 Sep 2014 03:55:41 PM CST # File Name: Sample.py # Description: WXBizJsonMsgCrypt 使ç¨demoæä»¶ ######################################################################### from WXBizJsonMsgCrypt import WXBizJsonMsgCrypt import sys import json if __name__ == "__main__": # ä¼ä¸å¨ä¼ä¸å¾®ä¿¡åå°ä¸è®¾ç½®çå¯é¥ç¸å ³é ç½®å¨è¿é TODO sToken = "xxxxxxx" sEncodingAESKey = "xxxxxxx" sCorpID = "ww1436e0e65a779aee" ''' ------------使ç¨ç¤ºä¾ä¸ï¼éªè¯åè°URL--------------- *ä¼ä¸å¼å¯åè°æ¨¡å¼æ¶ï¼ä¼ä¸å·ä¼åéªè¯urlåéä¸ä¸ªgetè¯·æ± å设ç¹å»éªè¯æ¶ï¼ä¼ä¸æ¶å°ç±»ä¼¼è¯·æ±ï¼ * GET /cgi-bin/wxpush?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3×tamp=1409659589&nonce=263014780&echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D * HTTP/1.1 Host: qy.weixin.qq.com æ¥æ¶å°è¯¥è¯·æ±æ¶ï¼ä¼ä¸åº 1.è§£æåºGet请æ±çåæ°ï¼å æ¬æ¶æ¯ä½ç¾å(msg_signature)ï¼æ¶é´æ³(timestamp)ï¼éæºæ°å串(nonce)以åä¼ä¸å¾®ä¿¡æ¨éè¿æ¥çéæºå å¯å符串(echostr), è¿ä¸æ¥æ³¨æä½URLè§£ç ã 2.éªè¯æ¶æ¯ä½ç¾åçæ£ç¡®æ§ 3. è§£å¯åºechostråæï¼å°åæå½ä½Get请æ±çresponseï¼è¿åç»ä¼ä¸å¾®ä¿¡ 第2ï¼3æ¥å¯ä»¥ç¨ä¼ä¸å¾®ä¿¡æä¾çåºå½æ°VerifyURLæ¥å®ç°ã ''' wxcpt=WXBizJsonMsgCrypt(sToken,sEncodingAESKey,sCorpID) sVerifyMsgSig="012bc692d0a58dd4b10f8dfe5c4ac00ae211ebeb" sVerifyTimeStamp="1476416373" sVerifyNonce="47744683" sVerifyEchoStr="fsi1xnbH4yQh0+PJxcOdhhK6TDXkjMyhEPA7xB2TGz6b+g7xyAbEkRxN/3cNXW9qdqjnoVzEtpbhnFyq6SVHyA==" ret,sEchoStr=wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,sVerifyNonce,sVerifyEchoStr) if(ret!=0): print("ERR: VerifyURL ret: " + str(ret)) sys.exit(1) else: print("done VerifyURL") #éªè¯URLæåï¼å°sEchoStrè¿åç»ä¼ä¸å· print("==============================") ''' ------------使ç¨ç¤ºä¾äºï¼å¯¹ç¨æ·åå¤çæ¶æ¯è§£å¯--------------- ç¨æ·å夿¶æ¯æè ç¹å»äºä»¶ååºæ¶ï¼ä¼ä¸ä¼æ¶å°åè°æ¶æ¯ï¼æ¤æ¶æ¯æ¯ç»è¿ä¼ä¸å¾®ä¿¡å å¯ä¹åç坿以postå½¢å¼åéç»ä¼ä¸ï¼å¯ææ ¼å¼è¯·åè宿¹ææ¡£ å设ä¼ä¸æ¶å°ä¼ä¸å¾®ä¿¡çåè°æ¶æ¯å¦ä¸ï¼ POST /cgi-bin/wxpush? msg_signature=e3647471e395139e2308c1fa963f2d648a00b90e×tamp=1409659813&nonce=1372623149 HTTP/1.1 Host: qy.weixin.qq.com { "tousername": "wx5823bf96d3bd56c7", "encrypt": "cjhLUX7UU4yCSelv1vz7T0zT8huF51bAMVWriNvO1FMegHrQZNrtvRxbwf0fUPsFvwqR0U0fgiJNEA5Y30F2MoI2S7vv3EjVQ68C0cjw9frBoUE2Hj0BvFp9h3u6Vbsg4lc1C8AtHdaN8orKuNKkLRLuYEL52R1J3v8olJGZRLnRdVKIivixmX/eQpzgeExtp20jI1HxRP1AAZ6xZoILdqDPO549LO4WeG+685JRUTdiwcY5fjZlqeMxuT4PpMn1X9OWsS7NRj06Wa5E3Tvg4twjWp39KPfOdRte6P1T4JU=", "agentid": 218 } ä¼ä¸æ¶å°post请æ±ä¹ååºè¯¥ 1.è§£æåºurlä¸çåæ°ï¼å æ¬æ¶æ¯ä½ç¾å(msg_signature)ï¼æ¶é´æ³(timestamp)以åéæºæ°å串(nonce) 2.éªè¯æ¶æ¯ä½ç¾åçæ£ç¡®æ§ã 3.å°post请æ±çæ°æ®è¿è¡jsonè§£æï¼å¹¶å°"encrypt"æ ç¾çå 容è¿è¡è§£å¯ï¼è§£å¯åºæ¥çææå³æ¯ç¨æ·å夿¶æ¯çææï¼æææ ¼å¼è¯·åè宿¹ææ¡£ 第2ï¼3æ¥å¯ä»¥ç¨ä¼ä¸å¾®ä¿¡æä¾çåºå½æ°DecryptMsgæ¥å®ç°ã ''' sReqNonce = "1372623149" sReqTimeStamp = "1409659813" sReqMsgSig = "e3647471e395139e2308c1fa963f2d648a00b90e" sReqData = '{ "tousername": "wx5823bf96d3bd56c7", "encrypt": "cjhLUX7UU4yCSelv1vz7T0zT8huF51bAMVWriNvO1FMegHrQZNrtvRxbwf0fUPsFvwqR0U0fgiJNEA5Y30F2MoI2S7vv3EjVQ68C0cjw9frBoUE2Hj0BvFp9h3u6Vbsg4lc1C8AtHdaN8orKuNKkLRLuYEL52R1J3v8olJGZRLnRdVKIivixmX/eQpzgeExtp20jI1HxRP1AAZ6xZoILdqDPO549LO4WeG+685JRUTdiwcY5fjZlqeMxuT4PpMn1X9OWsS7NRj06Wa5E3Tvg4twjWp39KPfOdRte6P1T4JU=", "agentid": 218 }'; ret,sMsg=wxcpt.DecryptMsg( sReqData, sReqMsgSig, sReqTimeStamp, sReqNonce) if( ret!=0 ): print("ERR: DecryptMsg ret: " + str(ret)) sys.exit(1) else: print(sMsg) # è§£å¯æåï¼sMsgå³ä¸ºjsonæ ¼å¼çææ # TODO: 对ææçå¤ç # ... # ... print("==============================") ''' ------------使ç¨ç¤ºä¾ä¸ï¼ä¼ä¸åå¤ç¨æ·æ¶æ¯çå å¯--------------- ä¼ä¸è¢«å¨åå¤ç¨æ·çæ¶æ¯ä¹éè¦è¿è¡å å¯ï¼å¹¶ä¸æ¼æ¥æå¯ææ ¼å¼çjson串ã å设ä¼ä¸éè¦åå¤ç¨æ·çææå¦ä¸ï¼ { "ToUserName": "mycreate", "FromUserName":"wx5823bf96d3bd56c7", "CreateTime": 1348831860, "MsgType": "text", "Content": "this is a test", "MsgId": 1234567890123456, "AgentID": 128 } 为äºå°æ¤æ®µææåå¤ç»ç¨æ·ï¼ä¼ä¸åºï¼ 1.èªå·±çææ¶é´æ¶é´æ³(timestamp),éæºæ°å串(nonce)ä»¥ä¾¿çææ¶æ¯ä½ç¾åï¼ä¹å¯ä»¥ç´æ¥ç¨ä»ä¼ä¸å¾®ä¿¡çpost urlä¸è§£æåºç对åºå¼ã 2.å°ææå å¯å¾å°å¯æã 3.ç¨å¯æï¼æ¥éª¤1çæçtimestamp,nonceåä¼ä¸å¨ä¼ä¸å¾®ä¿¡è®¾å®çtokençææ¶æ¯ä½ç¾åã 4.å°å¯æï¼æ¶æ¯ä½ç¾åï¼æ¶é´æ³ï¼éæºæ°åä¸²æ¼æ¥æjsonæ ¼å¼çå符串ï¼åéç»ä¼ä¸å·ã 以ä¸2ï¼3ï¼4æ¥å¯ä»¥ç¨ä¼ä¸å¾®ä¿¡æä¾çåºå½æ°EncryptMsgæ¥å®ç°ã ''' #sRespData = ' { "ToUserName": "mycreate", "FromUserName":"wx5823bf96d3bd56c7", "CreateTime": 1348831860, "MsgType": "text", "Content": "this is a test", "MsgId": 1234567890123456, "AgentID": 128 }'; sRespData = '{ "ToUserName": "wx5823bf96d3bd56c7", "FromUserName": :mycreate", "CreateTime": 1409659813, "MsgType": "text", "Content": "hello", "MsgId": 4561255354251345929, "AgentID": 218}' ret,sEncryptMsg=wxcpt.EncryptMsg(sRespData, sReqNonce, sReqTimeStamp) if( ret!=0 ): print("ERR: EncryptMsg ret: " + str(ret)) sys.exit(1) else: print(sEncryptMsg) #ret == 0 å 坿åï¼ä¼ä¸éè¦å°sEncryptMsgè¿åç»ä¼ä¸å· print("==============================") ''' 对ä¸é¢å å¯çå è¿è¡è§£å¯ ''' sReqMsgSig = json.loads(sEncryptMsg)['msgsignature'] sReqTimeStamp = json.loads(sEncryptMsg)['timestamp'] sReqNonce = json.loads(sEncryptMsg)['nonce'] ret,sMsg=wxcpt.DecryptMsg( sEncryptMsg, sReqMsgSig, sReqTimeStamp, sReqNonce) if( ret!=0 ): print("ERR: DecryptMsg ret: " + str(ret)) sys.exit(1) else: print(sMsg)