欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-01 11:35:40
调用微信接口前需要准备的内容。   1.微信公众平台的appid   2.微信公众平台的secret   3..获取tokenid   4.获取ticket   ...

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。