1. 程式人生 > >H5文章分享給好友或朋友圈後如何生成自定義分享內容

H5文章分享給好友或朋友圈後如何生成自定義分享內容

前言

以前h5網頁在微信裡開啟,右上角分享到微信好友或者朋友圈 是微信自己抓取的首圖 現在 好像不行了。這是因為微信更新了API,必須自行配置,接入jssdk,才能實現自定義分享資訊的功能。詳細可以檢視微信官方開發者文件,地址:

JS介面安全域名

接入jssdk時,就需要配置JS介面安全域名,因此需要登入微信公眾平臺,在公眾號設定→功能設定中,填寫JS介面安全域名,域名即為H5專案的域名(如:www.baidu.com),同時需要下載一個txt驗證檔案,並放置到伺服器的根路徑下,實際操作時根據提示即可。

1.png

設定白名單

這一步其實應該放到後面獲取access_token步驟中,我這裡正好已經登入在公眾號平臺,所以就一併操作了。後面講到獲取access_token和jsapi_ticket時,需要訪問伺服器,因此需要將H5專案伺服器的IP地址新增到白名單中,否則介面將無法呼叫成功。具體設定方法:在開發→基本設定→IP白名單中進行新增相應的IP地址即可。如下圖所示

2.png

獲取access_token

access_token是公眾號的全域性唯一介面呼叫憑據,公眾號呼叫各介面時都需使用access_token。詳細說明詳見官當開發文件:

首先需要在H5頁面內中引入js檔案

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

具體獲取的程式碼如下:

$.ajax({
  url: "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=AppSecret";,  //介面地址
  type: "Get",
  dataType: 'jsonp',
  crossDomain: true,//與上一項解決跨域問題
  success: function (data) {
   //將access_token快取起來
   localStorage.setItem("access_token", data.access_token);
  }
});

其中引數appid和secret均可以在公眾號後臺檢視獲取。

獲取jsapi_ticket

jsapi_ticket是公眾號用於呼叫js介面的臨時票據。有效期7200秒,跟公眾號普通access_token一樣,必須全域性快取起來,因為這個ticket獲取次數有限,超過次數將無法使用。獲取jsapi_ticket也是為了後面生成signature簽名做準備。具體方法與access_token類似,替換訪問介面即可。

$.ajax({
 url: "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi",  //介面地址
 type: "Get",
 dataType: 'jsonp',
 crossDomain: true,
 success: function (data) {
   //快取jsapi_ticket
   localStorage.setItem("jsapi_ticket", ticket);
 }
});

生成signature,並自定義分享資訊

前臺的程式碼實現:

var url = location.href.split('#')[0];  //分享的文章地址
var requestUrl = "/app/getticket?ticket=" + ticket + "&url=" + url;
$.ajax({
	url: requestUrl,
	type: "Get",
	dataType: 'json',
	success: function (data) {
		var appId = data.appId;
		var timestamp = data.timestamp;
		var nonceStr = data.noncestr;
		var signature = data.signature;
		wx.config({
			debug: false, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,
						  // 若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
			appId: appId + '', // 必填,公眾號的唯一標識
			timestamp: timestamp + '', // 必填,生成簽名的時間戳
			nonceStr: nonceStr + '', // 必填,生成簽名的隨機串
			signature: signature + '',// 必填,簽名,見附錄1
			jsApiList: ["onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ"] 
			// 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
		});

		wx.ready(function () {
			var imgurl = '縮圖完整地址';
			var title = '自定義標題';
			var desc = '自定義描述資訊';
			wx.onMenuShareTimeline({
				title: title, // 分享標題
				desc: desc, // 分享描述
				link: url, // 分享連結
				imgUrl: imgurl, // 分享圖示
				success: function () {
					// 使用者確認分享後執行的回撥函式
				},
				cancel: function () {
					// 使用者取消分享後執行的回撥函式
				}
			});

			wx.onMenuShareAppMessage({
				title: title, // 分享標題
				desc: desc, // 分享描述
				link: url, // 分享連結
				imgUrl: imgurl, // 分享圖示
				type: '', // 分享型別,music、video或link,不填預設為link
				dataUrl: '', // 如果type是music或video,則要提供資料鏈接,預設為空
				success: function () {
					// 使用者確認分享後執行的回撥函式
				},
				cancel: function () {
					// 使用者取消分享後執行的回撥函式
				}
			});

			wx.onMenuShareQQ({
				title: title, // 分享標題
				desc: desc, // 分享描述
				link: url, // 分享連結
				imgUrl: imgurl, // 分享圖示
				success: function () {
					// 使用者確認分享後執行的回撥函式
				},
				cancel: function () {
					// 使用者取消分享後執行的回撥函式
				}
			});
		});
	}
});

後臺生成簽名的邏輯程式碼:

/// <summary>
///  根據傳入的jsapi_ticket生成signature簽名
/// </summary>
/// <param name="ticket"></param>
/// <returns></returns>
public JsonResult GetTicket(string ticket, string url)
{
    SignatureTicket model = new SignatureTicket();
    model.appId = CommonSharp.appId;
    model.noncestr = CommonSharp.GetRnd(16, true, true, true, false, "");
    model.timestamp = CommonSharp.GetTimeStamp();
    string _url = System.Web.HttpUtility.UrlDecode(url);
    string string1 = "jsapi_ticket=" + ticket + "&noncestr=" + model.noncestr + "×tamp=" + model.timestamp + "&url=" + url;
    model.signature = CommonSharp.GetPwd(string1);
    return Json(model);
}

其中GetPwd方法的邏輯如下:

public static string GetPwd(string str)
{
    byte[] cleanBytes = Encoding.Default.GetBytes(str);
    byte[] hashedBytes = System.Security.Cryptography.SHA1.Create().ComputeHash(cleanBytes);
    return BitConverter.ToString(hashedBytes).Replace("-", "");
}

至此,需要配置的以及後臺程式碼均已完畢,釋出後放到伺服器上進行測試使用。

---------------------------------- 完美的分割線 ---------------------------------------

根據上面的方式,開始確實可以實現想要的功能,但晚上下班回家了,無意中再次開啟時發現又不行了,在電腦上檢視時,報瞭如下錯誤:

invalid credential, access_token is invalid or not latest hint

一番折騰之後發現,是由於access_token過期了,導致生成的簽名失敗。分析上面的程式碼,發現將獲取到的access_token快取到localstorage的邏輯是有問題的,獲取到的access_token預設有效期為2小時,如果重新請求API介面,新的access_token會覆蓋原來的值,而我將access_token存入localstorage後,其實並沒有做進一步的有效期的校驗和定時重新整理,所以過了有效期之後,自然就會出現上面的那個錯誤了。

知道了原因,那就開始動手修改吧。當在前端利用jsonp訪問微信API介面時,莫名其妙的又出現了另一個錯誤:

Uncaught SyntaxError: Unexpected token :

這個應該是跟ajax跨域請求返回的資料格式有關係,但是試了很多方法都不行,無奈,只好換一種思路,打算不再從前端獲取access_token了,改從後端去獲取,這樣就可以避免了ajax訪問時跨域的問題。還是直接上程式碼吧~~

後臺C#程式碼實現如下:

/// <summary>
///  獲取access_token
/// </summary>
/// <returns></returns>
public JsonResult GetAccessToken()
{
  AccessToken result = new AccessToken();
  if (HttpRuntime.Cache == null)
  {
    result = GetToken();
  }
  var accessTokenCache = HttpRuntime.Cache.Get(CommonSharp.token_cahekey);
  if (accessTokenCache != null)
  {
    result.Token = accessTokenCache.ToString();
  }
  else
  {
    result = GetToken();
  }
  return Json(result);
}
private AccessToken GetToken()
{
    AccessToken result = new AccessToken();
    var client = new WebClient();
    client.Encoding = System.Text.Encoding.UTF8;
    var responseData = client.DownloadString(string.Format(@"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential
        &appid={0}&secret={1}", CommonSharp.appId, CommonSharp.app_secret));
    var serializer = new JavaScriptSerializer();
    var accessDictionary = serializer.Deserialize<Dictionary<string, object>>(responseData);
    var accessToken = accessDictionary[CommonSharp.token_cahekey];
    if (accessToken != null)
    {
        HttpRuntime.Cache.Insert(CommonSharp.token_cahekey, accessToken, null, DateTime.Now.AddSeconds(7100), 
            TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal, null);
        result.Token = accessToken.ToString();
    }
    return result;
}

相關推薦

H5文章分享好友朋友如何生成定義分享內容

前言以前h5網頁在微信裡開啟,右上角分享到微信好友或者朋友圈 是微信自己抓取的首圖 現在 好像不行了。這是因為微信更新了API,必須自行配置,接入jssdk,才能實現自定義分享資訊的功能。詳細可以檢視微信官方開發者文件,地址:JS介面安全域名接入jssdk時,就需要配置JS介

微信JSSDK分享朋友微信定義分享接口

永久 blank 公眾號 sdk 項目 開發 inf src height 服務項目 新手技術咨詢 企業技術咨詢 定制開發 服務說明 QQ有問必答 QQ、微信、電話 微信開發、php開發,網站開發,系統定制,小程序開發 價格說明 200元/月 1000/月 商

微信JSSDK分享朋友微信定義分享介面

服務專案 新手技術諮詢 企業技術諮詢 定製開發 服務說明 QQ有問必答 QQ、微信、電話 微信開發、php開發,網站開發,系統定製,小程式開發 價格說明 200元/月 100

Android APP中跳轉至微信,分享圖文好友或者朋友(加跳轉QQ好友QQ群)

/**      * 分享圖片給好友      *      * @param file      */ private void shareToFriend(File file) {     Intent intent = new Intent();     ComponentName comp = new

H5分享帶縮圖,描述,微信內分享好友朋友

準備工作 需要一個認證的微信公眾號,一定要確定認證 在公眾號設定–>功能設定,填寫設定Js介面安全域名 Js安全域名是需要把微信提供的檔案,放在指定域名或者目錄下面可以訪問的。 配置資訊 在獲取signature之前,需要獲取acc

微信分享好友或者朋友的截圖圖片

寫了一個Demo,裡邊的介面不太好看,一部分是我自己PS的,菜鳥PS,但是寫的過程中遇到了一些問題,在這裡做一遍記錄,以便今後查證,程式碼中做了大量的註釋: 重點突出以下幾個知識點; 一:跳轉傳值 intent傳值,可以是String/boolean/int/byte[]

iOS9中實現微信分享好友朋友

微信SDKdemo執行錯誤問題 微信SDK接入設定 實現分享到好友、朋友圈 微信SDKdemo執行錯誤問題 下載了官方的demo,激動地運行了一下,十幾個錯誤,內心其實是崩潰的。 根據錯誤提示,去修改a

TP5 微信分享朋友介面顯示定義圖片和標題

在tp5框架下對接微信分享朋友圈介面,並顯示圖片和標題。準備步驟:1,先登入微信公眾平臺進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名”。2,獲取公眾號對應的 appid 和 appsecret。3.公眾號取得認證。不羅嗦,直接上程式碼:1,js 程式碼,在需要分享

如何實現分享連結到微信朋友時顯示定義LOGO以及名稱介紹

當下朋友圈很火,很多企業都將微信朋友圈作為品牌傳播的途徑,經常會發一些精彩的文章到微信朋友圈供大家自發傳播,這樣的想法很好,對於優

Next Cloud通過修改資料庫表,達到替換檔案而不改變分享的連結地址的效果,以及定義分享連結地址

# Next Cloud如何通過修改資料庫表,達到替換檔案而不改變分享的連結地址的效果,以及自定義分享的連結地址 本文首發於我的個人部落格:https://chens.life/nextcloud-change-share-files.html ## 前言 本站 [失眠孤島](https://chens

h5網頁在微信裏打開 右上角分享到微信好友或者朋友

sta can debug 簽名 AS get res tle 鏈接 首先你需要一個分享接口地址,然後在自定義圖片 標題 描述 如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"&

使用微信api將內容分享好友,或者傳送到朋友

http://blog.csdn.net/u012591761/article/details/42263009 現在我們給應用新增一個功能,能在應用內將訊息分享給微信好友,或者分享到朋友圈中。 我們首先來到微信開放平臺官網,跟著組織走,官網指南: https://ope

如何修改手機端分享網頁微信好友朋友顯示的圖片和標題

最初,我以為這個東西很複雜,還微信開發者哪裡找了文件來看。準備使用微信JS-SDK裡面的方法….. 但是它僅僅只是這樣子的簡單。 微信好友和朋友圈都差不多,以分享到微信好友的為例 &l

android 分享到微信朋友微信好友

一、首先建立一個數字簽名(keystore檔案)這裡不再講述keystore的建立過程! 二、用keystore給app簽名,注意最後如下圖所示 圖中的md5就是 申請apkid時所需的 簽名,這裡需要注意MD5需要將其中的“:”去掉並將其中的大寫字母改為小寫 三、申請微

apiCloud 三方分享,微信好友分享,微信朋友分享,QQ分享,微博分享

-s -a nbsp 分享 ocs 配置 博客 微信朋友圈 icloud 首先查看我的這篇有關三方登錄的博客,地址是http://www.cnblogs.com/gqx-html/p/8303567.html,配置完三方數據後可以從上一篇文章中的鏈接跳轉到各個登錄查看api

h5怎麽做分享到QQ 、朋友、微信 、微博等功能

必備工具 con null 描述 one url key cts function 微信已經成為我們日常聊天聯系基本的必備工具,所以小菜我首先介紹一下如何調用微信的分享功能。其實除了可以在微信上分享到朋友圈和發送給好友,微信的分享接口還提供了分享到QQ和分享到騰訊微博等,

微信分享朋友朋友

直接上程式碼 說明:因為微信的jsapi_ticket和token有時效性(7200秒)但微信那邊有限制你不能頻繁訪問,所以,我這裡是將這兩個引數存放至資料庫的,為避免剛好到7200秒時造成的分享失效,所以,在從資料庫查詢的時候,時效失效時間比較是比較的5

網狐榮耀版房卡房間分享好友好友點選空白,沒反應的解決辦法

最近總遇到網友反應,網狐榮耀版房卡遊戲,在建立房間後,邀請好友等操作後。好友點選分享連結沒反應或是空白,或是出錯。經過仔細檢查,發現他的遊戲系統的lua客戶端與伺服器端與網站根本就不是配套的,不是一個

Android之微信開放平臺實現分享分享好友朋友

開發中分享操作往往經常遇到,而且還是一些比較大型一定的平臺,如微信,QQ,微博等。寫這篇部落格主要是把微信的的分享和相關操作表達一下,分享可以包含:文字,視訊,音樂,圖片等分享。分享可以有 分享給好友,群,朋友圈等。效果如下圖:(注意:功能根據自己的需要選擇就可以了)    

Android 實現微信分享好友朋友

1.在微信開放平臺 建立移動應用,並通過稽核,這裡要注意的是應用簽名要一致,(下載官網上的APK,輸入包名就可以生成了) 2.具體用法可以看官網的文件,這裡只總結使用過程遇到的問題和解決方法 3. 參照這個用法分享是可以的,但是如果你的圖片大於32kb就不