Exemple #1
0
        /*************************************************
        *  GetAccessToken(后端API)
        *  获取后台接口调用凭证。AccessToken 是小程序全局唯一后台接口调用凭据,调用绝大多数后台接口时都需使用
        *  参考
        *   小程序获取Token文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/auth.getAccessToken.html
        *   公众号获取Token文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
        *   访问方法一致,公众号要求配置IP白名单,小程序无需配置。
        *  返回值:
        *   access_token   string    获取到的凭证
        *   expires_in	   number    凭证有效时间,单位:秒。目前是7200秒之内的值。
        *   errcode	       number    错误码
        *   errmsg	       string    错误信息
        *  access_token 的存储与更新
        *   access_token 的存储至少要保留 512 个字符空间;
        *   access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
        *   access_token 的有效期通过返回的 expire_in 来传达,目前是7200秒之内的值,需要根据这个有效时间提前去刷新。
        *  建议开发者使用中控服务器统一获取和刷新 access_token
        *   其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;
        *   在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
        *   access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新
        *   还需要提供被动刷新 access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。
        *************************************************/
        /// <summary>获取访问Token(带缓存机制)</summary>
        /// <param name="refresh">是否强制刷新,从微信官方服务器重新生成Token</param>
        public static string GetAccessToken(WechatAppType type, bool refresh = false)
        {
            GetAccessTokenReply data;
            var key   = "WechatAccessToken" + type.ToString();
            var cache = HttpContext.Current.Cache;

            if (refresh || cache[key] == null)
            {
                var appId     = WechatConfig.GetAppId(type);
                var appSecret = WechatConfig.GetAppSecret(type);
                data = GetAccessTokenInternal(appId, appSecret);
                cache.Insert(key, data, null, data.ExpireDt, Cache.NoSlidingExpiration);
            }
            data = cache[key] as GetAccessTokenReply;
            return(data.access_token);
        }
 public static string GetAppSecret(WechatAppType type)
 {
     return((type == WechatAppType.Open) ? WechatConfig.OpenAppSecret : WechatConfig.MPAppSecret);
 }
 public static string GetPayUrl(WechatAppType type)
 {
     return((type == WechatAppType.Open) ? WechatConfig.OpenPayUrl : WechatConfig.MPPayUrl);
 }
        public static string MchKey = ConfigurationManager.AppSettings["WechatMchKey"];                    // 商户平台设置的密钥key


        //---------------------------------------------
        // 辅助方法
        //---------------------------------------------
        public static string GetAppId(WechatAppType type)
        {
            return((type == WechatAppType.Open) ? WechatConfig.OpenAppId : WechatConfig.MPAppId);
        }