调用微信接口前需要准备的内容:
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的返回对象
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;} }
注意:在每个微信公众号中获取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.DesrializeObject =JsonConvert.DeserializeObject<JsApiTicket>(content); return obj.ticket; }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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}×tamp={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.GetByted(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(); //获取tikect 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}×tamp={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 }); });
请求的后台代码
[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.jspiConfig()); } }