.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」知识共享许可协议进行许可。

浙公网安备 33010602011771号