C#调用微信接口的相关代码

作者:小熊吉米 时间:2022-01-23 03:01:02 

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

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

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


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

}

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


$.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());
     }
   }

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

标签:C#,微信接口
0
投稿

猜你喜欢

  • SpringMVC框架实现图片上传与下载

    2022-01-12 23:50:52
  • Java安全-ClassLoader

    2023-08-18 02:12:21
  • Android中使用TagFlowLayout制作动态添加删除标签

    2023-03-13 12:41:44
  • Spring Security安全框架之记住我功能

    2023-08-19 02:38:43
  • 计算字符串和文件MD5值的小例子

    2023-12-10 20:31:19
  • Java 求解如何把二叉搜索树转换为累加树

    2021-11-19 14:09:54
  • MyBatis查询时属性名和字段名不一致问题的解决方法

    2023-10-23 16:56:36
  • mybatis 传入null值的解决方案

    2023-11-23 06:54:44
  • JAVA SPI特性及简单应用代码实例

    2021-11-11 14:54:54
  • java单向链表的实现实例

    2023-10-23 20:36:10
  • Android自定义圆形倒计时进度条

    2021-09-11 06:17:08
  • Input系统之InputReader处理触摸事件案例

    2022-12-18 07:32:35
  • JFreeChart插件实现的折线图效果实例

    2023-09-21 02:20:03
  • Java日期操作方法工具类实例【包含日期比较大小,相加减,判断,验证,获取年份等】

    2023-11-25 12:14:40
  • 详解java_ 集合综合案例:斗地主

    2022-02-08 04:14:49
  • SpringBoot文件分片上传教程

    2023-07-21 21:08:40
  • C#利用GDI绘制常见图形和文字

    2023-04-09 20:44:40
  • Java中关于MouseWheelListener的鼠标滚轮事件详解

    2023-10-19 02:02:54
  • Java使用FFmpeg处理视频文件的方法教程

    2022-05-12 20:46:21
  • 一文快速掌握Spring Cloud Stream

    2023-09-01 23:09:38
  • asp之家 软件编程 m.aspxhome.com