Django使用微信分享接口(分享到朋友圈、朋友、空间)
来源:互联网 发布:淘宝上的十字绣靠谱吗 编辑:程序博客网 时间:2024/05/18 02:39
最近工作需要,要实现在微信上分享网站时自定义图标文字,找了好几篇文章都只有大概的思路,自己参考官方文档写的,希望能给需要的朋友一点帮助
框架: Django
先来个效果图
使用前
使用后
步骤一:在前端模板中引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js
我的代码
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
具体可以参考官方文档
步骤二:通过config接口注入权限验证配置
这个我理解为身份验证,也是整个步骤中最关键的地方,在我看的几篇文章中都没怎么讲清楚(django中实现)
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
这是官方示例
appid: 这个东西,有公众号的应该都知道吧,没有的话,就注册一个吧
timestamp巴拉巴拉的是自己生成的后面介绍
这一段是加在模板代码中的(我加在<head>里面)。
随之而来的问题是,在前端如何获取后台生成的时间戳啊随机串啊之类的东西。
我使用的方法是设置template的全局变量
具体操作:新建一个.py文件,我的叫做wx_token.py,
# _*_ encoding: utf-8 _*_import hashlibimport timeimport randomimport urllib2import demjsonimport stringimport django.utils.timezone as timezonefrom .models import WxToken, JsTokendef getSignPackage(request) : #获得jsapi_ticket jsapiTicket = getJsApiTicket() # 注意 URL 一定要动态获取,不能 hardcode. #获取当前页面的url url = 'http://' + request.get_host() + request.get_full_path() #获取timestamp(时间戳) timestamp = int(time.time()) #获取noncestr(随机字符串) nonceStr = createNonceStr() #这里参数的顺序要按照 key 值 ASCII 码升序排序 #得到signature #$signature = hashlib.sha1(string).hexdigest(); ret = { 'nonceStr': nonceStr, 'jsapi_ticket': jsapiTicket, 'timestamp': timestamp, 'url': url } string = '&'.join(['%s=%s' % (key.lower(), ret[key]) for key in sorted(ret)]) signature = hashlib.sha1(string).hexdigest() signPackage = { "appId": '写自己的', "nonceStr":nonceStr, "timestamp":timestamp, "url":url, "signature":signature, "rawString":string } return signPackage;def createNonceStr(length = 16): #获取noncestr(随机字符串) return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))def getJsApiTicket(): #获得jsapi_ticket #获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了 #获取access_token try: ticket = WxToken.objects.all()[0] if ticket.get_date(): return ticket.token except: ticket = WxToken() accessToken = accesstokens() #获取jsapi_ticket url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={}&type=jsapi".format(accessToken) req = urllib2.Request(url) res_data = urllib2.urlopen(req) res = res_data.read() res = demjson.decode(res) ticket.token = str(res['ticket']) ticket.lifetime = timezone.now() ticket.save() return str(res['ticket'])def accesstokens(): try: accesstoken = JsToken.objects.all()[0] if accesstoken.get_date(): return accesstoken.token except: accesstoken = JsToken() url= 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=写自己的&secret=写自己的' req = urllib2.Request(url) data = urllib2.urlopen(req) res = data.read() res=demjson.decode(res) accesstoken.token = str(res['access_token']) accesstoken.lifetime = timezone.now() accesstoken.save() return str(res['access_token'])代码中使用的生成算法是官方提供的,稍微改了改就能用
然后在settings.py文件里配置一下模板变量 TEMPLATES = ......(不明白的同学搜一下“Django 设置template的全局变量”)
PS:在微信公众号中貌似要设置一个什么东西,具体什么我忘记了,貌似要认证了之后才能调用微信的JS,要求是把他的一个文本文件放在服务器根目录,我是用的是apache+wsgi,放在根目录也是没啥卵用,我的处理方式是把文件中的内容复制下来,然后在views中写一个
def wx_js(request): return HttpResponse('4QswHXCZFX1CLJUS-->写自己的')
-。- 就这样继续继续,因为jsapi_ticket每天的访问次数有限,有效期为7200秒,所以最好是存起来设置一个过期时间,上面的代码也看的出来,我是存在数据库里面的
models文件的内容是
class WxToken(models.Model): token = models.CharField(max_length=200) lifetime = models.DateTimeField( default=0 ) def get_date(self): delta = timezone.now() - self.lifetime if delta.seconds < 6000: return True else: return Falseclass JsToken(models.Model): token = models.CharField(max_length=200) lifetime = models.DateTimeField( default=0 ) def get_date(self): delta = timezone.now() - self.lifetime if delta.seconds < 6000: return True else: return False
把这个弄好的话,基本没什么问题了,然后把我的模板中的代码show一下
<script type="text/javascript"> wx.config({ debug: false, //调式模式,设置为ture后会直接在网页上弹出调试信息,用于排查问题 appId: '额,写自己的', timestamp: {{ timestamp }}, nonceStr: '{{ nonceStr }}', signature: '{{ signature }}', jsApiList: [ //需要使用的网页服务接口 'checkJsApi', //判断当前客户端版本是否支持指定JS接口 'onMenuShareTimeline', //分享给好友 'onMenuShareAppMessage', //分享到朋友圈 'onMenuShareQQ', //分享到QQ 'onMenuShareWeibo' //分享到微博 ] }); wx.ready(function () { //ready函数用于调用API,如果你的网页在加载后就需要自定义分享和回调功能,需要在此调用分享函数。//如果是微信游戏结束后,需要点击按钮触发得到分值后分享,这里就不需要调用API了,可以在按钮上绑定事件直接调用。因此,微信游戏由于大多需要用户先触发获取分值,此处请不要填写如下所示的分享API // 1 判断当前版本是否支持指定 JS 接口,支持批量判断 wx.checkJsApi({ jsApiList: [ 'onMenuShareAppMessage' ], success: function (res) { //alert(JSON.stringify(res)); } });wx.onMenuShareTimeline({ //例如分享到朋友圈的API title: '00.com', // 分享标题 link: 'www.00.com', // 分享链接 imgUrl: 'http://www.000.com/media/bg.jpg', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 }});wx.onMenuShareAppMessage({ title: '00.com', // 分享标题 desc: '洛杉矶留学生咨询就上CSinLA.com', // 分享描述 link: 'www.csinla.com', // 分享链接 imgUrl: 'http://www.00.com/media/bg.jpg', // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 }});wx.onMenuShareQQ({ title: '00a.com', // 分享标题 desc: '000.com', // 分享描述 link: 'www.000.com', // 分享链接 imgUrl: 'http://www.000.com/media/bg.jpg', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 }});});wx.error(function (res) { alert(res.errMsg); //打印错误消息。及把 debug:false,设置为debug:ture就可以直接在网页上看到弹出的错误提示});</script>PS:官方文档还写了很多接口可以用
写了有一段时间了,记性不太好,大概都写出来了吧,应该是可以了吧
参考文章 http://www.2cto.com/weixin/201603/493706.htm
微信JDK官方文档(链接找不到了)
- Django使用微信分享接口(分享到朋友圈、朋友、空间)
- 微信分享到朋友或朋友圈
- 【android】 微信分享详解(分享到朋友和朋友圈)+ PopupWindow的使用和分析
- 微信“分享到朋友圈”接口— wx.onMenuShareTimeline() 和 onMenuShareAppMessage — 分享给朋友接口
- asp.net 微信分享到朋友圈,分享给朋友接口
- 微信分享到朋友圈,分享给朋友JS代码
- 微信分享到朋友圈,分享给朋友JS代码
- 微信分享到朋友圈,分享给朋友JS代码
- 微信分享到朋友圈,分享给朋友JS代码
- 微信分享到朋友圈,分享给朋友JS代码
- js微信分享到朋友圈 分享给朋友代码
- 不使用官方SDK,实现微信分享(发送到朋友,发送到朋友圈)
- 不使用官方SDK,实现微信分享(发送到朋友,发送到朋友圈)
- 不使用官方SDK,实现微信分享(发送到朋友,发送到朋友圈)
- 不使用官方SDK,实现微信分享(发送到朋友,发送到朋友圈)
- [Android分享] 不使用官方SDK,实现微信分享(发送到朋友,发送到朋友圈)
- 微信分享到朋友圈接口用法
- android接入微信分享(朋友、朋友圈)、QQ分享(好友、空间)
- IDEA搭建Spring项目(Maven版)
- 三栏网页宽度自适应布局方法
- matplotlib入门-绘制简单折线图
- 阿里物联网套件-服务端SDK学习实践(基础篇-13发布广播消息)
- 用jquery的ajax向前台提交数据
- Django使用微信分享接口(分享到朋友圈、朋友、空间)
- 用python统计代码行(包括空行和注释)
- LL(1)分析法_C++实现
- codeforces 811A Vladik and Courtesy
- HDU1276士兵队列训练问题 循环队列
- CentOS7下安装MySQL5.7安装与配置(YUM)
- Android基本知识(一)
- 利用DOM4J 实现对 XML 与 MAP、LIST 的互相转换。
- MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring