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&secret={1}",appid,secret);

    //向上面的地址发起httpger请求

    //这里是封装的一个http请求的类

    string content=HttpHelper.HttpGet(url);

    if(!string.IsNullOrEmpty(content))

    {

    var obj=JsonConcert.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=DataTime.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));

    ///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.ComputerHash(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 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,

    timestam=timestamp,

    signature=signature,

    tickect=jsapi_ticket,

    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,

    appId:configObj.appId,

    timestamp::configObj.timestamp,

    nonceStr:configObj.nonceStr,

    signature:configObj.signature,

    jsApiList:

    [

    'checkJsApi',

    'onMenuShareTimeline',

    'onMenuShareAppMessage',

    'onMenuShareQQ',

    'onMenuShareWeibo',

    'onMenuShareQZone'

    ]

    });

    });

    请求的后台代码

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

    }

    }

  • 相关阅读:
    spring cloud 学习过程中遇到的问题
    android学习第二天遇到的问题
    android studio 安装与使用第一天
    面试记录2
    谈谈找工作和面试正常的环节
    面试记录1
    重生
    虚拟机ubuntu 登录密码忘记解决办法
    自动化的基于TypeScript的HTML5游戏开发
    借助AMD来解决HTML5游戏开发中的痛点
  • 原文地址:https://www.cnblogs.com/zzp0320/p/7110292.html
Copyright © 2011-2022 走看看