调用微信接口前需要准备的内容。
1.微信公众平台的appid
2.微信公众平台的secret
3..获取tokenid
4.获取ticket
5.生成签名的随机串
6.生成签名的时间戳
7.生成签名
具体内容:
1.微信公众平台的appid
2.微信公众平台的secret
这两者需要登录到申请的微信公众平台中去获取,建议写在配置文件中
3.获取tokenid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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的返回对象
1
2
3
4
5
6
7
|
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。
1
2
3
4
5
6
7
8
9
10
11
12
|
/// <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.生成签名的随机串
1
2
|
//生成签名的随机串
string noncestr = Guid.NewGuid().ToString().Replace( "-" , "" );
|
6.生成签名的时间戳
1
2
|
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
|
7.生成签名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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.GetBytes(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();
}
|
最后可以将这些步骤封装在一个方法中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/// <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 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;
}
|
页面上面调用我们上面配置好的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
$.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
});
});
|
请求的后台代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[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());
}
}
|
至于需要的接口就去微信公众平台开发者文档中去查看啦。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。