调用微信接口前需要准备的内容。

1.微信公众平台的appid

2.微信公众平台的secret

3..获取tokenid

4.获取ticket

5.生成签名的随机串

6.生成签名的时间戳

7.生成签名

================================================================================

1.微信公众平台的appid

2.微信公众平台的secret

这两者需要登录到申请的微信公众平台中去获取,建议写在配置文件中

================================================================================

3.获取tokenid

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

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;

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

这里是获取微信tokenid的返回对象

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

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; }

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

注意:在每个微信公众号中获取tokenid的次数是有限的,所以应该将获取到的tokenid储存起来,以便后续使用。我使用的方法是将tokenid存储在数据库中,所以在每次使用之前都要做判断处理

/*tokenid保存方式说明:

*可在数据库中创建表:SysConfig(用户存储项目中的配置数据)

* 字段:

* ConfigKey:用于查询该条数据的key,做为主键

* ConfigValue:存储数据的值

* TypeName:该条配置数据的名称

* Description:说明

* CreateTime:创建时间

* LastModifyTime:上次修改的时间

* AllowEdit:是否可编辑

* LastValue:上一次的值

* tokenid的有效时间是两个小时=7200秒,每重新获取一次就更新一次LastModifyTime的值,将LastModifyTime和当前时间进行比对,如果小于7200秒则可以不用再次获取,反之则需要再次从微信获取。

*/

===================================================================================================

4.获取ticket。需要上一步中获取到的tokenid。

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

///

/// 获取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;

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

=====================================================================================================

5.生成签名的随机串

961ddebeb323a10fe0623af514929fc1.png

//生成签名的随机串

string noncestr = Guid.NewGuid().ToString().Replace("-", "");

====================================================================================================

6.生成签名的时间戳

961ddebeb323a10fe0623af514929fc1.png

TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);

string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();

====================================================================================================

7.生成签名

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

string signature = MakeSha1Sign(string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={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();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

====================================================================================================

最后可以将这些步骤封装在一个方法中

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

///

/// 获取调用微信接口用的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}&timestamp={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;

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

===================================================================================================

页面上面调用我们上面配置好的内容

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

$.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

});

});

48304ba5e6f9fe08f3fa1abda7d326ab.png

===================================================================================================

请求的后台代码

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

[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());

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

至于需要的接口就去微信公众平台开发者文档中去查看啦。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐