.NET POST方式获取微信JSSDK的wx.config配置
最近公司微信扫一扫不能用,原来的是通过<script src="连接"></script>的方式获取wx.config配置。这种GET请求的方式没搞定,就通过下面方式解决了。
调用扫一扫页面代码,复制一下代码就可以了,注意一点URL地址要填写对,我这里是在同一项目下,所以不需要添加项目名
var linkUlr= location.href; // 获取当前扫一扫页面地址 $.ajax({ url: "jssdk.aspx/getInfoMation",//后台给你提供的接口 type: "Post", data: "{'url':'"+linkUlr+"'}", async: false, contentType: "application/json; charset=utf-8", dataType: "json", success: function (data) { var datad = JSON.parse(data.d); //转译为Json字符串 wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来 appId: datad.appid, // 必填,公众号的唯一标识 timestamp: datad.timestamp, // 必填,生成签名的时间戳 nonceStr: datad.noncestr, // 必填,生成签名的随机串 jsapi_ticket: datad.jsapi_ticket, //选填 调用微信JS的临时票据 url: linkUlr,// 选填 当前扫一扫页面地址 signature: datad.signature,// 必填,签名,见附录1 jsApiList: ["scanQRCode"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.error(function (res) { layer.msg(res); }); }, error: function (error) { layer.msg(error) } });
服务器端代码
步1、创建WebFrom1.aspx文件,将其重命名为JsSdk.aspx
步2、在JsSdk.aspx.cs 添加一下代码 、
需要注意的是一定要在getInfoMation方法上面添加[WebMethod] 至于其用法可以度娘看下
/// <summary> /// 初始化微信接口返回参数 /// </summary> /// <param name="url"></param> /// <returns></returns> [WebMethod] //此处如果不添加WebMethod,则页面调用不到 public static string getInfoMation(string url) { try { string appid = System.Configuration.ConfigurationManager.AppSettings["appid"]; string jsapiTicket = getJsApiTicket(); //string url = HttpContext.Current.Request.Url.ToString(); long timestamp = ConvertDateTimeInt(); string nonceStr = createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 //string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url + ""; string signature = GetSignature(jsapiTicket, nonceStr, timestamp, url); //拼接json串返回前台 string rtn = "{\"appid\":\"" + appid + "\",\"jsapi_ticket\":\"" + jsapiTicket + "\",\"noncestr\":\"" + nonceStr + "\",\"timestamp\":\"" + timestamp + "\",\"signature\":\"" + signature + "\"}"; return rtn; } catch (Exception e) { return string.Empty; } } /// <summary> /// 获取jsapi_ticket微信公众号调用微信JS接口的临时票据 /// </summary> private static string getJsApiTicket() { string accessToken = getAccessToken(); string content = ""; try { //TODO:注意api_ticket 是用于调用微信卡券JS API的临时票据,有效期为7200 秒,通过access_token 来获取。 string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; string method = "GET"; 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; Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); //获取返回过来的结果 content = sr.ReadToEnd(); dynamic resultStr = JsonConvert.DeserializeObject(content, new { errcode = "", errmsg = "", ticket = "", expires_in = "" }.GetType()); //请求成功 if (resultStr.errcode == "0" && resultStr.errmsg == "ok") { content = resultStr.ticket; } else { content = ""; } return content; } catch (Exception ex) { content = ex.Message; return content; } } /// <summary> /// 得到accesstoken 如果文件里时间 超时则重新获取 /// </summary> /// <returns></returns> private static string getAccessToken() { // access_token 应该全局存储与更新,以下代码以写入到文件中做示例 string appid = System.Configuration.ConfigurationManager.AppSettings["appid"]; string appsecret = System.Configuration.ConfigurationManager.AppSettings["appsecret"]; //请求接口获取 string _url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret; string method = "GET"; 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; Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); //获取返回过来的结果 string content = sr.ReadToEnd(); dynamic resultContent = JsonConvert.DeserializeObject(content, new { access_token = "", expires_in = "", errcode = "", errmsg = "" }.GetType()); if (resultContent != null && !string.IsNullOrWhiteSpace(resultContent.access_token)) //注意:请求成功时是不会有errcode=0返回,判断access_token是否有值即可 { return resultContent.access_token;//返回请求唯一凭证 } else { //请求失败,返回为空 return ""; } } /// <summary> /// 获取当前时间戳 /// </summary> /// <returns></returns> public static long ConvertDateTimeInt() { DateTime currentDate = DateTime.Now;//当前时间 //转化为时间戳 DateTime localTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); return long.Parse((currentDate - localTime).TotalSeconds.ToString().Split('.')[0]); } /// <summary> /// 创建随机字符串 /// </summary> /// <returns></returns> private static 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; } /// <summary> /// 获取签名 /// </summary> /// <param name="jsapi_ticket">微信公众号调用微信JS临时票据</param> /// <param name="nonceStr">随机串</param> /// <param name="timestamp">时间戳</param> /// <param name="url">当前网页URL</param> /// <returns></returns> public static string GetSignature(string jsapi_ticket, string nonceStr, long timestamp, string url) { var string1Builder = new StringBuilder(); //注意这里参数名必须全部小写,且必须有序 string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&") .Append("noncestr=").Append(nonceStr).Append("&") .Append("timestamp=").Append(timestamp).Append("&") .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url); return Sha1(string1Builder.ToString(), Encoding.UTF8); } /// <summary> /// 签名加密,使用SHA加密所得 /// </summary> /// <param name="content">签名加密参数</param> /// <param name="encode">编码UTF-8</param> /// <returns></returns> public static string Sha1(string content, Encoding encode) { try { SHA1 sha1 = new SHA1CryptoServiceProvider(); byte[] bytesIn = encode.GetBytes(content); byte[] bytesOut = sha1.ComputeHash(bytesIn); sha1.Dispose(); string result = BitConverter.ToString(bytesOut); result = result.Replace("-", ""); return result; } catch (Exception ex) { throw new Exception("SHA1加密出错:" + ex.Message); } }
发布后,运行调用测试,已亲测没问题,已搞定扫一扫功能,当然,如果你想要调用微信地图等API只需要在wx.config里的jsApiList中添加地图接口标识即可。
仅供参考,有改进的地方可以交流。
【来一场说走就走的旅行,不如学一种说学就学的语言】
作者:小温
出处:https://www.cnblogs.com/wencg/
版权:本文采用「CC BY 4.0」知识共享许可协议进行许可。