分享網頁到微信朋友圈,怎樣才能帶縮略圖?

做微信H5的朋友都知道,在過去要設置"分享到朋友圈"的縮略圖,是非常簡單的一件事情,只需要製作一張300*300的縮略圖片(如命名爲300.jpg),然後在頁面head部分的開頭引入微信朋友圈縮略圖代碼即可。


92ruckj3.png

<!doctype html>
<html>
<head>
	<div id='wx_pic' style='margin:0 auto;display:none;'>
	  <img src='i/300.jpg'>
	</div>
//其餘代碼...

這一招本來是屢試不爽的。本人也已經有挺長時間沒有做微信中的H5了,直到這兩天,因爲手頭要做一個簡單的微信H5,所以拾掇拾掇又用了這招。沒想到,這次居然失效了。不管怎麼試,分享朋友圈的時候,縮略圖都出不來。一直是這麼個默認的圖標:

2019042310374868.png

然後再去網上看了下,這才發現微信團隊在今年3月29號就發了一篇文章《JSSDK自定義分享接口的策略調整》,裏面明確說明了:


爲規範自定義分享鏈接功能在網頁上的使用,自2017年4月25日起,JSSDK“分享到朋友圈”及“發送給朋友”接口,自定義的分享鏈接,其域名或路徑必須與當前頁面對應的公衆號JS安全域名一致,否則將調用失敗。

例如,當前頁面是 http://www.abc.com/123,其公衆號對應的JS安全域名爲 http://www.abc.com 以及 http://www.xyz.com,則分享自定義鏈接 http://www.abc.com/456 可以成功,分享 http://www.xyz.com/123 或 http://www.def.com/123 均將失敗。

對於未接入微信JSSDK或已接入但JSSDK調用失敗的網頁,被用戶分享時,分享卡片將統一使用默認縮略圖和標題簡介,不允許自定義。

接口完整用法請參考《微信JSSDK說明文檔》,請開發者及時完成調整。


好吧。還好我手頭服務號和企業號(還沒有升級到企業微信)的認證賬號都有。我看了下,兩者的文檔分別在以下地址的“分享接口”部分(其實沒啥大區別):


服務號:https://mp.weixin.qq.com/wiki?


企業號:微信JS-SDK接口 - 企業號開發者接口文檔


因爲手頭要推的東西是放在企業號裏的,於是以企業號爲例,簡要說明一下開發過程。


首先,在頁面中引入微信的JS-SDK的JS文件。

<script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>

然後,取accesstoken,以PHP和微信企業號爲例(最好存在服務器上,沒過期前從緩存文件裏取,以避免頻繁調用)。如果使用微信服務號的話,API地址和企業號有所不同。

$output = http_post_data("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=******&corpsecret=*****"");
$res = json_decode($output, true);
$accessToken = $res["access_token"];

接下來,獲取jsapi_ticket,同理,最好緩存在服務器上而非每次調用。

$output = http_post_data("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=".$accessToken,"");
$getTicket = json_decode($output, true);
$ticket = $getTicket['ticket'];

然後,獲取nonceStr,這個微信已經給出了算法,照着用就行。

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;
}
$nonceStr = createNonceStr();

然後,取timestamp,即當前時間。

$timestamp = time();

接下來取url值,這個必須是安全域名中設置的域。

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

東西都準備好了,拼到一起後sha編碼,然後打成一個包。

$string = "jsapi_ticket=".$ticket."&noncestr=".$nonceStr."&timestamp=".$timestamp."&url=".$url;
$signature = sha1($string);
$signPackage = array(
      "appId"     => "******",
      "nonceStr"  => $nonceStr,
      "timestamp" => $timestamp,
      "url"       => $url,
      "signature" => $signature,
      "rawString" => $string
);

PHP的部分完成了,最後就是在Body前用JS註冊“分享到朋友圈”這一個API,API的名稱爲onMenuShareTimeline,在其中註冊imgUrl,即可設置好分享縮略圖。

<script type="text/javascript">	
	wx.onMenuShareTimeline({
		imgUrl: '需要的縮略圖地址'
	});
	wx.config({
		debug: false,
		appId: '<?php echo $signPackage["appId"];?>',
		timestamp: <?php echo $signPackage["timestamp"];?>,
		nonceStr: '<?php echo $signPackage["nonceStr"];?>',
		signature: '<?php echo $signPackage["signature"];?>',
		jsApiList: [
		  'onMenuShareTimeline'
		]
	  });
</script>

在上面的代碼中,我只設置了imgUrl這一個參數,實際上,還能夠在這裏設置標題等其他的參數。

wx.onMenuShareTimeline({
    title: '', // 分享標題
    link: '', // 分享鏈接,該鏈接域名必須與當前企業的可信域名一致
    imgUrl: '', // 分享圖標
    success: function () {
        // 用戶確認分享後執行的回調函數
    },
    cancel: function () {
        // 用戶取消分享後執行的回調函數
    }
});

現在,刷新一下,再次選擇“分享到朋友圈”,就可以看到你設置的縮略圖啦。

GetwxLink

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章