C# 關於調用微信介面的代碼

来源:http://www.cnblogs.com/shenymou/archive/2017/06/30/GetSDKConfig.html
-Advertisement-
Play Games

之前公司下達了開發微信只一塊的任務,然後我就去網上取了一番經,可是感覺對於我這種微信開發的新手來說,所需要的東西太多,太凌亂了,然後整個人就懵逼了。 費了很長時間才將微信介面調用完成。所以吶,我整理了一下,調用微信介面前需要準備的內容。 1.微信公眾平臺的appid 2.微信公眾平臺的secret ...


  之前公司下達了開發微信只一塊的任務,然後我就去網上取了一番經,可是感覺對於我這種微信開發的新手來說,所需要的東西太多,太凌亂了,然後整個人就懵逼了。

  費了很長時間才將微信介面調用完成。所以吶,我整理了一下,調用微信介面前需要準備的內容。

  1.微信公眾平臺的appid

  2.微信公眾平臺的secret

  3..獲取tokenid

  4.獲取ticket

  5.生成簽名的隨機串

  6.生成簽名的時間戳

  7.生成簽名

================================================================================

1.微信公眾平臺的appid

2.微信公眾平臺的secret

這兩者需要登錄到申請的微信公眾平臺中去獲取,建議寫在配置文件中

================================================================================

3.獲取tokenid

public static string GetWxTokenId()
        {
            string token = "";
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret);
            //向上面的地址發起httpget請求
            //這裡是封裝的一個http請求的類
            string content = HttpHelper.HttpGet(url);
            if (!string.IsNullOrEmpty(content))
            {
                var obj = JsonConvert.DeserializeObject<TokenResult>(content);
                if (!obj.errcode.HasValue)
                {
                    token = obj.access_token;
                }
            }
            return token;
        }
獲取微信tokenid

  這裡是獲取微信tokenid的返回對象

private class TokenResult
        {
            public string access_token { get; set; }
            public string expires_in { get; set; }
            public int? errcode { get; set; }
            public string errmsg { get; set; }
        }
TokenResult

註意:在每個微信公眾號中獲取tokenid的次數是有限的,所以應該將獲取到的tokenid儲存起來,以便後續使用。我使用的方法是將tokenid存儲在資料庫中,所以在每次使用之前都要做判斷處理

/*tokenid保存方式說明:
*可在資料庫中創建表:SysConfig(用戶存儲項目中的配置數據)
* 欄位:
* ConfigKey:用於查詢該條數據的key,做為主鍵
* ConfigValue:存儲數據的值
* TypeName:該條配置數據的名稱
* Description:說明
* CreateTime:創建時間
* LastModifyTime:上次修改的時間
* AllowEdit:是否可編輯
* LastValue:上一次的值
* tokenid的有效時間是兩個小時=7200秒,每重新獲取一次就更新一次LastModifyTime的值,將LastModifyTime和當前時間進行比對,如果小於7200秒則可以不用再次獲取,反之則需要再次從微信獲取。
*/

===================================================================================================

4.獲取ticket。需要上一步中獲取到的tokenid。

 /// <summary>
 /// 獲取ticket
 /// </summary>
 /// <param name="token">獲取到的tokenid</param>
 /// <returns>strticket</returns>
 public static string GetTicket(string token)
  {
            string getticketurl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", token);
            string content = HttpHelper.HttpGet(getticketurl);
            JsApiTicket obj = JsonConvert.DeserializeObject<JsApiTicket>(content);
            return obj.ticket;
  }
獲取ticketid

=====================================================================================================

5.生成簽名的隨機串

//生成簽名的隨機串
string noncestr = Guid.NewGuid().ToString().Replace("-", "");
生成簽名的隨機串

====================================================================================================

6.生成簽名的時間戳

TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
生成簽名的時間戳

====================================================================================================

7.生成簽名

string signature = MakeSha1Sign(string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url));
/// <summary>
        /// SDK生成簽名
        /// 註意:需要引用System.Security.dll
        /// </summary>
        /// <param name="str"></param>
        /// <returns>str簽名</returns>
        public static string MakeSha1Sign(string str)
        {
            byte[] StrRes = Encoding.Default.GetBytes(str);
            HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
            StrRes = iSHA.ComputeHash(StrRes);
            StringBuilder EnText = new StringBuilder();
            foreach (byte iByte in StrRes)
            {
                EnText.AppendFormat("{0:x2}", iByte);
            }
            return EnText.ToString();
        }
簽名

====================================================================================================

最後可以將這些步驟封裝在一個方法中

/// <summary>
        /// 獲取調用微信介面用的SDKConfig
        /// </summary>
        /// <param name="url"></param>
        /// <returns>SDKConfig整個對象</returns>
        public static JsApiConfig GetJsSdkConfig(string url)
        {
            //獲取tokenid
            string access_token = GetWxTokenId();
            //獲取ticket
            string jsapi_ticket = GetTicket(access_token);
            //生成簽名的隨機串
            string noncestr = Guid.NewGuid().ToString().Replace("-", "");
            //生成簽名的時間戳
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
            //簽名
            string signature = MakeSha1Sign(string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url));

            JsApiConfig config = new JsApiConfig()
            {
                appId = appid,
                debug = false,
                nonceStr = noncestr,
                timestamp = timestamp,
                signature = signature,
                ticket = jsapi_ticket,
                //需要使用的JS介面列表
                jsApiList = new string[] { "chooseImage", "previewImage", "uploadImage", "downloadImage" }

            };
            return config;


        }
直接調用的方法

 ===================================================================================================

頁面上面調用我們上面配置好的內容

 $.post('/WapCardInfo/GetSDKConfig', { url: location.href.split('#')[0] }, function (data) {
    var configObj = data;

            wx.config({
                debug: false, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會列印。
                appId: configObj.appId, // 必填,公眾號的唯一標識
                timestamp: configObj.timestamp, // 必填,生成簽名的時間戳
                nonceStr: configObj.nonceStr, // 必填,生成簽名的隨機串
                signature: configObj.signature, // 必填,簽名,見附錄1
                jsApiList: [
                                'checkJsApi',
                                'onMenuShareTimeline',
                                'onMenuShareAppMessage',
                                'onMenuShareQQ',
                                'onMenuShareWeibo',
                                'onMenuShareQZone'
                ] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
            });
});
頁面js代碼

===================================================================================================

請求的後臺代碼

[HttpPost]
        public JsonResult GetSDKConfig(string url)
        {
            try
            {
    //這裡就是調用上面封裝的方法
                JsSdkApi.jsapiConfig model = JsSdkApi.GetJsSdkConfig(url);
                return Json(model);
            }
            catch (Exception ex)
            {
                LogHelper.Error("獲取wxconfig出現異常:" + ex.Message.Replace("'", "\""));
                return Json(new JsSdkApi.jsapiConfig());
            }
        }
後臺代碼

 至於需要的介面就去微信公眾平臺開發者文檔中去查看啦。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Asp.Net Core App為了做到跨平臺,自帶了一個輕量級的Web Server - Kestrel,那麼要在IIS中部署Asp.Net Core App,就必須有一種新的機制來協調IIS與Kestrel Server之間的數據傳遞。 ...
  • 鑒於之前學習的是Java,學習Java的時候一直使用的是近乎神級的開發軟體IDEA,出於對IDEA的崇拜,轉到C#大陣營後,瞭解到JetBrains公司也有相應的Vs插件, 就果斷安裝了Resharper(代碼生成工具), 在此總結了Vs2015中安裝ReSharper的步驟: 1.首先必須安裝Vi ...
  • 現在有一個發佈好的WebService,地址是http://hovertree.com:2706/UploadExpenseToConstract.asmx能不能把最後面的asmx去掉呢?變成http://hovertree.com:2706/UploadExpenseToConstract但效果和 ...
  • 前言 前幾天在博客園看到有園友在分享關於微軟的一個微服務架構的示常式序,想必大家都已經知道了,那就是 "eShopOnContainers" 。 我們先不看項目的尾碼名稱 OnXXX ,因為除了 OnContainers 還有 OnAzure,OnWeb,OnKubernetes 以及 OnServ ...
  • 一、請求從路由開始 1.為什麼需要路由? (1).屏蔽物理路徑、提高安全性 (2).有利於搜索引擎優化 2.定義路由的規則 (1).基於模式匹配的路由規則 語法:{占位符1}字面量1{占位符2}字面量2...{占位符n}...字面量n 註:字面量可能是一個固定的字元,比較常見的是"/",也可以是一個 ...
  • 物性路由:將路由和控制器放在一起,這樣更簡單方便,還可以處理複雜的路由場景 傳統路由:集中、強制、基於代碼風格來定義的。 每個MVC應用程式都需要路由來定義自己的處理請求方式,路由是MVC是應用程式的入口點。我們先瞭解一下路由涉及的主要概念:路由定義是從URL模板開始的,因為它指定了與路由相匹配的模 ...
  • 百度翻譯是什麼,可以吃嗎?相信很多人都熟悉,它是我們生活中必不可少的一隻東東。 但是,百度翻譯開發平臺只有每月只能翻譯200萬個字元,多出的要按照49.00/百萬字元來算。對於我醬紫的乞丐程式員來說,其實已經是足足的了。 接下來進入正題,分為2個部分講,一是免費的百度翻譯,二是收費的百度翻譯(此處應 ...
  • 本章旨在講解外掛實現原理,未深入涉及至代碼層面。希望能與對這方面感興趣的朋友多多交流,畢竟理論是死的,套路是固定的,只有破解經驗是花大量時間和心血積累的。 對於單機游戲而言,游戲中絕大部分的參數(比如血、藍、能量亦或是金幣)都存儲在電腦的堆棧中,一些類似劇情進度的則加密後寫入本地的自定義配置文件中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...