微信開發-Jssdk調用分享實例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using Newtonsoft.Json;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Security.Cryptography;

/// <summary>
/// WXJSSDK 的摘要說明
/// </summary>
public class WXJSSDK
{
    private string appId;
    private string appSecret;
    private DataTable DT;

    public WXJSSDK(string appId, string appSecret)
    {
        this.appId = appId;
        this.appSecret = appSecret;
    }

    //獲得數據包,返回使用頁面  
    public System.Collections.Hashtable getSignPackage()
    {
        string jsapiTicket = getJsApiTicket();
        string url = HttpContext.Current.Request.Url.ToString(); 
        string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
        string nonceStr = createNonceStr();


        // 這裏參數的順序要按照 key 值 ASCII 碼升序排序  
        string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";


        string signature = SHA1_Hash(rawstring);


        System.Collections.Hashtable signPackage = new System.Collections.Hashtable();
        signPackage.Add("appId", appId);
        signPackage.Add("nonceStr", nonceStr);
        signPackage.Add("timestamp", timestamp);
        signPackage.Add("url", url);
        signPackage.Add("signature", signature);
        signPackage.Add("rawString", rawstring);


        return signPackage;
    }


    //建立隨機字符串  
    private string createNonceStr()
    {
        int length = 16;
        string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        string str = "";
        Random rad = new Random();
        for (int i = 0; i < length; i++)
        {
            str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
        }
        return str;
    }


    //獲得ticket 若是文件裏時間 超時則從新獲取
//注:jsapi_ticket使用規則(有過時時間)相似access_token, oauth的access_token與基礎access_token不一樣
private string getJsApiTicket() { //這裏我從數據庫讀取 DT = DbSession.Default.FromSql("select jsapi_ticket,ticket_expires from table where ID=1").ToDataTable(); int expire_time = (int)DT.Rows[0]["ticket_expires"]; string ticket = DT.Rows[0]["jsapi_ticket"].ToString(); string accessToken =getAccessToken();//獲取系統的全局token if (expire_time < ConvertDateTimeInt(DateTime.Now)) { string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accessToken + ""; Jsapi api =JsonConvert.DeserializeObject<Jsapi>(httpGet(url)); ticket = api.ticket; if (ticket != "") { expire_time = ConvertDateTimeInt(DateTime.Now) + 7000; //存入數據庫操做 } } return ticket; } ////獲得accesstoken 若是文件裏時間 超時則從新獲取 //private string getAccessToken() //{ // // access_token 應該全局存儲與更新,如下代碼以寫入到文件中作示例 // string access_token = ""; // string path = HttpContext.Current.Server.MapPath(@"/weixin/access_token.json"); // FileStream file = new FileStream(path, FileMode.Open); // var serializer = new DataContractJsonSerializer(typeof(AccToken)); // AccToken readJSTicket = (AccToken)serializer.ReadObject(file); // file.Close(); // if (readJSTicket.expires_in < ConvertDateTimeInt(DateTime.Now)) // { // string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret + ""; // AccToken iden = Desrialize<AccToken>(new AccToken(), httpGet(url)); // access_token = iden.access_token; // if (access_token != "") // { // iden.expires_in = ConvertDateTimeInt(DateTime.Now) + 7000; // iden.access_token = access_token; // string json = Serialize<AccToken>(iden); // StreamWriterMetod(json, path); // } // } // else // { // access_token = readJSTicket.access_token; // } // return access_token; //} //發起一個http請球,返回值 private string httpGet(string url) { try { WebClient MyWebClient = new WebClient(); MyWebClient.Credentials = CredentialCache.DefaultCredentials;//獲取或設置用於向Internet資源的請求進行身份驗證的網絡憑據 Byte[] pageData = MyWebClient.DownloadData(url); //從指定網站下載數據 string pageHtml = System.Text.Encoding.Default.GetString(pageData); //若是獲取網站頁面採用的是GB2312,則使用這句 return pageHtml; } catch (WebException webEx) { Console.WriteLine(webEx.Message.ToString()); return null; } } //SHA1哈希加密算法 public string SHA1_Hash(string str_sha1_in) { SHA1 sha1 = new SHA1CryptoServiceProvider(); byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(str_sha1_in); byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in); string str_sha1_out = BitConverter.ToString(bytes_sha1_out); str_sha1_out = str_sha1_out.Replace("-", "").ToLower(); return str_sha1_out; } /// <summary> /// StreamWriter寫入文件方法 /// </summary> private void StreamWriterMetod(string str, string patch) { try { FileStream fsFile = new FileStream(patch, FileMode.OpenOrCreate); StreamWriter swWriter = new StreamWriter(fsFile); swWriter.WriteLine(str); swWriter.Close(); } catch (Exception e) { throw e; } } /// <summary> /// 將c# DateTime時間格式轉換爲Unix時間戳格式 /// </summary> /// <param name="time">時間</param> /// <returns>double</returns> public int ConvertDateTimeInt(System.DateTime time) { int intResult = 0; System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); intResult = Convert.ToInt32((time - startTime).TotalSeconds); return intResult; } } //建立Json序列化 及反序列化類目 #region //建立JSon類 保存文件 jsapi_ticket.json public class JSTicket { public string jsapi_ticket { get; set; } public double expire_time { get; set; } } //建立 JSon類 保存文件 access_token.json public class AccToken { public string access_token { get; set; } public double expires_in { get; set; } } //建立從微信返回結果的一個類 用於獲取ticket public class Jsapi { public int errcode { get; set; } public string errmsg { get; set; } public string ticket { get; set; } public string expires_in { get; set; } } #endregion

上面是寫好的類,接下來直接調用後對應輸出給jsjavascript

WXJSSDK jssdk = new WXJSSDK(AppId,AppSecret);
Hashtable hs = jssdk.getSignPackage();
string signature = hs["signature"].ToString();
string signature = hs["signature"].ToString();
string timestamp = hs["timestamp"].ToString();
string nonce = hs["nonceStr"].ToString();

 

接着js調用:java

<script type="text/javascript">
            var dataForWeixin = {
                appId: "<%=appid%>",
                MsgImg: "<%=WeChatImg%>",
                TLImg: "<%=WeChatImg%>",
                url: "<%=url%>",
                title: "<%=Title%>",
                desc: "<%=desc%>",
                timestamp: '<%=timestamp%>',
                nonceStr: '<%=nonce%>',
                signature: '<%=signature%>',
                jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo'],
                fakeid: "",
                callback: function () { }
            };
            wx.config({
                debug: false, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。
                appId: dataForWeixin.appId, // 必填,公衆號的惟一標識
                timestamp: dataForWeixin.timestamp, // 必填,生成簽名的時間戳
                nonceStr: dataForWeixin.nonceStr, // 必填,生成簽名的隨機串
                signature: dataForWeixin.signature,// 必填,簽名,見附錄1
                jsApiList: dataForWeixin.jsApiList  // 必填,須要使用的JS接口列表,全部JS接口列表見附錄2
            });
            wx.ready(function () {
                //在此輸入各類API
                //分享到朋友圈
                wx.onMenuShareTimeline({
                    title: dataForWeixin.title, // 分享標題
                    link: dataForWeixin.url, // 分享連接
                    imgUrl: dataForWeixin.MsgImg, // 分享圖標
                    success: function () {
                        // 用戶確認分享後執行的回調函數
                    },
                    cancel: function () {
                        // 用戶取消分享後執行的回調函數
                    }
                });
                //分享給朋友
                wx.onMenuShareAppMessage({
                    title: dataForWeixin.title, // 分享標題
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享連接
                    imgUrl: dataForWeixin.TLImg, // 分享圖標
                    type: '', // 分享類型,music、video或link,不填默認爲link
                    dataUrl: '', // 若是type是music或video,則要提供數據連接,默認爲空
                    success: function () {
                        // 用戶確認分享後執行的回調函數
                    },
                    cancel: function () {
                        // 用戶取消分享後執行的回調函數
                    }
                });
                //QQ
                wx.onMenuShareQQ({
                    title: dataForWeixin.title, // 分享標題
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享連接
                    imgUrl: dataForWeixin.MsgImg,// 分享圖標
                    success: function () {
                        // 用戶確認分享後執行的回調函數
                    },
                    cancel: function () {
                        // 用戶取消分享後執行的回調函數
                    }
                });
                //QQ微博
                wx.onMenuShareWeibo({
                    title: dataForWeixin.title, // 分享標題
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享連接
                    imgUrl: dataForWeixin.TLImg, // 分享圖標
                    success: function () {
                        // 用戶確認分享後執行的回調函數
                    },
                    cancel: function () {
                        // 用戶取消分享後執行的回調函數
                    }
                });
                // config信息驗證後會執行ready方法,全部接口調用都必須在config接口得到結果以後,config是一個客戶端的異步操做,
                //因此若是須要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則能夠直接調用,不須要放在ready函數中。
            });
            wx.error(function (res) {
                //alert(res);
                // config信息驗證失敗會執行error函數,如簽名過時致使驗證失敗,具體錯誤信息能夠打開config的debug模式查看,也能夠在返回的res參數中查看,對於SPA能夠在這裏更新簽名。
            });
</script>

 

相關文章
相關標籤/搜索