微信签名的获取
當你要在微信中分享你的文章給好友,朋友圈的時候是要給微信發送一些數據的.比如 : 簽名 等
微信簽名獲取的地址 :https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
微信公眾平臺接口調試工具地址 :https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E5%9F%BA%E7%A1%80%E6%94%AF%E6%8C%81&form=%E8%8E%B7%E5%8F%96access_token%E6%8E%A5%E5%8F%A3%20/token
微信 JS 接口簽名校驗工具地址 :https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
前期準備 : 準備已經備案的域名 , 在公眾號配置白名單(放入服務器公網ip)和域名校驗
微信給了我們python獲取簽名的代碼,但是沒有給 token 和 jsapi_ticket
后端 :
注意 : 要給access_token 和jsapi_ticket 做全局緩存 , 因為沒交錢的每天只能2000次,如果不緩存就廢了
# 獲取 access_token
def get_token(request):
r = redis.Redis(connection_pool=pool, decode_responses=True)
access_token = r.get("'wx:access_token")
if access_token:
return access_token
try:
appid = appid
secret = secret
# 請求token接口
"""
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
"""
url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}".format(
appid=appid, secret=secret)
response = requests.get(url)
access_token = response.json()['access_token']
"""
r = {"access_token":"ACCESS_TOKEN","expires_in":7200} 正確
r = {"errcode":40013,"errmsg":"invalid appid"} 錯誤
"""
# 緩存
r.setex('wx:access_token', 7200, access_token)
return access_token
except Exception as e:
return e
# 獲取 jsapi_ticket
def get_ticket(request, appid, secret):
# 先在緩存中獲取
r = redis.Redis(connection_pool=pool, decode_responses=True)
ticket = r.get("wx:ticket")
if ticket:
# ticket = str(ticket, encoding="utf-8")
return ticket
else:
try:
token = get_token(request)
print("-----token======", token)
"""
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
"""
ticket_url = " https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={}&type=jsapi".format(token)
get_ticket = requests.get(ticket_url).content.decode("utf-8")
js_ticket = json.loads(get_ticket)
ticket = js_ticket.get("ticket")
r.setex("wx:ticket", 7200, ticket)
return ticket
except Exception as e:
return e
# 獲得簽名
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):
import string
return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(16))
# 時間戳時間
def __create_timestamp(self):
return int(time.time())
# 對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1
def sign(self):
string = '&'.join(['%s=%s' % (key.lower(), self.ret[key]) for key in sorted(self.ret)])
self.ret['signature'] = hashlib.sha1(string.encode("utf-8")).hexdigest()
return self.ret
# 發送簽名到前端,就行請求
def sign(request):
if request.method == "POST":
# 獲取前端傳過來的當前頁面的url,并且進行解碼
url = request.POST.get("url")
url = parse.unquote(url)
# 傳給get_ticket
ticket = get_ticket(request)
sign = Sign(ticket, url)
ret = sign.sign()
reful = {
"appId": appid,
"signature": ret["signature"],
"nonceStr": ret["nonceStr"],
"timestamp": ret["timestamp"],
}
return JsonResponse(reful)
"""
返回信息
{"debug":false,"appId":"wx1c5f000057d68bb9","timestamp":1561105606,"nonceStr":"9JzMRz","signature":"9a458696bb443de9fb235c68f31fb60d4fe6c96a"}
"""
前端 :
注意 :jsApiList 中 放入 translateVoice (別問為什么,我也不知道,就是不放就報錯 錯誤 : hideMenuItems:fail, the permission value is offline verifying )
$.ajax({
url: 'http://qxds.weiyingqipai.cn/sign/',
data: {
// 獲取當前url,并編碼,后端解碼
url: encodeURIComponent(location.href.split('#')[0])
},
// 同步請求
async: false,
type: 'post',
dataType: 'text',
success: function (msg) {
console.log("msg", msg);
// 從后臺獲取并json解碼
var json = JSON.parse(msg);
var appid = json["appId"];
var nonceStr = json["nonceStr"];
var timestamp = json["timestamp"];
var signature = json["signature"];
console.log("-------", json["appId"], json["signature"]);
var a = {
debug: false,
appId: appid,
timestamp: timestamp,
nonceStr: nonceStr,
signature: signature,
jsApiList: ['checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'hideOptionMenu', 'showOptionMenu', 'translateVoice']
};
wx.config(a);
wx.ready(function () {
console.log(a);
// 發送給朋友
wx.onMenuShareAppMessage({
title: dataForWeixin.title,
desc: dataForWeixin.desc,
// 分享文章的url
link: url,
imgUrl: dataForWeixin.img,
success: function () {
// 分享成功之后執行這個函數
_this.shaer_tips();
},
});
// 分享到朋友圈
wx.onMenuShareTimeline({
title: dataForWeixin.title,
desc: dataForWeixin.desc,
link: 'http://' + url[2] + '/rukou',
imgUrl: dataForWeixin.img,
success: function () {
_this.shaer_p_tips();
}
});
});
_this.shaer_tips = function () {
console.log("分享成功之后執行的這個函數==============")
};
_this.shaer_p_tips = function () {
};
_this.Reloadconfig = function (type) {
m = type;
// wx.config(window._Data.config);
wx.ready(function () {
if (m == 1) {
wx.hideMenuItems({
menuList: ['menuItem:share:timeline']
});
wx.onMenuShareAppMessage({
title: dataForWeixin.title,
desc: dataForWeixin.desc,
link: 'http://' + url[1] + '/rukou',
imgUrl: dataForWeixin.img,
success: function () {
_this.shaer_tips();
}
});
} else {
// 隱藏按鈕
wx.hideMenuItems({
// 分享好友
menuList: ['menuItem:share:appMessage']
});
wx.showMenuItems({
// 分享朋友圈
menuList: ['menuItem:share:timeline']
});
wx.onMenuShareTimeline({
title: dataForWeixin.title,
desc: dataForWeixin.desc,
link: 'http://' + url[2] + '/rukou',
imgUrl: dataForWeixin.img,
success: function () {
_this.shaer_p_tips();
}
});
}
});
}
},
});
總結
- 上一篇: 伪装qq空间登录
- 下一篇: 05_oracel题集