企业微信、微信公众号 JS-SDK 注入权限验证 C#版

2020-10-10  乐帮网

c# 企业微信

微信公众平台面(包含企业微信)JSSDK使用步骤主要包含以下几项:

(1)绑定域名
进入微信平台“公众号设置”的“功能设置”里填写“JS接口安全域名”。

(2)引入JS文件

(https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js

(3)使用config接口注入权限验证配置。

wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

(4)使用ready接口处理成功验证

wx.error(function(res){
  // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});

其中C#版的生成权限验证配置的代码封装如下:

public class SignHelper
    {
        public static string GetSha1(string str)
        {
#if NET45
            SHA1 sha = new SHA1CryptoServiceProvider();
#else
            SHA1 sha = SHA1.Create();
#endif
            ASCIIEncoding encode = new ASCIIEncoding();
            byte[] dataToHash = encode.GetBytes(str);
            byte[] dataHashed = sha.ComputeHash(dataToHash);
            string hash = BitConverter.ToString(dataHashed).Replace("-", "");
            return hash;
        }
    }


    public class JsSDKHelper
    {

        private static DateTime utc = new DateTime(1970, 1, 1, 0, 0, 0, 0);

        public static string GetNoncestr()
        {
            return Guid.NewGuid().ToString("N");
        }

        public static long GetTimestamp()
        {
            TimeSpan ts = DateTime.UtcNow - utc;
            return Convert.ToInt64(ts.TotalSeconds);
        }

        public static string GetSignature(string jsapi_ticket, string noncestr, long timestamp, string url)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
             .Append("noncestr=").Append(noncestr).Append("&")
             .Append("timestamp=").Append(timestamp).Append("&")
             .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
            return SignHelper.GetSha1(sb.ToString()).ToLower();
        }

        public static string GetJsToken()
        {
            WxCache cache = new WxCache();
            return cache.GetJsToken();
        }

        public static string Replace(string source, string pattern, string replacement)
        {
            return Regex.Replace(source, "^" + pattern, replacement, RegexOptions.IgnoreCase);
        }

使用方法,在页面后台代码中调用:

@{
    long timestamp = JsSDKHelper.GetTimestamp();
    string nonceStr = JsSDKHelper.GetNoncestr();
    string url = Request.Url.ToString().ToLower();
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    System.Collections.Generic.Dictionary<string, string> HeaderList = new System.Collections.Generic.Dictionary<string, string>();

    foreach (string headerKey in Request.Headers)
    {
        HeaderList.Add(headerKey.ToLower(), Request.Headers[headerKey]);
    }

    if (HeaderList.ContainsKey("x-forwarded-proto"))
    {
        if (HeaderList["x-forwarded-proto"].ToLower() == "https")
        {
            url = url.Replace("http:", "https:");
        }
    }

    string signature = JsSDKHelper.GetSignature(JsSDKHelper.GetJsToken(WxConfig.MainSecret), nonceStr, timestamp, url);

}

在页面JS中直接注入权限验证:

<script type="text/javascript">

      wx.config({
        beta: true,
        debug: true,
        appId: '@WxConfig.CropID',
        timestamp: @timestamp,
        nonceStr: '@nonceStr',
        signature: '@signature',
        jsApiList: ['closeWindow']
    });

    wx.ready(function () {
    });

    wx.error(function (res) {
        layer.info('Error wx:' + JSON.stringify(res));
    });
    wx.checkJsApi({
        jsApiList: ['chooseImage'],
        success: function (res) {

        }
    });
    </script>

以上就是全部代码,欢迎指正,有问题可以在公众号留言。

欢迎查看我的作品:项目营销管理系统

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力