之前公司下达了开发陌陌只一块的任务,然后我就去网上取了一番经,可是觉得对于我这些陌陌开发的菜鸟来说,所须要的东西太多,太零乱了,然后整个人就懵逼了。
费了很长时间才将陌陌插口调用完成。所以呢,我整理了一下,调用陌陌插口前须要打算的内容。
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(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。
///
/// 获取ticket
///
/// 获取到的tokenid
/// strticket
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(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));
///
/// SDK生成签名
/// 注意:需要引用System.Security.dll
///
///
/// str签名
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();
}
====================================================================================================
最后可以将这种步骤封装在一个方式中
///
/// 获取调用微信接口用的SDKConfig
///
///
/// SDKConfig整个对象
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;
}
===================================================================================================
页面里面调用我们里面配置好的内容
$.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.jsapiConfig());
}
}
至于须要的插口就去微信公众平台开发者文档中去查看啦。