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官方文档(链接找不到了)

阅读全文
1 0
原创粉丝点击