zoukankan      html  css  js  c++  java
  • C# 关于调用微信接口的代码

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

      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的标记化结构初始化语法
    STL中的lower_bound() 和 upper_bound()
    Linux中的file_operation结构
    Linux中进行模块操作的命令
    全球前50大名站
    jQuery实例——选项卡的实现
    我的RHCE之路——RedHat 6 破解grub 恢复grub方法
    PHP获取解析URL方法
    PHP笔试题——遍历文件目录
    PHP面试题——PHP字符串翻转函数
  • 原文地址:https://www.cnblogs.com/GoCircle/p/7646845.html
Copyright © 2011-2022 走看看