微信web端分享接口开发详述

基本的配置在微信公众平台里面已经有详细的描述了,我在这里只是针对我自己在开发过程中碰到的问题进行叙述。谢谢!


1.首先得到当前页面的url信息不包含#及后面部分  var url = location.href.split('#')[0];(这个加密的url我在开发的时候一直在用后台生成的导致老是签名失败!苦恼大哭

2.将url传递到后台就行加密


后台c#代码

Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("url", url);
//得到jsapi_ticket
string ticket = WeiXinInter.WeiXinTicket.jsapi_ticket;
parameters.Add("jsapi_ticket", ticket);
//生成时间戳
string ts = GenerateTimeStamp();
//获得nonceStr: '',  生成签名的随机串
string noncestr = GenerateNonceStr();
parameters.Add("timestamp", ts);
 parameters.Add("noncestr", noncestr);
//ASCII码从小到大排序并且进行sha1加密

string signature = CreateSignString(parameters);


        /// <summary>
        /// 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
        /// </summary>
        /// <returns></returns>
        private static string GenerateTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }


        /// <summary>
        /// 获得nonceStr: '',  生成签名的随机串
        /// </summary>
        /// <returns></returns>
        private static string GenerateNonceStr()
        {
            return Guid.NewGuid().ToString().Replace("-", "");
        }

      

        //将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序)

        static string CreateSignString(Dictionary<string, string> parameters)
        {
            foreach (var key in parameters.Keys.Where(key => string.IsNullOrEmpty(parameters[key])))
            {
                parameters.Remove(key);
            }


            //第一步,设所有収送戒者接收到的数据为集合 M,将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),
            //使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串 stringA。
            //特别注意以下重要规则:
            //1.参数名 ASCII 码从小到大排序(字典序) ;
            //2.如果参数的值为空不参与签名;
            //3.参数名区分大小写;
            //4.验证调用返回戒微信主劢通知签名时,传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验。
            var keyArray = parameters.Keys.ToArray();
            Array.Sort(keyArray);
            var keyString = keyArray.Aggregate("", (current, t) => current + (t + "=" + parameters[t] + "&"));


            //第二步,在 stringA 最后拼接上 key=商户支付密钥得到 stringSignTemp 字符串,
            //并对 stringSignTemp 进行 MD5 运算,再将得到的字符串所有字符转换为大写,得到 sign的值 signValue
            keyString = keyString.Substring(0, keyString.Length - 1);
            //
            return SHA1(keyString).ToLower();
        }

       //sha1加密

        private static string SHA1(string text)
        {
            byte[] cleanBytes = Encoding.Default.GetBytes(text);
            byte[] hashedBytes = System.Security.Cryptography.SHA1.Create().ComputeHash(cleanBytes);
            return BitConverter.ToString(hashedBytes).Replace("-", "");
        }

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

web前端代码,微信公众平台文档有详细说明

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

           wx.ready(function(){
            console.log("----");
            // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
            //分享到朋友圈
            //console.log("进入ready");
            wx.onMenuShareTimeline({
                title: Sharetitle, // 分享标题(这个分享的url可以自己定义,与加密的url不同,加密的url必须是当前页面的url不包含#及后面的部分)
                link: ShareLink, // 分享链接
                imgUrl: imgurl, // 分享图标
                success: function () {
                    // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
            //分享给朋友
            wx.onMenuShareAppMessage({
                title: Sharetitle, // 分享标题
                desc: Sharecontent, // 分享描述
                link: ShareLink, // 分享链接
                imgUrl: imgurl, // 分享图标
                type: 'link', // 分享类型,music、video或link,不填默认为link
                dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                success: function () {
                    // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
        });


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





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值