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}&timestamp={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}&timestamp={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());

}

}

posted @ 2017-07-03 11:29  维尼熊320  阅读(737)  评论(0编辑  收藏  举报