フロントエンド
var href = window.location.href.split('#')[0];
href = encodeURIComponent(href)
href = encodeURIComponent(href)//这个url一定要转码两次 后端解码一次 (杜绝中文参数时获取签名报错)
function GetJsApiInfo() {
$.ajax({
url: '../home/GetJsApiInfo?href=' + href,
data: {
},
dataType: 'json',
method: 'get',
success: function (res) {
console.log(res)
if (res.status == 1) {
var data = res.data
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: data.appId, // 必填,公众号的唯一标识
timestamp: data.timestamp, // 必填,生成签名的时间戳
nonceStr: data.nonceStr, // 必填,生成签名的随机串
signature: data.signature,// 必填,签名,见附录1
jsApiList: [
'checkJsApi',
'openLocation',
'getLocation'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
}
}
})
}
コントローラ
public ActionResult GetJsApiInfo(string href)
{
_log.Info("获取jssdk路径"+href);
var result = _weChatService.GetJsApiInfo(appid, href);
if (result.status == -1)
{
return Error("获取失败");
}
return Success(result.data);
}
_weChatServiceクラスのメソッドaccess_tokenは、データベースから値を取得し、データベースから値を取得して更新をチェックするjsapi_ticketです。
public ResultModel GetJsApiInfo(string Appid, string href)
{
ResultModel model = new ResultModel();
try
{
string timestamp = Currency.GetTimeStamp();//生成签名的时间戳
Random random = new Random();
var randomStr = random.Next(0, 9999999).ToString();
string nonceStr = randomStr;//生成签名的随机串
//string url = System.Web.HttpContext.Current.Request.Url.AbsoluteUri.ToString();//当前的地址
string url = System.Web.HttpUtility.UrlDecode( href);
string jsapi_ticket = "";
sys_config configResult = db.Queryable<sys_config>().Where(s => s.appid == appid).First();
if (configResult != null)
{
if (string.IsNullOrWhiteSpace(configResult.jsapi_ticket))
{
var access_token = GetAccessToken().data;
_log.Info("获取jsApi时的accesstoken:" + access_token);
var RequestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";
var RequestData = HttpUtility.SendGetHttpRequest(RequestUrl, "");
var Jsapi_ticketData = JsonConvert.DeserializeObject<GetJsapi_ticketRes>(RequestData);
jsapi_ticket = Jsapi_ticketData.ticket;
configResult.jsapi_ticket = jsapi_ticket;
configResult.jsapi_ticket_expires_in = 7200;
configResult.jsapi_ticket_invalidTime = DateTime.Now.AddSeconds(7200);
db.Updateable(configResult).ExecuteCommand();
}
else
{
if (configResult.jsapi_ticket_invalidTime < DateTime.Now)
{
//过期
var access_token = GetAccessToken().data;
var RequestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";
var RequestData = HttpUtility.SendGetHttpRequest(RequestUrl, "");
var Jsapi_ticketData = JsonConvert.DeserializeObject<GetJsapi_ticketRes>(RequestData);
jsapi_ticket = Jsapi_ticketData.ticket;
configResult.jsapi_ticket = jsapi_ticket;
configResult.jsapi_ticket_expires_in = 7200;
configResult.jsapi_ticket_invalidTime = DateTime.Now.AddSeconds(7200);
db.Updateable(configResult).ExecuteCommand();
}
else
{
jsapi_ticket = configResult.jsapi_ticket;
}
}
}
else
{
var access_token = GetAccessToken().data;
var RequestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";
var RequestData = HttpUtility.SendGetHttpRequest(RequestUrl, "");
var Jsapi_ticketData = JsonConvert.DeserializeObject<GetJsapi_ticketRes>(RequestData);
var config = db.Queryable<sys_config>().Where(s => s.appid == appid).First();
jsapi_ticket = Jsapi_ticketData.ticket;
config.jsapi_ticket = jsapi_ticket;
config.jsapi_ticket_expires_in = 7200;
config.jsapi_ticket_invalidTime = DateTime.Now.AddSeconds(7200);
db.Updateable(config).ExecuteCommand();
}
var jmdata = "jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}";
jmdata = string.Format(jmdata, jsapi_ticket, nonceStr, timestamp, url);
_log.Info("jmdata:"+ jmdata);
var signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(jmdata, "SHA1");
Jsapi_ticketModel _TicketModel = new Jsapi_ticketModel()
{
appId = Appid,
nonceStr = nonceStr,
signature = signature,
timestamp = timestamp,
url = url
};
model.status = 0;
model.data = _TicketModel;
return model;
}
catch (Exception ex)
{
model.status = -1;
model.message = "获取失败";
return model;
}
}