C#关于调用微信接口的代码
调用微信接口前需要准备的内容
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&secret={1}",appid,secret);
//向上面的地址发起httpger请求
//这里是封装的一个http请求的类
string content=HttpHelper.HttpGet(url);
if(!string.IsNullOrEmpty(content))
{
var obj=JsonConcert.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.DeserializeObject<JsApiTicket>(content);
return obj.ticket;
}
5)生成签名的随机串
//生成签名的随机串
string noncestr=Guid.NewGuid().ToString().Replace("-","");
6、生成签名的时间戳
TimeSpan ts=DataTime.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));
///SDK生成签名
///注意:需要引用System.Security.dll
///</summary>
///<param name="str"></param>
///<returns>str签名</returns>
public static string MakeSha1Sign(string str)
{
byte[] StrRes=Encoding.Default.GetBytes(str);
HashAlgorithm iSHA=new SHA1CryptoServiceProvider();
StrRes=iSHA.ComputerHash(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();
//获取ticket
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 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,
timestam=timestamp,
signature=signature,
tickect=jsapi_ticket,
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,
appId:configObj.appId,
timestamp::configObj.timestamp,
nonceStr:configObj.nonceStr,
signature:configObj.signature,
jsApiList:
[
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'onMenuShareQZone'
]
});
});
请求的后台代码
[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.jsapiConfig());
}
}