from flask import Flask, make_response,request import json import string import hashlib import random import time import urllib import redis r = redis.Redis(host='0.0.0.0', port=6379) # 建立redis對象 app = Flask(__name__) appid = '微信公衆號的appid' sceret = '微信公衆號的sceret' class Sign: def __init__(self, jsapi_ticket, url): self.ret = { 'nonceStr': self.__create_nonce_str(), 'jsapi_ticket': jsapi_ticket, 'timestamp': self.__create_timestamp(), 'url': url } def __create_nonce_str(self): return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15)) #建立隨機字符串 def __create_timestamp(self): return int(time.time()) # 建立一個時間戳 def sign(self): string = '&'.join(['%s=%s' % (key.lower(), self.ret[key]) for key in sorted(self.ret)]) # 根據字符的ASCII值進行排序,拼接 self.ret['signature'] = hashlib.sha1(string.encode('utf-8')).hexdigest() # 對字符串進行sha1加密 return self.ret def get__token() ACCESS_TOKEN = r.get('wx:ACCESS_TOKEN') # 從redis中獲取ACCESS_TOKEN if ACCESS_TOKEN: return ACCESS_TOKEN try: token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}".format(appid, sceret) # 建立獲取token的url response = urllib.request.urlopen(token_url) b = response.read().decode('utf-8') token = json.loads(b) ACCESS_TOKEN = token.get("access_token") r.setex('wx:ACCESS_TOKEN', ACCESS_TOKEN, 7200) # 將獲取到的 ACCESS_TOKEN 存入redis中而且設置過時時間爲7200s return ACCESS_TOKEN except Exception as e: return e def get_ticket(): ticket = r.get('wx:ticket') # 獲取redis數據庫中ticket if ticket: tic = str(ticket, encoding='utf-8') return tic else: try: token = get__token() ticket_url = " https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={}&type=jsapi".format(token) get_ticket = urllib.request.urlopen(ticket_url) c = get_ticket.read().decode("utf-8") js_ticket = json.loads(c) ticket = js_ticket.get("ticket") r.setex('wx:ticket', ticket, 7200) return ticket except Exception as e: return e #flask請求路由方法 @app.route('/jssdkconfig', methods=['GET']) def jssdk_config(): url = request.form.get("url") #url = "https://www.baidu.com" ticket = get_ticket() sign = Sign(ticket, url) result = { "appid": appid, "result": sign.sign() } # 響應頭容許跨域訪問 response_heade = { 'Access-Control-Allow-Origin': '*' } return make_response(json.dumps(result).encode("utf-8"), 200, response_heade) if __name__ == '__main__': app.run()致:有須要者,若是有疑問的,能夠評論區下留言。我會盡快回復,但願共同進步。