关于微信二次分享,标题变链接的解决方法(二)----代码部分

声明:

本篇博文只是个人工作中的分享总结,仅代表个人观点,虽然解决了不少网友的问题,但同时也引来了一些网友的不满,所以特此声明,当您遇到本博文解决不了的问题,可以尝试重新进行其他搜索或者一起交流,相信总归能解决,而不是言语攻击!该博文的解决方案毕竟不是万金油,解决不了所有问题!

上篇主要介绍了分享的文档,下面这篇直接上代码(代码是用PHP来写的),让大家更容易理解。上篇地址:关于微信二次分享,描述变链接的解决方法(一)----文档说明

代码分三部分进行,第一部分是C层(Controller),第二部分是M层(Model),第三部分是V层(View)

1.控制器层WeixinController

$data = array(
        'pic'=>'',//图片地址
        'title'=>'',//标题
        'description'=>''//描述
);
$weixinmodel = new WeixinshareModel();
$weixindata = array();
$weixindata['appId'] = 'xxxxxxxxxxxxxxxxxxxx';//appid
$weixindata['nonceStr'] = $weixinmodel->createNonceStr();
$weixindata['timestamp'] = time();

$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

$weixindata['pic'] = $data['pic'];

$weixindata['link'] = $url;

$weixindata['title'] = $data['title'];

$weixindata['description'] = mb_substr($data['description'], 0, 30, 'UTF-8');

$weixindata['signature'] = $weixinmodel->signature($weixindata['nonceStr'],$weixindata['timestamp'],$url);

$this->assign("weixindata", $weixindata);

2.模型层WeixinModel

<?php
class WeixinshareModel extends BaseModel
{
    const APPID = 'xxxxxxxxxxxxxxx';
    const APPSECRET = 'xxxxxxxxxxxxxxxxxxxxxxxx';
    function __construct()
    {
        parent::__construct();
    }

    //获取access_token
    public function accessToken()
    {
        $access_token = $this->redis->get("weixin_access_token");//存入redis,这里要结合自己的项目,对redis或者memcahe进行设置
        if(!$access_token){
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".self::APPID."&secret=".self::APPSECRET;
            $data = json_decode($this->httpGet($url),true);
            if(isset($data['access_token']) && $data['access_token'] != ''){
                $access_token = $this->redis->set("weixin_access_token",$data['access_token'],7200);
            }else{
                return false;
            }
        }
        return $access_token;
    }

    //用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket
    public function jsapiTicket()
    {
        $jsapi_ticket = $this->redis->get("weixin_jsapi_ticket");
        if(!$jsapi_ticket){
            $access_token = $this->accessToken();
            if($access_token){
                $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";
                $data = json_decode($this->httpGet($url),true);
                if(isset($data['errcode']) && $data['errcode']== 0){//请求成功
                    $jsapi_ticket = $this->redis->set("weixin_jsapi_ticket",$data['ticket'],7200);
                }else{
                    return false;
                }
            }else{
                return false;
            }
        }
        return $jsapi_ticket;
    }


    //获取signature
    public function signature($nonceStr,$timestamp,$url)
    {
        $jsapi_ticket = $this->jsapiTicket();

        $signature = '';
        if($jsapi_ticket) {
            $string = "jsapi_ticket=$jsapi_ticket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
            $signature = sha1($string);//对string1进行sha1签名,得到signature
        }else{
            return false;
        }
        return $signature;
    }

  //生成随机字符串
    public function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
  

  //远程请求,可以调用自己项目的远程请求
    public function httpGet($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }

} 

3.视图层weixin.phtml

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8">
    <meta content="width=device-width,minimum-scale=1.0,maximum-scale=1.0" name="viewport">
    <!--这个js必须引入-->
    <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
</head>
<body>
<script type="text/javascript">
    wx.config({
        //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: '<?=$weixindata['appId']?>', // 必填,公众号的唯一标识
        timestamp: <?=$weixindata['timestamp']?>, // 必填,生成签名的时间戳
        nonceStr: '<?=$weixindata['nonceStr']?>', // 必填,生成签名的随机串
        signature: '<?=$weixindata['signature']?>',// 必填,签名,见附录1
        jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表
    });
    wx.ready(function(){
        wx.onMenuShareTimeline({//分享到朋友圈
            title: '<?=$weixindata['title']?>', // 分享标题
            link: '<?=$weixindata['link']?>', // 分享链接
            imgUrl: '<?=$weixindata['pic']?>' // 分享图标
        });
        wx.onMenuShareAppMessage({//分享给朋友
            title: '<?=$weixindata['title']?>', // 分享标题
            desc: '<?=$weixindata['description']?>', // 分享描述
            link: '<?=$weixindata['link']?>', // 分享链接
            imgUrl: '<?=$weixindata['pic']?>', // 分享图标
            type: '', // 分享类型,music、video或link,不填默认为link
            dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
            success: function () {
                // 用户确认分享后执行的回调函数
            },
            cancel: function () {
                // 用户取消分享后执行的回调函数
            }
        });
        wx.onMenuShareQQ({//分享到QQ
            title: '<?=$weixindata['title']?>', // 分享标题
            desc: '<?=$weixindata['description']?>', // 分享描述
            link: '<?=$weixindata['link']?>', // 分享链接
            imgUrl: '<?=$weixindata['pic']?>' // 分享图标
        });
        wx.onMenuShareWeibo({//分享到腾讯微博
            title: '<?=$weixindata['title']?>', // 分享标题
            desc: '<?=$weixindata['description']?>', // 分享描述
            link: '<?=$weixindata['link']?>', // 分享链接
            imgUrl: '<?=$weixindata['pic']?>' // 分享图标
        });
        wx.onMenuShareQZone({//分享到QQ空间
            title: '<?=$weixindata['title']?>', // 分享标题
            desc: '<?=$weixindata['description']?>', // 分享描述
            link: '<?=$weixindata['link']?>', // 分享链接
            imgUrl: '<?=$weixindata['pic']?>' // 分享图标
        });

        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    });

</script>
<div class="wrap">
    
</div>
</body>
</html>

以上就是开发过程中的代码部分,php部分的代码没有优化,不足之处还望指正,若有疑惑之处可以QQ我:991769422;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习之tensorflow实战篇

python2.7进行爬虫百度POI代码(划分小网格算法)

查询许久,最终选择一个,之前一直py3.6不成功,换了2.7就好多了。如果有重复去下重即可。 这里面非常重要的基类对象的init()方法与超类方法,将在下面进行...

4617
来自专栏DeveWork

WordPress删除头部wp_head()多余代码

如果你有查看过你的WordPress博客的“查看源代码”的话,你会发现头部的html代码非常多,而且是密密麻麻,有些像meta name="generator"...

8997
来自专栏施炯的IoT开发专栏

EVC3/4项目升级到Visual Studio项目的一些建议

    大家都在忙着研究WP7了,每天在园子里有好多精彩的文章出现。这几天受朋友的委托,帮忙把他手头的一个项目进行升级。情况大概是这样的:项目是用EVC 3来开...

19510
来自专栏人工智能头条

机器学习新手必看:Jupyter Notebook入门指南

2064
来自专栏魏艾斯博客www.vpsss.net

代码实现 WordPress 文章中英文数字间自动添加空格

2523
来自专栏云飞学编程

Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程

昨天有小伙伴找我,新浪新闻的国内新闻页,其他部分都是静态网页可以抓到,但是在左下方的最新新闻部分,不是静态网页,也没有json数据,让我帮忙抓一下。大概看了下,...

1312
来自专栏云瓣

通过一个demo了解Redux

TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象;使用数据流能帮我们明确了行为对应的响应,这和react的状态可预...

34110
来自专栏Fundebug

20个Chrome DevTools调试技巧

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

1083
来自专栏小狼的世界

学习使用YUI3

对YUI一直很有好感,最近开始看了看YUI CSS GRID,发现这个理念非常好,非常有利于我们工作效率的提高,特别是熟悉了这套CSS之后,我们就不必每一个项目...

832
来自专栏企鹅号快讯

Python实现一个带图形界面的爬虫

Python 是一个很简介高效的语言,许多的 Python 爱好者(包括我在内)都很喜欢用 Python 做爬虫,为什么会喜欢写爬虫,我对爬虫的感觉就是:它能给...

5905

扫码关注云+社区

领取腾讯云代金券