微信自定义分享JS-SDK制作

微信分享

现在越来越多的人喜欢分享一些东西给微信好友,所以我们最近需求要自定义分享微信内容,上网找了些资料,终于搞定了,下面来分享些经验。

·       1.需要自定义分享的设置,需要绑定一个微信公众号。首先要在公众号的设置-功能设置里设置JS安全域名,这样微信会检查被分享的链接是否在安全域名内,不在的话,将无法自定义分享。

·       2. 在开发者中心中获取你的AppID和AppSecret,接下来在获取令牌时,需要这两个信息。

·       3.微信这里做了很多的安全验证,所以这里先需要后台做些准备工作:(后面会有详细的代码)

a.需要凭借你的appId和appSecret向腾讯申请access_token,token相当于令牌,说白了就是腾讯认定你是微信公众号的开发者,可以让你用一些腾讯的开发功能;

拿到token后要将token缓存起来或者存入数据库中,每个token有效时间为2小时,如果请求成功了新的token,之前的就作废掉了。

返回成功示例:

{"access_token":"vdlThyTfyB0N5eMoi3n_aMFMKPuwkE0MgyGf_0h0fpzL8p_hsdUX8VGxz5oSXuq5dM69lxP9wBwN9Yzg-0kVHY33BykRC0YXZZZ-WdxEic4","expires_in":7200}

·       b.获取jsapi的ticket。jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。也就是说,腾讯这么多开发功能你想使用微信的jsapi,凭借着之前的门票,在给你另一张新的门票,这个门票专门来开发微信的jsapi。

拿到ticket之后,也要缓存起来或者存入数据库中,因为他跟token失效机制是一样的。

返回成功实例:

{"errcode":0,"errmsg":"ok","ticket":"sM4AOVdWfPE4DxkXGEs8VMKv7FMCPm-I98-klC6SO3Q3AwzxqljYWtzTCxIH9hDOXZCo9cgfHI6kwbe_YWtOQg","expires_in":7200}

·       c.要获得一个签名。
此处要将jsapi_ticket、noncestr、timestamp、分享的url按字母顺序连接起来,进行sha1签名。 noncestr是你设置的任意字符串。 timestamp为10位秒级别的时间戳。

然后,后台要做的到此结束。

后台还要将noncestr,timestamp,appId和signature传给前台

后台demo

 

//获取token
function wx_get_token() {
    $token = S('access_token');
    if (!$token) {
        $res = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='            .'你的AppID'.'&secret='            .'你的AppSecret');
        $res = json_decode($res, true);
        $token = $res['access_token'];
        // 注意:这里需要将获取到的token缓存起来(或写到数据库中)
        // 不能频繁的访问https://api.weixin.qq.com/cgi-bin/token,每日有次数限制
        // 通过此接口返回的token的有效期目前为2小时。令牌失效后,JS-SDK也就不能用了。
        // 因此,这里将token值缓存1小时,比2小时小。缓存失效后,再从接口获取新的token,这样
        // 就可以避免token失效。
        // S()是ThinkPhp的缓存函数,如果使用的是不ThinkPhp框架,可以使用你的缓存函数,或使用数据库来保存。
        S('access_token', $token, 3600);
    }
    return $token;
}

//获取ticket
function wx_get_jsapi_ticket(){
    $ticket = "";
    do{
        $ticket = S('wx_ticket');
        if (!empty($ticket)) {
            break;
        }
        $token = S('access_token');
        if (empty($token)){
            wx_get_token();
        }
        $token = S('access_token');
        if (empty($token)) {
            logErr("get access token error.");
            break;
        }
        $url2 = sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi",
            $token);
        $res = file_get_contents($url2);
        $res = json_decode($res, true);
        $ticket = $res['ticket'];
        // 注意:这里需要将获取到的ticket缓存起来(或写到数据库中)
        // ticket和token一样,不能频繁的访问接口来获取,在每次获取后,我们把它保存起来。
        S('wx_ticket', $ticket, 3600);
    }while(0);
    return $ticket;
}
/**
     * sha1加密, 返回给前端使用
     */
    public function signature($timestamp, $nonceStr, $url)
    {
        $ticket = $this->getJsapiTicket();
        $wxOri = sprintf("jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s",
            $ticket, $nonceStr, $timestamp, $url
        );
        return sha1($wxOri);
    }

·       前台的代码来了:

首先引入微信JS-SDK

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

然后在页面配置

// 微信配置
wx.config({
    debug: false, 
    appId: "你的AppID", 
    timestamp: '上一步生成的时间戳', 
    nonceStr: '上一步中的字符串', 
    signature: '上一步生成的签名',
    jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] // 功能列表,我们要使用JS-SDK的什么功能
});
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在 页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready 函数中。
wx.ready(function(){
    // 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
    wx.onMenuShareTimeline({
        title: '分享标题', // 分享标题
        link:"分享的url,以http或https开头",
        imgUrl: "分享图标的url,以http或https开头" // 分享图标
    });
    // 获取“分享给朋友”按钮点击状态及自定义分享内容接口
    wx.onMenuShareAppMessage({
        title: '分享标题', // 分享标题
        desc: "分享描述", // 分享描述
        link:"分享的url,以http或https开头",
        imgUrl: "分享图标的url,以http或https开头", // 分享图标
        type: 'link', // 分享类型,music、video或link,不填默认为link
    });
});

·       这里还有几个坑要说下,避免大家入坑:

JS安全域名一定要是一级域名,如qq.com,不带www的,二级域名是不行的,因为相比以前的分享没有任何域名限制,这里设置安全域名,目的是为了当发现此公众平台发现诱导分享行为时,可以根据此域名追溯到所有分享出去的链接,以及通过这些链接增加的粉丝。这样,微信就可以牢牢控制了你的微信平台,一旦发现违规,让分享链接失效,删除掉诱导行为增加的粉丝,是瞬间就可以完成的。因此,微信平台的开发者,一定要合理来使用分享功能,不要因小失大。等到你的微信平台被封,估计哭都来不及。

Token请求每天也是有上限的,每天请求最多2000次,超过了次数将无法在此请求,一旦超出,可以在公众号管理后台-开发-接口权限-获取access_token的操作哪里重置,不过每个月只有10此机会。

有一个网页调试工具,来查看token的,地址:

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

生成签名哪里的被分享的url地址一定要是动态获取的,之前我做的时候,静态地址就不可以。

网页调试工具,对比自己生成的签名对不对:

http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

 

常见的报错:

errMsg

:

config:invalid signature

签名错误,逐一检查生成签名的每一项,是否有错误;

errMsg

:

config:invalid url domain

被分享的链接不再安全域名内,如果是开发完成测试的时候报的这个错误,放到线上一般就对了。

 

官方给的JS-SDK说明文档:

http://mp.weixin.qq.com/wiki/home/index.html


最后微信也提供了官方的开发者工具,界面仿照chrome做的,可以模拟手机端的一些操作,其实就是模拟分享过程和查看SDK的消息


 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页