国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程序 微信開發(fā) ASP.NET MVC 微信JS-SDK認(rèn)證的實(shí)例教程

ASP.NET MVC 微信JS-SDK認(rèn)證的實(shí)例教程

Apr 25, 2017 am 11:31 AM
asp.net mvc 微信

ASP.NET MVC微信JS-SDK認(rèn)證,具體內(nèi)容:

寫在前面

前陣子因?yàn)橛袀€(gè)項(xiàng)目需要做微信自定義分享功能,因而去研究了下微信JS-SDK相關(guān)知識(shí)。

此文做個(gè)簡(jiǎn)單的記(tu)錄(cao)...

開始
所有的東西都從文檔開始:微信JSSDK說明文檔

項(xiàng)目需要用到的是分享接口 不過使用微信JS-SDK之前,需要做JS接口認(rèn)證。

認(rèn)證如下:

步驟一:綁定域名

步驟二:引入JS文件

步驟三:通過config接口注入權(quán)限驗(yàn)證配置

步驟四:通過ready接口處理成功驗(yàn)證

步驟五:通過error接口處理失敗驗(yàn)證

具體解釋:

步驟一中允許使用域名/子域名,只要xx.com/xxx.txt或者xx.com/mp/xxx.txt能訪問就好。域名認(rèn)證通過之后,此域名下的所有端口的網(wǎng)站都可以使用JS-SDK。

步驟二沒什么問題,略過。

步驟三最磨人,下面單獨(dú)講解。

config接口注入權(quán)限驗(yàn)證配置

先來一段說明:

所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調(diào)用(同一個(gè)url僅需調(diào)用一次,對(duì)于變化url的SPA的web app可在每次url變化時(shí)進(jìn)行調(diào)用,目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實(shí)現(xiàn)web app的頁面會(huì)導(dǎo)致簽名失敗,此問題會(huì)在Android6.2中修復(fù))。

wx.config({
 debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,
 //若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。
 appId: '', // 必填,公眾號(hào)的唯一標(biāo)識(shí)
 timestamp: , // 必填,生成簽名的時(shí)間戳
 nonceStr: '', // 必填,生成簽名的隨機(jī)串
 signature: '',// 必填,簽名,見附錄1
 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
});

看到這里肯定懵逼了,這是都什么鬼...怎么玩啊。

提示我們?nèi)タ锤戒?...看完之后總結(jié)如下:

1.使用config接口注入權(quán)限驗(yàn)證配置,重點(diǎn)是生成合法的signatrue
2.生成signature需要通過appid和secret獲取token
3.時(shí)間戳和調(diào)用接口URL必不可少
4.此操作需要服務(wù)端完成,不能使用客戶端實(shí)現(xiàn)

整個(gè)過程變成:

1.通過appid和secret獲取access_token,接著使用token獲取jsapi_ticket;

2.拿到j(luò)sapi_ticket之后,把jsapi_ticket、時(shí)間戳、隨機(jī)字符串、接口調(diào)用頁面URL 拼接成完整字符串,使用sha1算法加密得到signature。

3.最后返回至頁面,在wx.config里面填入appid,上一步的時(shí)間戳timestamp,上一部的隨機(jī)字符串、sha1拿到的signature,想要使用的JS接口。

廢話少說,直接上代碼吧。

代碼時(shí)間

 public class WeiXinController : Controller
 {
 public static readonly string appid =
 System.Web.Configuration.WebConfigurationManager.AppSettings["wxappid"];

 public static readonly string secret =
 System.Web.Configuration.WebConfigurationManager.AppSettings["wxsecret"];

 public static readonly bool isDedug =
 System.Web.Configuration.WebConfigurationManager.AppSettings["IsDebug"] =="true";


 public static string _ticket = "";
 public static DateTime _lastTimestamp;

 public ActionResult Info(string url,string noncestr)
 {
  if (string.IsNullOrEmpty(_ticket) || 
  _lastTimestamp == null || (_lastTimestamp - DateTime.Now).Milliseconds > 7200)
  {
  var resultString = HTTPHelper.GetHTMLByURL("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
   + appid + "&secret=" + secret);
  dynamic resultValue = JsonConvert.DeserializeObject<dynamic>(resultString);
  if (resultValue == null || resultValue.access_token == null 
  || resultValue.access_token.Value == null)
  {
   return Json(new { issuccess = false, 
   error = "獲取token失敗" });
  }
  var token = resultValue.access_token.Value;

  resultString = HTTPHelper.GetHTMLByURL
  ("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + 
  token + "&type=jsapi");
  dynamic ticketValue = JsonConvert.DeserializeObject<dynamic>(resultString);
  if (ticketValue == null || ticketValue.errcode == null
  || ticketValue.errcode.Value != 0 || ticketValue.ticket == null)
   return Json(new { issuccess = false,
   error = "獲取ticketValue失敗" });
  _ticket = ticketValue.ticket.Value;
  _lastTimestamp = DateTime.Now;
  var timestamp = GetTimeStamp();
  var hexString = string.Format("jsapi_ticket={0}&noncestr={3}&timestamp={1}&url={2}",
  _ticket, timestamp, url,noncestr);

  return Json(new {
   issuccess = true, 
   sha1value = GetSHA1Value(hexString), 
   timestamp = timestamp, 
   url = url, 
   appid = appid, 
   debug=isDedug,
   tiket=_ticket
  });
  
  }
  else
  {
  var timestamp = GetTimeStamp();
  var hexString = string.Format("jsapi_ticket={0}&noncestr=1234567890123456&timestamp={1}&url={2}",
   _ticket, timestamp, url);
  return Json(new { 
   issuccess = true, sha1value = GetSHA1Value(hexString),
   timestamp = timestamp, url = url,
   appid = appid, debug = isDedug,tiket = _ticket
  });
  }
 }


 private string GetSHA1Value(string sourceString)
 {
  var hash = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(sourceString));
  return string.Join("", 
  hash.Select(b => b.ToString("x2")).ToArray());
 }

 private static string GetTimeStamp()
 {

  TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);

  return Convert.ToInt64(ts.TotalSeconds).ToString();

 }

 }
 
 public class HTTPHelper
 {
 public static string GetHTMLByURL(string url)
 {
  string htmlCode = string.Empty;
  try
  {
  HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
  webRequest.Timeout = 30000;
  webRequest.Method = "GET";
  webRequest.UserAgent = "Mozilla/4.0";
  webRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
  HttpWebResponse webResponse = (System.Net.HttpWebResponse)webRequest.GetResponse();
  //獲取目標(biāo)網(wǎng)站的編碼格式
  string contentype = webResponse.Headers["Content-Type"];
  Regex regex = new Regex("charset\\s*=\\s*[\\W]?\\s*([\\w-]+)", RegexOptions.IgnoreCase);
  if (webResponse.ContentEncoding.ToLower() == "gzip")//如果使用了GZip則先解壓
  {
   using (System.IO.Stream streamReceive = webResponse.GetResponseStream())
   {
   using (var zipStream = new System.IO.Compression.GZipStream(streamReceive, System.IO.Compression.CompressionMode.Decompress))
   {
    //匹配編碼格式
    if (regex.IsMatch(contentype))
    {
    Encoding ending = Encoding.GetEncoding
    (regex.Match(contentype).Groups[1].Value.Trim());
    using (StreamReader sr = new System.IO.StreamReader(zipStream, ending))
    {
     htmlCode = sr.ReadToEnd();
    }
    }
    else
    {
    using (StreamReader sr = new System.IO.StreamReader(zipStream, Encoding.UTF8))
    {
     htmlCode = sr.ReadToEnd();
    }
    }
   }
   }
  }
  else
  {
   using (System.IO.Stream streamReceive = webResponse.GetResponseStream())
   {
   var encoding = Encoding.Default;
   if (contentype.Contains("utf"))
    encoding = Encoding.UTF8;
   using (System.IO.StreamReader sr = new System.IO.StreamReader(streamReceive, encoding))
   {
    htmlCode = sr.ReadToEnd();
   }

   }
  }
  return htmlCode;
  }
  catch (Exception ex)
  {
  return "";
  }
 }
 }

PS:這里要注意緩存一下_ticket(即access_token),照微信文檔說的,access_token兩個(gè)小時(shí)內(nèi)有效,不需要頻繁調(diào)用。而且獲取access_token的接口有調(diào)用次數(shù)的限制,如果超過了次數(shù),就不允許調(diào)用了。

PPS:建議noncestr和URL由前臺(tái)傳入比較適合,使用 var theWebUrl = window.location.href.split('#')[0] 獲取URL,noncestr就隨意了。

PPPS:遇到詭異的invalid signature的時(shí)候,首先檢查url參數(shù),然后檢查noncestr,再不行重啟一下程序獲取一個(gè)新的token回來繼續(xù)玩。

以上是ASP.NET MVC 微信JS-SDK認(rèn)證的實(shí)例教程的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
拷貝漫畫(官網(wǎng)入口)_拷貝漫畫(nba)正版在線閱讀入口 拷貝漫畫(官網(wǎng)入口)_拷貝漫畫(nba)正版在線閱讀入口 Jun 05, 2025 pm 04:12 PM

拷貝漫畫無疑是一個(gè)不容錯(cuò)過的寶藏。在這里,你可以找到各種風(fēng)格的籃球漫畫,從熱血?jiǎng)?lì)志的競(jìng)技故事,到輕松幽默的日常喜劇,應(yīng)有盡有。無論是想重溫經(jīng)典,還是想發(fā)掘新作,拷貝漫畫都能滿足你的需求。通過拷貝漫畫提供的正版在線閱讀入口,你將告別盜版資源的困擾,享受高清流暢的閱讀體驗(yàn),更能支持你喜愛的漫畫作者,為正版漫畫的發(fā)展貢獻(xiàn)一份力量。

AI寫作軟件排行榜單前十名推薦 AI寫作軟件哪些免費(fèi) AI寫作軟件排行榜單前十名推薦 AI寫作軟件哪些免費(fèi) Jun 04, 2025 pm 03:27 PM

結(jié)合 2025 年最新行業(yè)動(dòng)態(tài)與多維度評(píng)測(cè)數(shù)據(jù),以下為綜合排名前十的 AI 寫作軟件推薦,涵蓋通用創(chuàng)作、學(xué)術(shù)研究、商業(yè)營銷等主流場(chǎng)景,同時(shí)兼顧中文優(yōu)化與本地化服務(wù):

奈斯漫畫官方頁面免費(fèi)漫畫在線看 奈斯漫畫登錄頁面免費(fèi)入口網(wǎng)站 奈斯漫畫官方頁面免費(fèi)漫畫在線看 奈斯漫畫登錄頁面免費(fèi)入口網(wǎng)站 Jun 12, 2025 pm 08:18 PM

奈斯漫畫,一個(gè)致力于為漫畫愛好者打造的沉浸式閱讀體驗(yàn)平臺(tái),匯聚了海量國內(nèi)外優(yōu)質(zhì)漫畫資源。它不僅僅是一個(gè)漫畫閱讀平臺(tái),更是一個(gè)連接漫畫家與讀者、分享漫畫文化的社區(qū)。通過簡(jiǎn)潔直觀的界面設(shè)計(jì)和強(qiáng)大的搜索功能,奈斯漫畫讓你能夠輕松找到心儀的作品,享受流暢舒適的閱讀體驗(yàn)。告別漫長(zhǎng)的等待和繁瑣的操作,即刻進(jìn)入奈斯漫畫的世界,開啟你的漫畫之旅吧!

蛙漫 網(wǎng)址在線看入口 漫蛙漫畫(網(wǎng)頁入口)在線觀看 蛙漫 網(wǎng)址在線看入口 漫蛙漫畫(網(wǎng)頁入口)在線觀看 Jun 12, 2025 pm 08:06 PM

蛙漫漫畫,憑借其豐富多元的漫畫資源和便捷流暢的在線閱讀體驗(yàn),已成為眾多漫畫愛好者的首選。它就像一個(gè)充滿活力的池塘,源源不斷地涌現(xiàn)出新鮮有趣的故事,等待著你去發(fā)現(xiàn)和探索。蛙漫漫畫涵蓋了各種題材,從熱血冒險(xiǎn)到甜蜜戀愛,從奇幻科幻到懸疑推理,無論你喜歡哪種類型,都能在這里找到心儀的作品。其簡(jiǎn)潔直觀的界面設(shè)計(jì),更讓你能夠輕松上手,快速找到想看的漫畫,沉浸在精彩紛呈的漫畫世界中。

包子漫畫(入口)_包子漫畫(新入口)2025 包子漫畫(入口)_包子漫畫(新入口)2025 Jun 05, 2025 pm 04:18 PM

在這里,您可以盡情暢游于浩瀚的漫畫海洋,探索各種題材和風(fēng)格的作品,從熱血激昂的少年漫,到細(xì)膩動(dòng)人的少女漫,從懸疑燒腦的推理漫,到輕松搞笑的日常漫,應(yīng)有盡有,總有一款能夠觸動(dòng)您的心弦。我們不僅擁有海量的正版漫畫資源,還不斷引進(jìn)和更新最新的作品,確保您能夠第一時(shí)間閱讀到您喜愛的漫畫。

b安最新注冊(cè)地址_怎么注冊(cè)b安交易所 b安最新注冊(cè)地址_怎么注冊(cè)b安交易所 May 26, 2025 pm 07:12 PM

2025b安最新官網(wǎng)入口地址:https://www.marketwebb.co/zh-CN/join?ref=507720986&amp;type=wenzi;幣安(Binance)交易所是一家全球性的加密貨幣交易所,服務(wù)包括北美、歐洲、臺(tái)灣、中東、香港、馬來西亞在內(nèi)的180個(gè)國家地區(qū),提供超過600種加密貨幣,在全球擁有2.7億注冊(cè)用戶。

安卓手機(jī)如何下載火幣 火必下載教程(手把手教程) 安卓手機(jī)如何下載火幣 火必下載教程(手把手教程) Jun 12, 2025 pm 10:12 PM

安卓手機(jī)用戶可通過以下步驟下載并安裝火幣/火必App:1.確保網(wǎng)絡(luò)穩(wěn)定、存儲(chǔ)空間充足;2.通過火幣/火必官方網(wǎng)站下載App,使用瀏覽器訪問官網(wǎng)并點(diǎn)擊下載鏈接或掃描二維碼,或通過第三方應(yīng)用商店如應(yīng)用寶、華為應(yīng)用市場(chǎng)搜索下載,也可通過朋友分享獲取安裝包;3.找到下載的.apk文件,開啟“未知來源應(yīng)用”安裝權(quán)限,按提示完成安裝等等。

我可以同時(shí)在兩部手機(jī)上使用微信嗎? 我可以同時(shí)在兩部手機(jī)上使用微信嗎? Jul 11, 2025 am 03:28 AM

是的,但有限制。①你可以同時(shí)在iPhone和安卓手機(jī)登錄同一賬號(hào),但最新設(shè)備登錄會(huì)使最早會(huì)話下線;②可在手機(jī)與電腦桌面端同時(shí)登錄,但功能不同步;③使用第三方工具或雙應(yīng)用功能雖能實(shí)現(xiàn)兩手機(jī)登錄,但非官方支持且可能違規(guī);④替代方案包括用網(wǎng)頁版/桌面版搭配主手機(jī),或通過云備份、文件工具轉(zhuǎn)移聊天記錄,部分安卓機(jī)還可利用“雙應(yīng)用”運(yùn)行兩個(gè)賬號(hào)實(shí)例。

See all articles