1. 程式人生 > >微信分享到朋友或朋友圈

微信分享到朋友或朋友圈

直接上程式碼

說明:因為微信的jsapi_ticket和token有時效性(7200秒)但微信那邊有限制你不能頻繁訪問,所以,我這裡是將這兩個引數存放至資料庫的,為避免剛好到7200秒時造成的分享失效,所以,在從資料庫查詢的時候,時效失效時間比較是比較的5000秒
注意:我這種寫法雖然可以實現功能,但是不建議使用這種方式,因為js部分是通過後臺註冊到前端的,如果與前端某個js有衝突,或者前端有js報錯,那麼註冊部分的js就不會接著往下執行。正確寫法是寫到js裡面或者直接寫到頁面裡面
微信分享的核心就是帶著appid等引數進行兩次介面對接獲取引數。

前臺需引用的js:
<%--微信分享相關js--%>
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"
></script> 後臺部分程式碼: private void RegisterWeiXinShareScript() { string aaa = CreateTimeStamp().ToString(); //公眾號的應用ID string appid = "wxxxxxxxxxxxx"; //公眾號的應用金鑰 string secret = "xxxxxxxxxxxxxx"; //生成簽名的時間戳 TimeSpan ts = DateTime.Now - DateTime.Parse("1970-01-01 00:00:00"
); string timestamp = ts.TotalSeconds.ToString().Split('.')[0]; //生成簽名的隨機串 string nonceStr = Utils.Number(6); //微信access_token,用於獲取微信jsapi_ticket string token = GetAccess_token(appid, secret); if (string.IsNullOrWhiteSpace(token)) { string
tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret; //移除拼接過程中產生的換行符、空格 tokenUrl = tokenUrl.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", ""); string jsonresult = HttpGet(tokenUrl, "UTF-8"); WX_Token wx = JsonDeserialize<WX_Token>(jsonresult); //重新整理資料庫快取資料 token = wx.access_token; //Utils.WriteLog("", "token", "token第二次獲取結果:" + token + "---" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } //微信jsapi_ticket string ticket = GetTicket(token); if (string.IsNullOrWhiteSpace(ticket)) { //--------------------------------第二次獲取證書失效,可能是token過期 string ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi"; //移除拼接過程中產生的換行符、空格 ticketUrl = ticketUrl.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", ""); string jsonresult = HttpGet(ticketUrl, "UTF-8"); WX_Ticket wxTicket = JsonDeserialize<WX_Ticket>(jsonresult); ticket = wxTicket.ticket; } //當前網頁的URL string pageurl = Request.Url.AbsoluteUri; //對所有待簽名引數按照欄位名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字串 string str = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + pageurl; //簽名,使用SHA1生成 string signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1").ToLower(); //要註冊到頁面的JS指令碼 StringBuilder sbjsApi = new StringBuilder(); sbjsApi.Append("<script>"); //通過config介面注入許可權驗證配置 sbjsApi.Append("wx.config({debug:false,"); sbjsApi.Append("appId: '" + appid + "',"); sbjsApi.Append("timestamp: " + timestamp + ","); sbjsApi.Append("nonceStr: '" + nonceStr + "',"); sbjsApi.Append("signature: '" + signature + "',"); sbjsApi.Append("jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'chooseImage', 'uploadImage', 'getNetworkType']});"); //通過ready介面處理成功驗證 sbjsApi.Append("wx.ready(on_weixin_ready);"); sbjsApi.Append("function on_weixin_ready() {weixin_share();}"); //獲取“分享給朋友”按鈕點選狀態及自定義分享內容介面 sbjsApi.Append("function weixin_share(){"); sbjsApi.Append("wx.onMenuShareAppMessage({"); sbjsApi.Append("title:'" + act_detail_title + "',"); sbjsApi.Append("desc:'" + act_detail_desc + "',"); //sbjsApi.Append("link:'分享出去的連結地址',"); sbjsApi.Append("imgUrl:'" + act_detail_img + "',"); sbjsApi.Append("type:'link',"); sbjsApi.Append("dataUrl:'',"); sbjsApi.Append("success: function () { $.post('../programs/Pro_User.ashx', { action: 'AddShareNo',typeId:'" + SjuneRequest.GetQueryString("id") + "' }, '', 'Json');alert('分享成功!【朋友】');},"); sbjsApi.Append("cancel:function () {}"); sbjsApi.Append("});"); //獲取“分享到朋友圈”按鈕點選狀態及自定義分享內容介面 sbjsApi.Append("wx.onMenuShareTimeline({"); sbjsApi.Append("title:'" + act_detail_title + "',"); sbjsApi.Append("imgUrl:'" + act_detail_img + "',"); sbjsApi.Append("success: function () { $.post('../programs/Pro_User.ashx', { action: 'AddShareNo',typeId:'" + SjuneRequest.GetQueryString("id") + "' }, '', 'Json');alert('分享成功!【朋友圈】');},"); sbjsApi.Append("cancel:function () {}"); sbjsApi.Append("});}"); sbjsApi.Append("</script>"); Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "weixin", sbjsApi.ToString().Trim()); } /// <summary> /// 獲取微信jsapi_ticket /// </summary> /// <param name="token">access_token</param> /// <returns>jsapi_ticket</returns> public string GetTicket(string token) { string tickId = ""; //DataSet ds = new BLL.Ticket().GetList(" id=1"); //int start_time = ds.Tables[0].Rows[0]["Ticket_Dt"].ToInt(); //int new_time = CreateTimeStamp(); //if ((new_time.ToInt() - start_time.ToInt()) > 7000) //{ //超時,重新生成並更新資料 string ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi"; ticketUrl = ticketUrl.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", ""); string jsonresult = HttpGet(ticketUrl, "UTF-8"); WX_Ticket wxTicket = JsonDeserialize<WX_Ticket>(jsonresult); //重新整理資料庫快取資料 //Model.Ticket db_model = new BLL.Ticket().GetModel(1); //db_model.Ticket_Dt = CreateTimeStamp().ToString(); //db_model.Ticket_Id = wxTicket.ticket; //new BLL.Ticket().Update(db_model); tickId = wxTicket.ticket; //} //else //{ // tickId = ds.Tables[0].Rows[0]["Ticket_Id"].ToString(); //} return tickId; } /// <summary> /// 獲取微信access_token /// </summary> /// <param name="appid">公眾號的應用ID</param> /// <param name="secret">公眾號的應用金鑰</param> /// <returns>access_token</returns> private string GetAccess_token(string appid, string secret) { string tokenId = ""; DataSet ds = new BLL.Ticket().GetList(" id=1"); int start_time = ds.Tables[0].Rows[0]["Ticket_Dt"].ToInt(); int new_time = CreateTimeStamp(); if ((new_time.ToInt() - start_time.ToInt()) > 5000) { //超時,重新生成並更新資料 string tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret; tokenUrl = tokenUrl.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", ""); string jsonresult = HttpGet(tokenUrl, "UTF-8"); WX_Token wx = JsonDeserialize<WX_Token>(jsonresult); //重新整理資料庫快取資料 Model.Ticket db_model = new BLL.Ticket().GetModel(1); db_model.Ticket_Dt = CreateTimeStamp().ToString(); db_model.Token_Id = wx.access_token; new BLL.Ticket().Update(db_model); tokenId = wx.access_token; } else { tokenId = ds.Tables[0].Rows[0]["Token_Id"].ToString(); } return tokenId; } /// <summary> /// JSON反序列化 /// </summary> /// <typeparam name="T">實體類</typeparam> /// <param name="jsonString">JSON</param> /// <returns>實體類</returns> private T JsonDeserialize<T>(string jsonString) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T obj = (T)ser.ReadObject(ms); return obj; } /// <summary> /// HttpGET請求 /// </summary> /// <param name="url">請求地址</param> /// <param name="encode">編碼方式:GB2312/UTF-8</param> /// <returns>字串</returns> private string HttpGet(string url, string encode) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "application/json; encoding=utf-8"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding(encode)); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; } /// <summary> /// 生成時間戳 /// </summary> /// <returns></returns> private int CreateTimeStamp() { TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds).ToInt(); } /// <summary> /// 通過微信API獲取access_token得到的JSON反序列化後的實體 /// </summary> public class WX_Token { public string access_token { get; set; } public string expires_in { get; set; } } /// <summary> /// 通過微信API獲取jsapi_ticket得到的JSON反序列化後的實體 /// </summary> public class WX_Ticket { public string errcode { get; set; } public string errmsg { get; set; } public string ticket { get; set; } public string expires_in { get; set; } }

如有問題,請加我QQ:631931078或352167311

相關推薦

分享內容給朋友朋友、QQ、QQ空間等

示例網頁 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="renderer" content="webkit"> <meta

Android 實現分享好友和朋友

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

分享朋友朋友

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

公眾平臺網頁開發實戰--1.分享一個網頁到朋友

微信開發 html5 jssdk 實戰 網頁開發 對微信的JSSDK進行封裝一下,創建一份類似的文件結構,增加index.html與shareApi.js文件,結構如圖3.3所示。 圖3.3 3.2節文件結構另外,提醒讀者一下,wxJSSDK.js文件的JSSDK環境配置中,需要

h5 分享朋友朋友

lose reat 加載 -1 微信 host ces menus html 生成JS-SDK權限驗證簽名 實現發送給朋友和分享到朋友圈時內容參數自定義 一、微信JS-SDK 1. 獲得Access Token access token的獲得方法在前面有介紹,詳情見

php實現分享朋友

public private abcd ushare name preview set PE char class JSSDK { private $appId; private $appSecret; public function __construct($a

iOS 分享朋友

最近要加微信朋友圈分享的功能,上官網下檔案,照著文件搭環境,但是總有錯誤,於是百度部落格來看,發現和官方文件一樣,解決不了自己的問題,現在問題解決了,分享出來希望對大家有幫助。 1.首先要向微信註冊你的應用程式IDhttps://open.weixin.qq.com/cgi-bin/frame?

Vux+Cordova打包的安卓App實現分享朋友朋友

知識儲備 Cordova Plugin ShareSDK 外掛 什麼是Cordova Plugin ShareSDK Cordova Plugin ShareSDK封裝了ShareSDK的android和ios平臺的分享功能。在hybird app開發中可以方便的完成分享功能。如:ion

分享朋友分享程式碼自定義標題、說明、圖示和分享連結

最近在做手機網站在分享到微信時,通過微信內建瀏覽器訪問頁面分享後,希望可以自定義小圖示(imgUrl)和分享連結(lineLink),下面下微信內建瀏覽器分享功能的JS程式碼,希望對大家有所幫助。 JS程式碼如下:        var imgUrl = "http://www.gdibn.com/m/im

簡單粗暴教你在VUE中引入微SDK 呼叫分享朋友分享、QQ分享......

寫在前面: 剛做了一個微信端的網頁,用到了微信分享,在網上看了好多的資料,發現好多文件都寫得雲裡霧裡,讓人看的頭疼。通過對很多大佬文章的綜合整理,才完成了微信分享的部分。所以我想著自己寫一篇文章,能讓看到我這篇文章的親們能夠清楚的明白在vue上怎麼使用微信分享SDK,能夠按照

分享朋友、傳送給朋友開發注意事項

1、invalid url domain 當前頁面所在域名與使用的appid沒有繫結,請確認正確填寫繫結的域名,如果使用了埠號,則配置的繫結域名也要加上埠號(一個appid可以繫結三個有效域名,見 目錄1.1.1)。 2、invalid signature簽名錯誤。 建議按如下順序檢查:

iOS開發之第三方分享分享朋友分享,史上最新最全第三方分享方式實現、朋友方式實現

微信分享前提:  1.需要成功在微信開發者平臺註冊了賬號, 並取的對應的 appkey appSecret。         2. 針對iOS9 添加了微信的白名單,以及設定了 scheme url 。 這都可以參照上面的連結,進行設定好。   3. 分享不跳轉的時

vue 分享朋友&&分享朋友程式碼封裝

1.新建share.js檔案 import {shareSDK} from "../api/common";//分享api import wx from 'weixin-js-sdk' export

分享朋友分享朋友JS程式碼

</body> <script>  $(document).ready(function(){   /*    * 注意:    * 1. 所有的JS介面只能在公眾號繫結的域名下呼叫,公眾號開發者需要先登入微信公眾平臺進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名”

分享朋友”介面— wx.onMenuShareTimeline() 和 onMenuShareAppMessage — 分享朋友介面

微信“分享到朋友圈”介面—— wx.onMenuShareTimeline()  注意事項: 1. 圖片大小要大於300pix才能顯示; 2. 這個方法必須先config成功,然後再wx.ready裡才能呼叫。直接放到$(function(){})裡執行,實踐證明是不行的。

分享功能(分享朋友朋友顯示圖片和簡介)

wx.config({ debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。 appId: '@Model.appId', // 必填,公眾號的唯一

分享到好友或者朋友的截圖圖片

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

不使用官方SDK,實現分享(傳送到朋友,傳送到朋友

發現很多同學發帖說使用微信官方提供的sdk,實現微信分享的過程中遇到問題。我下載了微信的sdk,測試了一下,也失敗了。估計是應用需要通過官方稽核。 既然官方sdk測試不了,那我就使用絕招了:下面便是傳送到朋友,傳送到朋友圈的程式碼。(可以同時傳送圖片和文字感謝@空心糖 的反

分享朋友或者好友介面無響應

@Override public void onResp(BaseResp resp) { switch (resp.errCode) { case BaseResp.ErrCode.ERR

分享朋友失敗,分享朋友等正常

微信分享朋友圈,提示             獲取資源失敗,僅支援分享照片至朋友圈 原因:繞過稽核分享到朋友圈一定要加一張圖片才可以的  ShareSDK.xml裡面   BypassAppr