文档章节

手机网站的网页进行微信转发时遇到的问题

嗜学如命的小蚂蚁
 嗜学如命的小蚂蚁
发布于 2015/09/18 16:45
字数 920
阅读 186
收藏 7

    以前公司往外推送微信信息的时候,都是在后台添加的文本,大家转发起来没有任何问题。最近手机网站上上了几个新活动,用微信转发的时候,问题来了,左下角的小图片没有,应该是文字简介的地方是一条url,实在不雅观。用一些笨笨的方法也能够弥补一下这个问题,比如,把<title>标签中的内容丰满一下,在脚本的开头可以隐藏一张图片,确实标题和图片能够出来,但这终究不是正道,今天就研究了一下微信的这个东东,在网上搜索了一下,还真是找到一个非常棒的类库,用起来效果也很不错。

<?php
class WeixinAction extends Action {
    /**
     * php curl 请求链接
     * 当$post_data为空时使用GET方式发送
     * @param unknown $url
     * @param string $post_data
     * @return mixed
     */
    function curlSend($url,$post_data=""){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        if($post_data != ""){
            curl_setopt($ch,CURLOPT_POST,1);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);
        }
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
    /**
     * 调用接口获取 $ACCESS_TOKEN
     * 微信缓存 7200 秒,这里使用thinkphp的缓存方法
     * @param unknown $APP_ID
     * @param unknown $APP_SECRET
     * @return Ambigous <mixed, Thinkmixed, object>
     */
    function get_accesstoken($APP_ID,$APP_SECRET){
        $ACCESS_TOKEN = S($APP_ID);
        if($ACCESS_TOKEN == false){
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APP_ID."&secret=".$APP_SECRET;
            $json = $this->curlSend($url);
            $data=json_decode($json,true);
            S($APP_ID,$data[access_token],7000);
            $ACCESS_TOKEN = S($APP_ID);
        }
        return $ACCESS_TOKEN;
    }
    /**
     * 微信网页JSSDK?调用接口获取 $jsapi_ticket
     * 微信缓存 7200 秒,这里使用thinkphp的缓存方法
     * @param unknown $ACCESS_TOKEN
     * @return Ambigous <mixed, Thinkmixed, object>
     */
    function get_jsapi_ticket($ACCESS_TOKEN){
        $jsapi_ticket = S($ACCESS_TOKEN);
        if($jsapi_ticket == false){
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$ACCESS_TOKEN."&type=jsapi";
            $json = $this->curlSend($url);
            $data = json_decode($json,true);
            S($ACCESS_TOKEN,$data[ticket],7000);
            $jsapi_ticket = S($ACCESS_TOKEN);
        }
        return $jsapi_ticket;
    }
    /**
     * 微信网页JSSDK 获取签名字符串
     * 所有参数名均为小写字符
     * @param unknown $nonceStr 随机字符串
     * @param unknown $timestamp 时间戳
     * @param unknown $jsapi_ticket
     * @param unknown $url 调用JS接口页面的完整URL,不包含#及其后面部分
     */
    function get_js_sdk($APP_ID,$APP_SECRET){
//        echo $APP_ID.'/'.$APP_SECRET;
        $protocol = (!empty($_SERVER[HTTPS]) && $_SERVER[HTTPS] !== off || $_SERVER[SERVER_PORT] == 443) ? "https://" : "http://";
        $url = $protocol.$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];
        $argu = array();
        $argu[appId] = $APP_ID;
        $argu[url] = $url;
        $argu[nonceStr] = $this->createNonceStr();
        $argu[timestamp] = time();
        $ACCESS_TOKEN = $this->get_accesstoken($APP_ID, $APP_SECRET);
        $argu[jsapi_ticket] = $this->get_jsapi_ticket($ACCESS_TOKEN);
        $string = "jsapi_ticket=".$argu[jsapi_ticket]."&noncestr=".$argu[nonceStr]."&timestamp=".$argu[timestamp]."&url=".$argu[url];
        $argu[signature] = sha1(trim($string));
        return $argu;
    }
    /**
     * 获取随机字符串
     * @param number $length
     * @return string
     */
    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;
    }
}
?>

    使用的时候用R函数带着两个参数,请求get_jsapi_ticket()方法,两个参数分别是$APP_ID,$APP_SECRET,这两个参数在自己的微信公共平台上可以看到。返回值可以将config中的选项填充起来。

 wx.config({
                debug: false, // 开启调试模式
                appId: '{$res.appId}', // 必填,公众号的唯一标识
                timestamp: {$res.timestamp}, // 必填,生成签名的时间戳
                nonceStr: '{$res.nonceStr}', // 必填,生成签名的随机串的
                signature: '{$res.signature}',// 必填,签名,见附录1
                jsApiList: {$res.jsApiList} // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        });

    jsApiList可以根据自己的需要添加。然后就简单多了,打开微信开发文档吧。

wx.ready(function(){
            wx.onMenuShareAppMessage({
                title: '{$res.title}',
                desc: '{$res.desc}',
                link: '{$res.link}',
                imgUrl: '{$res.imgUrl}',
                success: function (res) {
                    alert('感谢您的分享');
                }
            });
            wx.onMenuShareTimeline({
                title: '{$res.title}', // 分享标题
                link: '{$res.link}', // 分享链接
                imgUrl: '{$res.imgUrl}', // 分享图标
                success: function () {
                    // 用户确认分享后执行的回调函数
                    alert('感谢您的分享');
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
        });

    这样无论分享给朋友还是分享到朋友圈,就漂亮多了。

© 著作权归作者所有

共有 人打赏支持
嗜学如命的小蚂蚁
粉丝 145
博文 161
码字总数 100864
作品 0
郑州
程序员
私信 提问
苹果手机在微信内打开APP下载链接时怎么做到直接微信内下载

大家是不是经常会遇到微信内点击链接或扫描二维码无法打开指定网页的问题?只要你使用微信转发分享,相信你就一定会遇到,那么打不开的原因很简单了,就是被微信拦截了。这个问题我们只需要实...

日出真美
04/06
0
0
微信无法打开网页或无法打开下载页如何做提示跳转到浏览器打开

大家是不是经常会遇到微信内点击链接或扫描二维码无法打开指定网页的问题?只要你使用微信转发分享,相信你就一定会遇到,那么打不开的原因很简单了,就是被微信拦截了。这个问题我们只需要实...

我与以往
04/02
0
0
微信不支持打开下载APK(APP)下载链接的应对方案

大家是不是经常会遇到微信内点击链接或扫描二维码无法打开指定网页的问题?只要你使用微信转发分享,相信你就一定会遇到,那么打不开的原因很简单了,就是被微信拦截了。这个问题我们只需要实...

三尺之剑丶
03/30
0
0
APP下载链接被微信封杀拦截屏蔽怎么解封在微信中直接点击下载链接直接下载app

微信链接为什么会显示已停止防封 微信作为一个社交平台,把控安全完整的生态社交圈,屏蔽一些问题域名无可厚非,但是不能采取一刀切的方式来进行处理。 导致不少没有问题的域名也被拦截,更多...

安静的好
前天
0
0
请在微信外付订单,微信外怎么打开订单

一、 普通用户遇到请在微信外付订单的解决方法 有些人在使用智能手机, 或者pad购物时, 会遇到“请在微信外打开订单,进行支付”的提示, 解决的方法很简单, 你只要不在微信里打开那个网页...

towtotow
2018/02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js数组遍历和对象遍历

数组遍历 for for(var i=0,len=arr.length;i<len;i++){console.log(arr[i]);} forEach - ES5语法,性能比for弱,不能使用break终止循环,不能使用return arr.forEach(function(item,inde......

祖达
25分钟前
2
0
Java网络编程

基本概念 网络IO会涉及到同步,异步,阻塞,非阻塞等几个概念。 一个网络IO读取过程是数据从 网卡 到 内核缓冲区 到 用户内存 的过程。同步和异步区别在于数据从内核到用户内存的过程是否需要...

春哥大魔王的博客
47分钟前
2
0
Spring "reg:zookeeper" 的前缀 "reg" 未绑定等类似问题解决方案。

今天同事遇到一个Spring启动加载配置文件时,不识别reg:zookeeper标签的问题。 我查看配置,发现是Spring配置文件的头部没有引入reg标签的命名空间,具体如下图: 所以,以后遇到类似的标签未...

花漾年华
今天
2
0
阿里云领衔云市场

近期,2018年Q4及全年的全球云基础设施服务市场数据新鲜出炉,发布方是美国市场研究机构Synergy Research Group。这个机构是专做电信网络市场情报的公司,成立于1999年,每年都会公布各大公有...

linuxCool
今天
2
0
C++友元函数和友元类(C++ friend)详解

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书...

shzwork
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部