微信分享調用 -- c#篇


微信分享調用JS -- c#篇

 

 

1.前端

  1.1 導入微信端的JS

    如果你的網址是http,則地址為  http://res.wx.qq.com/open/js/jweixin-1.0.0.js

    如果你的網址是https,則地址為 https://res.wx.qq.com/open/js/jweixin-1.0.0.js

  1.2 調用后台,獲取需要的配置

    調用后台,需要的配置為:appId、timestamp、nonceStr、signature

    appId為公眾號的appId,timestamp為后台返回的時間戳,nonceStr為后台生成的隨機字符串,signature為后台生成的簽名。

  1.3 調用完后台后,加載微信分享配置

1     wx.config({
2         debug:false, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。
3         appId: appId, // 必填,公眾號的唯一標識
4         timestamp: timestamp, // 必填,生成簽名的時間戳
5         nonceStr: nonceStr, // 必填,生成簽名的隨機串
6         signature: signature,// 必填,簽名,見附錄1
7         jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'] // 必填,需要使用的JS接口列表,這里調用的是分享到朋友圈和分享給朋友
8     }); 

  1.4 再檢測JS接口列表

    wx.checkJsApi({
        jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'], // 需要檢測的JS接口列表
        success: function(res) {
            // 以鍵值對的形式返回,可用的api值true,不可用為false
            // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
        }
    });

  1.5 wx read,分享配置

    在上面1.3步驟完成后,config信息驗證后會執行ready方法,所有接口調用都必須在config接口獲得結果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則可以直接調用,不需要放在ready函數中。

    ready函數中包含寫一些分享配置信息。如分享到朋友圈、分享給朋友的配置信息。

 1   wx.ready(function(){
 2         //分享到朋友圈
 3         wx.onMenuShareTimeline({
 4             title:'分享標題', // 分享標題
 5             link: 'http://'+location.host+'/GFMain/GetIntoFundStartWithShare?pid='+GetQueryString('pid')||'', // 分享鏈接
 6             imgUrl: 'http://'+location.host+'/img/share.png', // 分享圖標
 7             success: function () {
 8                 // 用戶確認分享后執行的回調函數
 9             },
10             cancel: function () {
11                 // 用戶取消分享后執行的回調函數
12             }
13         });
14 
15         //分享給朋友
16         wx.onMenuShareAppMessage({
17             title:'分享標題', // 分享標題
18             desc: '分享描述', // 分享描述
19             link: 'http://'+location.host+'/xxx/', // 分享鏈接
20             imgUrl: 'http://'+location.host+'/img/share.png', // 分享圖標
21             type: 'link', // 分享類型,music、video或link,不填默認為link
22             dataUrl: '', // 如果type是music或video,則要提供數據鏈接,默認為空
23             success: function () {
24                 // 用戶確認分享后執行的回調函數
25             },
26             cancel: function () {
27                 // 用戶取消分享后執行的回調函數
28             }
29         });
30     });

    1.6 錯誤回調

      config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這里更新簽名。

1 //config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這里更新簽名。
2     wx.error(function(res){
3     });

 

2.后端

  2.1 前端調用后端

    在上面的1.2中,前端開始調用后端,后端獲取前端的參數為:前端當前的整個url,包括參數(包括參數)。例如:http://www.cjt.com/alunchen?pid=xxx&home=1  

    這里需要注意的是參數名字全部最好是小寫,大寫會自定義分享不了。

  2.2 獲取ticket

    首先要獲取ticket,因為ticket主要是我們從微信獲取的,其他返回給前端的參數都是我們從ticket之上在做一些數據處理。所以,ticket是所有返回數據的根本。

    通過訪問微信的API獲取token,獲取ticket之前要首先獲取token,因為ticket獲取要傳一個token給微信。

        // 獲取Token
        public static string GetToken(string appid, string secret)
        {
            Log.Info("進入GetToken");
            string strJson = RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret));
            Log.Info(string.Format("strJson:{0}", strJson));

            return CPublicMethod.GetJsonValue(strJson, "access_token");
        }

        //公共方法,request網絡獲取
        public static string RequestUrl(string url, string method)
        {
            // 設置參數
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            CookieContainer cookieContainer = new CookieContainer();
            request.CookieContainer = cookieContainer;
            request.AllowAutoRedirect = true;
            request.Method = method;
            request.ContentType = "text/html";
            request.Headers.Add("charset", "utf-8");

            //發送請求並獲取相應回應數據
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            //直到request.GetResponse()程序才開始向目標網頁發送Post請求
            Stream responseStream = response.GetResponseStream();
            StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
            //返回結果網頁(html)代碼
            string content = sr.ReadToEnd();
            return content;
        }    

        //公共方法,獲取Json
        public string GetJsonValue(string jsonStr, string key)
        {
            string result = string.Empty;
            if (!string.IsNullOrEmpty(jsonStr))
            {
                key = "\"" + key.Trim('"') + "\"";
                int index = jsonStr.IndexOf(key) + key.Length + 1;
                if (index > key.Length + 1)
                {
                    //先截逗號,若是最后一個,截“}”號,取最小值
                    int end = jsonStr.IndexOf(',', index);
                    if (end == -1)
                    {
                        end = jsonStr.IndexOf('}', index);
                    }

                    result = jsonStr.Substring(index, end - index);
                    result = result.Trim(new char[] { '"', ' ', '\'' }); //過濾引號或空格
                }
            }
            return result;
        }

    通過上面的返回的token獲取ticket

 1        //獲取ticket
 2         public string getJsApiTicket(string appid, string appSecret)
 3         {
 4 
 5             //這里開始從微信API獲取ticket
 6             string token = GetToken(appid, appSecret);
 7             string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + token + "";
 8             Jsapi api = JsonConvert.DeserializeObject<Jsapi>(httpGet(url));
 9             string ticket = api.ticket;
10             return ticket;
11         }
12 
13      //公共方法,發起一個http請球,返回值  
14         private string httpGet(string url)
15         {
16             try
17             {
18                 WebClient MyWebClient = new WebClient();
19                 MyWebClient.Credentials = CredentialCache.DefaultCredentials;//獲取或設置用於向Internet資源的請求進行身份驗證的網絡憑據  
20                 Byte[] pageData = MyWebClient.DownloadData(url); //從指定網站下載數據  
21                 string pageHtml = System.Text.Encoding.Default.GetString(pageData);  //如果獲取網站頁面采用的是GB2312,則使用這句              
22 
23                 return pageHtml;
24             }
25 
26 
27             catch (WebException webEx)
28             {
29                 Console.WriteLine(webEx.Message.ToString());
30                 return null;
31             }
32         }

    備注:這里需要注意的是,由於獲取ticket的失效時間為7200秒(目前來說),所以我們每次獲取到的ticket都要保持在數據庫,等到ticket超過7200秒時再獲取一次。我們這里設計的數據庫有兩個字段:ticket、ticket_expires。ticket為ticket字符串值,ticket_expires為失效時間。

    2.3 返回時間戳、隨機字符串、簽名、appid

            string jsapiTicket = getJsApiTicket(appid, appSecret);
            // 返回時間戳
            string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
            // 返回創建隨機字符串
            string nonceStr = createNonceStr();
            // 返回簽名signature
            string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + pathurl + "";
            string signature = SHA1_Hash(rawstring);
            // 返回的appid
            string appid = "xxx";    


        //創建隨機字符串  
        public 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;
        }


        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;
        }

 

詳細請看微信官方說明:

http://qydev.weixin.qq.com/wiki/index.php?title=WeixinJS%E6%8E%A5%E5%8F%A3

 

可以關注本人的公眾號,多年經驗的原創文章共享給大家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM