一、概述
做这个的需求是同事和客户经常反馈说,把网址分享到微信群或者朋友圈,不显示自定义图标,问有什么解决方法,网上也查了好多资料,做了不少的尝试,做了很久测试才成功,网上的资料不太完整,少了一点地方没有注意到图标都不会显示,这里作者特把网上没有注意到的地方整理出来,希望对有需要这个功能的朋友有一定的帮助

要实现分享网址到朋友圈显示缩略图的功能,需要注意这5点,不满足的就不用往下测试了,测试了也不会有效果的
1)需要认证公众号才行,认证的公众号才有分享接口权限
2)需要jquery脚本支持
3)图片地址必须写全,不能相对引用
4)网址不能含有特殊字符
5)网站本身必须完成工信部备案

二、制作流程
1、添加IP白名单,注意:开启了密钥后,才有IP白名单那个选项
登陆自己已认证公众号,点击“开发”—“基本配置”—“IP白名单”,将自己网站对应的IP加入即可,AppID和AppSecret记得保存好,后面备用

2、增加JS接口安全域名
点击“设置”—“公众号设置”—“功能设置”—“JS接口安全域名”,将自己的网站域名加入即可

3、引入JS文件
在自己网站的具体要分享的页面增加如下JS脚本,把脚本里面的标题、摘要、图片地址以及url根据实际情况改成自己的就可以了
<script src="https://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script> <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script> //需要jquery支持 var wxshare = { title:document.title, //这是填要分享的标题 desc: $("*[name='description']").attr("content"), //这里填要分享的摘要 url:location.href, img:"https://这里改为你自己的网址.com/logo.png"//这里填要显示的小图标地址,推荐200X200像素,地址要补全 }; $.ajax({ type : "get", url : "https://这里改为你自己的网址.com/jssdk.php?url="+wxshare.url, dataType : "jsonp", jsonp: "callback", jsonpCallback:"success_jsonpCallback", success : function(data){ wx.config({ debug: false, appId: data.appId, timestamp: data.timestamp, nonceStr: data.nonceStr, signature: data.signature, jsApiList: [ 'onMenuShareTimeline',// 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone' ] }); }, error:function(data){ alert("连接失败!"); } }); wx.ready(function () { var shareData = { title: wxshare.title, desc: wxshare.desc, link: wxshare.url, imgUrl: wxshare.img }; wx.onMenuShareAppMessage(shareData);//分享给好友 wx.onMenuShareTimeline(shareData);//分享到朋友圈 wx.onMenuShareQQ(shareData);//分享给手机QQ wx.onMenuShareWeibo(shareData);//分享腾讯微博 wx.onMenuShareQZone(shareData);//分享到QQ空间 }); wx.error(function (res) { //alert(res.errMsg);//错误提示 }); </script>
url : "https://这里改为你自己的网址.com/jssdk.php?
这个地方的网址不一定是当前的网址,如果有多个网站,可以把jssdk.php放到某个固定的地方,然后多个网站引用同一个地方的jssdk.php即可
4、引入jssdk.php文件
将jssdk.php文件放到网站根目录即可,并把这行代码里的AppID和AppSecret改成自己公众号里面实际的账号即可,同时注意把jssdk.php文件设置成可写
$jssdk = new JSSDK("wx********************", "*************************",$url);
<?php //jssdk.php文件 $url = $_GET['url']; class JSSDK { private $appId; private $appSecret; private $url; public function __construct($appId, $appSecret,$url) { $this->appId = $appId; $this->appSecret = $appSecret; $this->url = $url; } public function getSignPackage() { $jsapiTicket = $this->getJsApiTicket(); $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; // $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $url =$this->url; $timestamp = time(); $nonceStr = $this->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; $signature = sha1($string); $signPackage = array( "appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ); return $signPackage; } private 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; } private function getJsApiTicket() { // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("jsapi_ticket.json")); if ($data->expire_time < time()) { $accessToken = $this->getAccessToken(); // 如果是企业号用以下 URL 获取 ticket // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken"; $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken"; $res = json_decode($this->httpGet($url)); $ticket = $res->ticket; if ($ticket) { $data->expire_time = time() + 7000; $data->jsapi_ticket = $ticket; $fp = fopen("jsapi_ticket.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $ticket = $data->jsapi_ticket; } return $ticket; } private function getAccessToken() { // access_token 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("access_token.json")); if ($data->expire_time < time()) { // 如果是企业号用以下URL获取access_token // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret"; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret"; $res = json_decode($this->httpGet($url)); $access_token = $res->access_token; if ($access_token) { $data->expire_time = time() + 7000; $data->access_token = $access_token; $fp = fopen("access_token.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $access_token = $data->access_token; } return $access_token; } private 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; } } $jssdk = new JSSDK("wx********************a", "*************************",$url); $signPackage = $jssdk->GetSignPackage(); $tmp=json_encode(array ('appId'=>$signPackage["appId"],'timestamp'=>$signPackage["timestamp"],'nonceStr'=>$signPackage["nonceStr"],'signature'=>$signPackage["signature"],'url'=>$signPackage["url"])); $callback = $_GET['callback']; echo $callback.'('.$tmp.')'; exit; ?>
至此,网页链接分享到微信好友或者朋友圈显示自定义图标的整站效果就部署完成了,感兴趣的朋友可以试试。由于微信公众号分享接口只针对“JS接口安全域名”里已授权的域名有效,出于安全考虑,任何第三方没有授权的网站是不能直接调用分享接口的,那么针对任何一个网站地址,能不能实现只用一个认证公众号,然后就能实现分享时显示自定义图标的效果呢,其实也是可以实现的,出于篇幅的考虑,作者将在下一篇文章《PHPCMS实现网址分享到朋友圈,显示自定义图标和摘要效果,并带后台管理系统源码》继续为大家介绍。