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
原文地址:https://www.cnblogs.com/zzp0320/p/7150820.html