1. 程式人生 > >微信分享(網站)ASP.NET

微信分享(網站)ASP.NET

實現的功能:
1、網址生成二維碼
2、微信掃描二維碼,開啟網址
3、微信APP右上角點選彈出選單分享
4、分享內容可自定義:標題、描述、連結、圖片

普通分享顯示圖:

普通分享顯示圖

介面分享顯示圖

介面分享顯示圖

微信公眾平臺文件地址:

微信網頁開發–>微信JS-SDK說明文件

微信JS-SDK說明文件 頁面最底部,有示例程式碼(可以直接點選以下連結下載,也可去微信分享文件底部查詢)

示例程式碼

文件內沒有 .NET 版本的分享示例程式碼(原因所在)

好吧,開始一段文字內容(其實在微信文件裡面複製的文字):

概述

微信JS-SDK是微信公眾平臺面向網頁開發者提供的基於微信內的網頁開發工具包。
通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信使用者提供更優質的網頁體驗。
此文件面向網頁開發者介紹微信JS-SDK如何使用及相關注意事項。

JSSDK使用步驟(微信文件裡看吧)

大致就是說:要先配置引數,然後再使用相關介面

開始使用部分

NeedSharePage.aspx 頁面

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js" type="text/javascript"></script>
<script type="text/javascript">
//配置你的微信配置資訊
        wx.config({
            debug: false, // 是否開啟除錯模式,除錯請改為true
            appId: '<%=appid %>'
, // 必填,公眾號的唯一標識 timestamp: '<%=timestamp %>', // 必填,生成簽名的時間戳 nonceStr: '<%=nonceStr %>', // 必填,生成簽名的隨機串 signature: '<%=signature %>', // 必填,簽名,見附錄1 jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage'
, 'onMenuShareQQ', 'onMenuShareQZone' ] // 必填,需要使用的JS介面列表,此處定義你需要的介面,所有JS介面列表見附錄2 }); // config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面獲得結果之後,config是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。 wx.ready(function(){ //如果使用自定義按鈕點選事件來分享,則不需要在ready內呼叫 //這裡我沒有使用自定義按鈕,所以需要在ready內呼叫 //wx.checkJsApi判斷當前客戶端版本是否支援指定JS介面,備註:checkJsApi介面是客戶端6.0.2新引入的一個預留介面,第一期開放的介面均可不使用checkJsApi來檢測。 wx.checkJsApi({ jsApiList: [ 'getLocation', 'onMenuShareTimeline', 'onMenuShareAppMessage' ], success: function (res) { alert(JSON.stringify(res)); } }); // 分享到朋友圈 wx.onMenuShareTimeline({ title: '<%=title %>', // 分享標題 link: '<%=link %>', // 分享連結,該連結域名或路徑必須與當前頁面對應的公眾號JS安全域名一致 imgUrl: '<%=imgUrl %>', // 分享圖示 success: function () { // 使用者確認分享後執行的回撥函式(可以進行分享數+1操作) //alert('分享成功'); }, cancel: function () { // 使用者取消分享後執行的回撥函式 // alert(22); } }); //分享給朋友、分享給QQ、分享QQ空間等都差不多,此處不再寫了。 });
</script>

簽名的生成

(微信文件內,可見 :附錄1-JS-SDK使用許可權簽名演算法)

jsapi_ticket

生成簽名之前必須先了解一下jsapi_ticket。
jsapi_ticket是公眾號用於呼叫微信JS介面的臨時票據。正常情況下,jsapi_ticket的有效期為7200秒,通過access_token來獲取

由於獲取jsapi_ticket的api**呼叫次數非常有限**,頻繁重新整理jsapi_ticket會導致api呼叫受限,影響自身業務,開發者必須在自己的服務
全域性快取jsapi_ticket

引數:
appid=公眾號的APPID
secret=公眾號金鑰

使用GET 請求,請求此地址。返回引數為:
{
“expires_in”:7200,
“access_token”:”xxxxxxxxxxxxxxxx”
}

返回引數為:
{
“errcode”:0,
“errmsg”:”ok”,
“ticket”:”xxxxxxxxxxxxxx”,
“expires_in”:7200
}

3.獲取到 JSAPI_TICKET 後,就可以使用簽名演算法進行簽名了。
簽名生成規則如下:參與簽名的欄位包括

noncestr, //隨機字串
jsapi_ticket, //有效的jspi_ticket
timestamp,//時間戳
url //當前網頁的URL,不包含#及其後面部分

。對所有待簽名引數按照欄位名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字串string1。這裡需要注意的是所有引數名均為小寫字元。對string1作sha1加密,欄位名和欄位值都採用原始值,不進行URL 轉義。

步驟1.
string1=jsapi_ticket=xxxxxxx&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value

步驟2. 對string1進行sha1簽名,得到signature:
0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事項
1.簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。
2.簽名用的url必須是呼叫JS介面頁面的完整URL。
3.出於安全考慮,開發者必須在伺服器端實現簽名的邏輯。
如出現invalid signature 等錯誤詳見附錄5常見錯誤及解決辦法。

生成後的簽名拿去校驗:

以下為自定義的分享類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WxPayAPI;
using System.Web;
using System.Web.Caching;
using Utils.Validate;

namespace Utils.WxPayAPI
{
    public class WxShareApi
    {
        /// <summary>
        /// 2根據 token 獲取jsapi_ticket
        /// </summary>
        /// <param name="access_token">token</param>
        /// <returns>jsapi_ticket</returns>
        private string Get_Jsapi_Ticket()
        {
            if (CacheClass.GetCache("jsapiticket") != null)
            {
                return CacheClass.GetCache("jsapiticket").ToString();
            }
            StringBuilder sb = new StringBuilder();
            sb.Append(WxPayConfig.GetJsApiTicketUrl).Append("?").Append("access_token=").Append(Get_Token()).Append("&").Append("type=jsapi");
            string jsapi_ticket = HttpService.Get(sb.ToString());
            JsapiTicket jsapiTicketObject = LitJson.JsonMapper.ToObject<JsapiTicket>(jsapi_ticket);
            CacheClass.SetCache("jsapiticket", jsapiTicketObject.ticket);
            return jsapiTicketObject.ticket;
        }
        /// <summary>
        /// 1獲取微信分享需要的Token
        /// </summary>
        /// <param name="APPID">公眾號APPID</param>
        /// <param name="APPSECRET">公眾號APPSECRET</param>
        /// <returns>token</returns>
        private string Get_Token()
        {
            if (CacheClass.GetCache("token") != null)
            {
                return CacheClass.GetCache("token").ToString();
            }
            StringBuilder sb = new StringBuilder();
            sb.Append(WxPayConfig.GetTokenUrl).Append("&").Append("appid=").Append(WxPayConfig.APPID).Append("&").Append("secret=").Append(WxPayConfig.APPSECRET);
            string token = HttpService.Get(sb.ToString());
            TokenObject tokenObject = LitJson.JsonMapper.ToObject<TokenObject>(token);
            CacheClass.SetCache("token", tokenObject.access_token);
            return tokenObject.access_token;
        }

        /// <summary>
        /// 3生成微信分享簽名
        /// </summary>
        /// <param name="ticket">jsapiticket</param>
        /// <param name="noncestr">隨機串</param>
        /// <param name="timestamp">時間戳</param>
        /// <returns>SHA1加密簽名</returns>
        public string GenerateJSSDKSign(string noncestr, string timestamp)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("jsapi_ticket=")
                .Append(Get_Jsapi_Ticket())
                .Append("&")
                .Append("noncestr=")
                .Append(noncestr)
                .Append("&")
                .Append("timestamp=" + timestamp)
                .Append("&");
            string url = HttpContext.Current.Request.Url.AbsoluteUri;
            sb.Append("url=" + url);
            string sign = EncodeHelper.SHA1(sb.ToString(), Encoding.UTF8);
            Log.Info("sign" + DateTime.Now, sign);
            return sign;
        }
    }
    //jsapi
    public class JsapiTicket
    {
        public int errcode { get; set; }
        public string errmsg { get; set; }
        public string ticket { get; set; }
        public int expires_in { get; set; }
    }
    //token
    public class TokenObject
    {
        public int expires_in { get; set; }
        public string access_token { get; set; }
    }
}

使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Share
{
    public partial class NeedSharePage : System.Web.UI.Page
    {
        //wx share config
        public string appid = WxPayConfig.APPID;
        public string timestamp = "";
        public string nonceStr = "";
        public string signature = "";
        public string title = "";
        public string description = "";
        public string imgUrl = "";
        public string link = "";

        protected void Page_Load(object sender, EventArgs e)
        {
            //微信分享需要的數值 begin -----------------------
            timestamp = WxPayApi.GenerateTimeStamp();
            nonceStr = WxPayApi.GenerateNonceStr();
            title ="測試";
            description = "測試描述";
            imgUrl = "測試圖片";
            link = HttpContext.Current.Request.Url.AbsoluteUri;
            //根據jsapi獲取sign
            WxShareApi share = new WxShareApi();
            signature = share.GenerateJSSDKSign(nonceStr, timestamp);
            //微信分享需要的數值 end ---------------------------
        }
     }
}