├── README.md ├── access_token.json ├── jsapi_ticket.json └── wechat_sign.py /README.md: -------------------------------------------------------------------------------- 1 | # wechat-python-jssdk 2 | 微信js接口后台签名sdk,python实现 3 | -------------------------------------------------------------------------------- /access_token.json: -------------------------------------------------------------------------------- 1 | {"access_token": "LWsIEo-Lx7bV189D2Jl4YJJ8kplrsuznCyUymbcNi2VIgd9RvLVHqIIbK3n5ksZgJ_ECjKNen0hXhspuEQJMur1LwDjvZR_dscvceBgUoCA", "expire_time": 1429678145} -------------------------------------------------------------------------------- /jsapi_ticket.json: -------------------------------------------------------------------------------- 1 | {"expire_time": 1429678145, "jsapi_ticket": "sM4AOVdWfPE4DxkXGEs8VFN7IAjM1h3CsHhZtL9jvfA760P90XxLpCIcRBrFIkmBV3h5xbVuuvs7ZSRslHSwPQ"} -------------------------------------------------------------------------------- /wechat_sign.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import time 3 | import random 4 | import string 5 | import hashlib 6 | import json 7 | import requests 8 | 9 | class Sign: 10 | def __init__(self, appId, appSecret, url): 11 | self.appId = appId 12 | self.appSecret = appSecret 13 | 14 | self.ret = { 15 | 'nonceStr': self.__create_nonce_str(), 16 | 'jsapi_ticket': self.getJsApiTicket(), 17 | 'timestamp': self.__create_timestamp(), 18 | 'url': url 19 | } 20 | 21 | def __create_nonce_str(self): 22 | return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15)) 23 | 24 | def __create_timestamp(self): 25 | return int(time.time()) 26 | 27 | def sign(self): 28 | string = '&'.join(['%s=%s' % (key.lower(), self.ret[key]) for key in sorted(self.ret)]) 29 | print string 30 | self.ret['signature'] = hashlib.sha1(string).hexdigest() 31 | return self.ret 32 | 33 | def getJsApiTicket(self): 34 | data = json.loads(open('jsapi_ticket.json').read()) 35 | jsapi_ticket = data['jsapi_ticket'] 36 | if data['expire_time'] < time.time(): 37 | url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=%s" % (getAccessToken(self.appId, self.appSecret)) 38 | response = requests.get(url) 39 | jsapi_ticket = json.loads(response.text)['ticket'] 40 | data['jsapi_ticket'] = jsapi_ticket 41 | data['expire_time'] = int(time.time()) + 7000 42 | fopen = open('jsapi_ticket.json', 'w') 43 | fopen.write(json.dumps(data)) 44 | fopen.close() 45 | return jsapi_ticket 46 | 47 | def getAccessToken(self): 48 | data = json.loads(open('access_token.json').read()) 49 | access_token = data['access_token'] 50 | if data['expire_time'] < time.time(): 51 | url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" % (self.appId, self.appSecret) 52 | response = requests.get(url) 53 | access_token = json.loads(response.text)['access_token'] 54 | data['access_token'] = access_token 55 | data['expire_time'] = int(time.time()) + 7000 56 | fopen = open('access_token.json', 'w') 57 | fopen.write(json.dumps(data)) 58 | fopen.close() 59 | return access_token 60 | 61 | 62 | if __name__ == '__main__': 63 | # 注意 URL 一定要动态获取,不能 hardcode 64 | appId = 'wx9aaaaaaaaaaaaa' 65 | appSecret = 'a******************' 66 | sign = Sign(appId, appSecret, 'http://example.com') 67 | print sign.sign() 68 | --------------------------------------------------------------------------------