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()
致:有需要者,如果有疑問的,可以評論區下留言。我會盡快回復,希望共同進步。