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

    这里是获取微信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;}
                       }  
    View Code

    注意:在每个微信公众号中获取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.DesrializeObject =JsonConvert.DeserializeObject<JsApiTicket>(content);
              return obj.ticket;
    }
              
    View Code

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    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.GetByted(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();
                }
    View Code

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

    ///<summary>
    ///获取调用微信接口用得SDKConfig
    ///<summary>
    ///<param name="url"></param>
    ///<returns>SDKConfig整个对象</returns>
    public static JsApiConfig GetJsSdkConfig(string url)
     {
         //获取tokenid
         string access_token=GetWxTokenId();
         //获取tikect
          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;
    }
    View Code

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

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

    请求的后台代码

    [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.jspiConfig());
                      }
               }
    View Code
  • 相关阅读:
    第十一周上机
    第十周上机
    第九周上机
    第八周作业
    课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用
    基于 mykernel 2.0 编写一个操作系统内核
    交互式多媒体图书平台的设计与实现
    码农的自我修养之必备技能 学习笔记
  • 原文地址:https://www.cnblogs.com/zzp0320/p/7150820.html
Copyright © 2011-2022 走看看