zoukankan      html  css  js  c++  java
  • 公众号jssdk使用代码

    使用jssdk的时候,发生了在配置时候产生的问题。config:invalid signature

    后来发现是因为地址配置错误产生的。

    如果代码写完后,确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。

    参考网址:

    1. https://www.cnblogs.com/vipstone/p/6732660.html
    2. https://blog.csdn.net/dmw412724/article/details/81083058

    我遇到的问题是

    1. 在生成签名(signature)的时候,生成出错了。是我的 window.location.href.split('#')[0]  手写的,应该动态获取。(建议全部小写)
    2. 在签名成功以后,傻傻的调用  wx.ready(function () {  })   一直没有执行。在这里也花费了好久时间
    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js" type="text/javascript"></script>
        <script src="~/scripts/jquery/jquery-3.3.1/jquery-3.3.1.min.js"></script>
        <title>签到/签退</title>
        <script type="text/javascript">
    
            jQuery.post("/wxser/GetJSSDKConfig", {
                "url": encodeURIComponent(window.location.href.split('#')[0]),
                "t": new Date().getTime()
            }, function (result) {
    
                wx.config({
                    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                    appId: result.appId, // 必填,公众号的唯一标识
                    timestamp: result.timestamp, // 必填,生成签名的时间戳
                    nonceStr: result.nonceStr, // 必填,生成签名的随机串
                    signature: result.signature,// 必填,签名,见附录1
                    jsApiList: ['openLocation', 'getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
                });
    
                setTimeout(photo, 2000);
            });
    
    
            function photo() {
                wx.getLocation({
                    type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
                    success: function (res) {
                        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                        var speed = res.speed; // 速度,以米/每秒计
                        var accuracy = res.accuracy; // 位置精度
                        if (latitude && longitude) {
                            $.ajax({
                                url: "/wxser/ClockInForAttendanceDo",
                                data: {
                                    code: '@(Request.QueryString["code"])',
                                    state: '@(Request.QueryString["state"])',
                                    gps: longitude + ',' + latitude
                                },
                                success: function (res) {
                                    document.write("<h2>" + res + "</h2>");
                                }
                            });
                        }
                    }
                });
            }
    
        </script>
        <style>
            .btn0 {
                 80%;
                margin-top: 10px;
                height: 20px;
                background-color: burlywood;
                color: white;
                border-radius: 98px;
                display: none;
            }
        </style>
    </head>
    <body>
        <h2>正在签@(Request.QueryString["state"] == "1" ? "" : "退")...</h2>
        <div style="text-align:center;100%">
            <input type="button" value="打卡" id="gps" onclick="photo()" class="btn0" />
        </div>
    </body>
    </html>
    [HttpPost]
    public JsonResult GetJSSDKConfig(string url)
    {
        Log.Debug("GetJSSDKConfig【url】:", Server.UrlDecode(url));
        string jsapi_ticket = WXSmartNote.Getjsapi_ticket();
        string timestamp = WXSmartNote.GetTimeStamp(), nonceStr = "scmone";   //timestamp 时间戳,nonceStr 加密码
        string str1 = string.Format(@"jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}"
                                    , jsapi_ticket, nonceStr, timestamp, Server.UrlDecode(url));
        //获取签名
        string signature = WXSmartNote.GetSHA1(str1);
        Log.Debug("GetJSSDKConfig【signature】:", signature);
        ViewBag.appId = WxSmartNoteConfig.APPID;
        ViewBag.signature = signature;
        ViewBag.timestamp = timestamp;
        ViewBag.nonceStr = nonceStr;
        return this.Json(new
        {
            appId = WxSmartNoteConfig.APPID,
            signature = signature,
            timestamp = timestamp,
            nonceStr = nonceStr
        });
    }
    
    
    
    
       public static string GetTimeStamp()
    {
        TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
        return Convert.ToInt64(ts.TotalSeconds).ToString();
    }
    
    
      public static string GetSHA1(string rawData)
    {
        Log.Debug("签名源数据:", rawData);
        //创建SHA1签名类
    
        SHA1 sha1 = new SHA1CryptoServiceProvider();
    
        //编码用于SHA1验证的源数据
    
        byte[] source = Encoding.UTF8.GetBytes(rawData);
    
        //生成签名
    
        byte[] target = sha1.ComputeHash(source);
    
        //转化为string类型,注意此处转化后是中间带短横杠的大写字母,需要剔除横杠转小写字母
    
        string result = BitConverter.ToString(target).Replace("-", "").ToLower();
    
        //输出验证结果
    
        return result;
    
    }
    
    
    public static string Getjsapi_ticket()
    {
        RedisHelper redis = new RedisHelper();
        string key_access = "access_token";
        string key_ticket = "ticket";
        string ticket = redis.StringGet(key_ticket);
        if (!string.IsNullOrEmpty(ticket))
        {
            return ticket;
        }
        else
        {
            string access_token = redis.StringGet(key_access);
            if (string.IsNullOrEmpty(access_token))
            {
                access_token = GetAccess_Token();
                redis.StringSet(key_access, access_token, TimeSpan.FromSeconds(7100));
            }
            if (string.IsNullOrEmpty(access_token)) return "";
    
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
    
            var data = GetPage(url);
            Log.Debug("获取用户Access_Token GetAccess_Token", data);
            Dictionary<string, object> obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(data);
    
            object result = "";
            if (!obj.TryGetValue("ticket", out result))
                return "";
            ticket = result.ToString();
            redis.StringSet(key_ticket, ticket, TimeSpan.FromSeconds(7100));
    
            return ticket;
        }
    }
  • 相关阅读:
    datanode报错Problem connecting to server
    使用命令查看hdfs的状态
    Access denied for user root. Superuser privilege is requ
    ElasticSearch默认的分页参数 size
    SparkStreaming Kafka 维护offset
    【容错篇】Spark Streaming的还原药水——Checkpoint
    251 Android 线性与相对布局简介
    250 Android Studio使用指南 总结
    249 如何解决项目导入产生的中文乱码问题
    248 gradle更新问题
  • 原文地址:https://www.cnblogs.com/vincentvoid/p/11950721.html
Copyright © 2011-2022 走看看