利用JS-SDK微信分享接口调用(后端.NET)

2023-05-16

一直都想研究一下JS-SDK微信分享的接口调用,由于最近工作需要,研究了一下,目前只是实现了部分接口的调用;其他接口调用也是类似的;
在开发之前,需要提前准备一个微信公众号,并且域名JSAPI 配置接口正确,微信只能在部署在外网才能正常使用和测试;
闲话不多少说直接上代码 :

第一步:首先我们的有前端调用前端调用(实例代码)

<% if (IsWeiXinBrower)  <%--这里是后端写的一个判断是否为微信浏览器的方法判断--%>
            { %>
        <script src="/Scripts/jweixin-1.0.0.js?t=2016060160945"></script> <%--这个JS很重要,是微信官网的JS接口--%>
        <script src="/Scripts/weixincommon.js?t=2016060160945"></script><%--这个JS就是我自己写的一个方法封装了--%>
        <script type="text/javascript">
            if (wx){
                $(document).ready(function(){
                    WeiXinCommon2.WeiXinConfig();
                    var title = '<%= DtProductBasicInfo.Rows[0]["Productname"].ToString("") %>';
                    var content = title;
                    var link ='<%= WeiXinShareUrl %>';
                    var imgUrl = '<%= ShareImageUrl %>';//<%--<%= QRImageUrl %>--%>
                    wx.ready(function () {
                        WeiXinCommon2.ShareToFriend(title, content, link, imgUrl);
                        WeiXinCommon2.ShareToTimeLine(title, link, imgUrl);
                    });            
                });            
            }          
        </script>
   <% } %>

第二步:创建JS文件,例如:weixincommon.js,将下面的JS复制到封装的JS代码就可以了

function IsWeiXinBrowser() {
    var ua = navigator.userAgent.toLowerCase();
    if (ua.match(/MicroMessenger/i) == "micromessenger") {
        return true;
    }
    else {
        return false;
    }
}
var WeiXinCommon2 = ({
    //配置
    WeiXinConfig: function () {
        $.ajax({
            async: false,
            url: '/WeiXinInterface/WeixinInterface.ashx',//调用的一般处理程序
            type: 'POST',
            dataType: "json",
            data: {
                type: "GetWeiXinJSApiConfig",
                url: window.location.href
            },
            error: function (xhr, status, err) {
            },
            success: function (json) {
                if (json.IsSuccess) {
                    wx.config({
                        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                        appId: json.appId, // 必填,公众号的唯一标识
                        timestamp: json.timestamp, // 必填,生成签名的时间戳
                        nonceStr: json.noncestr, // 必填,生成签名的随机串
                        signature: json.signature,// 必填,签名,见附录1
                        jsApiList: [
                            'onMenuShareTimeline',
                            'onMenuShareAppMessage',
                            'onMenuShareQQ',
                            'onMenuShareWeibo',
                            'startRecord',
                            'stopRecord',
                            'onVoiceRecordEnd',
                            'playVoice',
                            'pauseVoice',
                            'stopVoice',
                            'onVoicePlayEnd',
                            'uploadVoice',
                            'downloadVoice',
                            'chooseImage',
                            'previewImage',
                            'uploadImage',
                            'downloadImage',
                            'translateVoice',
                            'getNetworkType',
                            'openLocation',
                            'getLocation',
                            'hideOptionMenu',
                            'showOptionMenu',
                            'hideMenuItems',
                            'showMenuItems',
                            'hideAllNonBaseMenuItem',
                            'showAllNonBaseMenuItem',
                            'closeWindow',
                            'scanQRCode',
                            'chooseWXPay',
                            'openProductSpecificView',
                            'addCard',
                            'chooseCard',
                            'openCard'
                        ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
                    });
                }
                else {
                    //alert(json.Message);
                }
            }
        });
    },
    //分享给朋友
    ShareToFriend: function (title, desc, link, imgUrl, successFn, cancelFn, failFn) {
        wx.onMenuShareAppMessage({
            title: title,
            desc: desc,
            link: link,
            imgUrl: imgUrl,
            trigger: function (res) {
                // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
                //alert('用户点击发送给朋友');
            },
            success: function (res) {
                if (typeof (successFn) == "function") {
                    successFn();
                }
            },
            cancel: function (res) {
                if (typeof (cancelFn) == "function") {
                    cancelFn();
                }
            },
            fail: function (res) {
                if (typeof (failFn) == "function") {
                    failFn();
                }
            }
        });
    },
    //分享至朋友圈
    ShareToTimeLine: function (title, link, imgUrl, successFn, cancelFn, failFn) {
        wx.onMenuShareTimeline({
            title: title,
            link: link,
            imgUrl: imgUrl,
            trigger: function (res) {
                // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
                //alert('用户点击分享到朋友圈');
            },
            success: function (res) {
                if (typeof (successFn) == "function") {
                    successFn();
                }
            },
            cancel: function (res) {
                if (typeof (cancelFn) == "function") {
                    cancelFn();
                }
            },
            fail: function (res) {
                //alert(JSON.stringify(res));
                if (typeof (failFn) == "function") {
                    failFn();
                }
            }
        });
    },
    //分享至QQ
    ShareToQQ: function (title, desc, link, imgUrl, completeFn, successFn, cancelFn, failFn) {
        wx.onMenuShareQQ({
            title: title,
            desc: desc,
            link: link,
            imgUrl: imgUrl,
            trigger: function (res) {
                alert('用户点击分享到QQ');
            },
            complete: function (res) {
                if (typeof (completeFn) == "function") {
                    completeFn();
                }
            },
            success: function (res) {
                if (typeof (successFn) == "function") {
                    successFn();
                }
            },
            cancel: function (res) {
                if (typeof (cancelFn) == "function") {
                    cancelFn();
                }
            },
            fail: function (res) {
                if (typeof (failFn) == "function") {
                    failFn();
                }
            }
        });
    },
    //分享至微博
    ShareToWeiBo: function (title, desc, link, imgUrl, completeFn, successFn, cancelFn, failFn) {
        wx.onMenuShareWeibo({
            title: title,
            desc: desc,
            link: link,
            imgUrl: imgUrl,
            trigger: function (res) {
                alert('用户点击分享到微博');
            },
            complete: function (res) {
                if (typeof (completeFn) == "function") {
                    completeFn();
                }
            },
            success: function (res) {
                if (typeof (successFn) == "function") {
                    successFn();
                }
            },
            cancel: function (res) {
                if (typeof (cancelFn) == "function") {
                    cancelFn();
                }
            },
            fail: function (res) {
                if (typeof (failFn) == "function") {
                    failFn();
                }
            }
        });
    },
    //隐藏菜单
    HideOptionMenu: function () {
        wx.hideOptionMenu();
    },
    //显示菜单
    ShowOptionMenu: function () {
        wx.showOptionMenu();
    },
    //批量隐藏菜单项
    HideMenuItems: function (menuList) {
        wx.hideMenuItems({
            menuList: menuList,
            //[
            //  'menuItem:readMode', // 阅读模式
            //  'menuItem:share:timeline', // 分享到朋友圈
            //  'menuItem:copyUrl' // 复制链接
            //],
            success: function (res) {
                //alert('已隐藏“阅读模式”,“分享到朋友圈”,“复制链接”等按钮');
            },
            fail: function (res) {
                //alert(JSON.stringify(res));
            }
        });
    },
    //批量显示菜单项
    ShowMenuItems: function (menuList) {
        wx.showMenuItems({
            menuList: menuList,
            //[
            //  'menuItem:readMode', // 阅读模式
            //  'menuItem:share:timeline', // 分享到朋友圈
            //  'menuItem:copyUrl', // 复制链接
            //  'menuItem:profile', // 查看公众号(已添加)
            //  'menuItem:addContact' // 查看公众号(未添加)
            //],
            success: function (res) {
                //alert('已显示“阅读模式”,“分享到朋友圈”,“复制链接”等按钮');
            },
            fail: function (res) {
                //alert(JSON.stringify(res));
            }
        });
    },
    //隐藏所有非基本菜单项
    HideAllNonBaseMenuItems: function(){
        wx.hideAllNonBaseMenuItem({
            success: function () {
                alert('已隐藏所有非基本菜单项');
            }
        });
    },
    //显示所有被隐藏的非基本菜单项
    ShowAllNonBaseMenuItems: function () {
        wx.showAllNonBaseMenuItem({
            success: function () {
                alert('已显示所有非基本菜单项');
            }
        });
    },
    //关闭当前窗口
    CloseWindow: function () {
        wx.closeWindow();
    }
});

第三步:后端代码(.NET)

      /// <summary>
        /// 取得JSApi配置
        /// </summary>
        /// <returns></returns>
        protected string GetWeiXinJSApiConfig(HttpContext context)
        {
            object result;

            string url = context.Request["url"].ToString("");
            int lastIndexOfSharpChar = url.LastIndexOf('#');
            if (lastIndexOfSharpChar >= 0)
                url = url.Remove(lastIndexOfSharpChar);
            DataRow dr = DevInfoBLL.LoadDeveloperInfo();//这是获取数据保存的配置信息,这个需要自定义
            string appId = dr != null ? dr["AppId"].ToString("") : "";
            string appSecret = dr != null ? dr["AppSecret"].ToString("") : "";
            if (string.IsNullOrEmpty(appId) || string.IsNullOrEmpty(appSecret)) {
                result = new {
                    IsSuccess = false,
                    Message = "未录入开发者信息!",
                };
            }
            else {
                long timestamp = DateTime.Now.ToTimestamp();
                string noncestr = GetNonceStr();
                string signature = "";          
                if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(appSecret)) {
                    signature = WeiXinMenuHelper.GetJSApiTicketSignature(appId, appSecret, noncestr, timestamp, url);//获取签名
                    result = new {
                        IsSuccess = true,
                        Message = "",
                        appId = appId,
                        appSecret = appSecret,
                        timestamp = timestamp,
                        noncestr = noncestr,
                        signature = signature
                    };
                }
                else {
                    result = new {
                        IsSuccess = false,
                        Message = "未取得微信配置信息!",
                    };
                }
            }

            return result.ToJson();
        }
        /// <summary>
        /// 取得微信JSApi签名
        /// </summary>
        /// <returns></returns>
        public static string GetJSApiTicketSignature(string appId, string appSecret, string noncestr, long timesStamp, string url)
        {
            string jsApiTicket = GetJSApiTicket(appId, appSecret);
            string hashSource = string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}",
                jsApiTicket, noncestr, timesStamp, url);

            System.Security.Cryptography.SHA1 sha1 = new System.Security.Cryptography.SHA1CryptoServiceProvider();
            byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(hashSource);
            byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
            string str_sha1_out = BitConverter.ToString(bytes_sha1_out);
            str_sha1_out = str_sha1_out.Replace("-", "");
            return str_sha1_out;
        }
        /// <summary>
        /// 取得nonceStr
        /// </summary>
        /// <returns></returns>
        public string GetNonceStr()
        {
            string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

            StringBuilder sbResult = new StringBuilder();
            Random random = new Random(chars.Length);
            for (int i = 0; i < 32; i++) {
                sbResult.Append(chars[random.Next(chars.Length)]);
            }
            return sbResult.ToString();
        }

以上是实现的关键代码,可以根据自己的理解适当封装,来满足自己的需求,后续会有更多的微信JS-SDK接口实现陆续更新,请持续关注。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用JS-SDK微信分享接口调用(后端.NET) 的相关文章

随机推荐

  • Elsevier论文模板中添加作者简介和图片(biography)

    Elsever论文模板的论文模板中没有biography的模板 xff0c CSDN上也有不少解决方法 xff0c 例如这里的 xff1a documentclass article usepackage wrapfig usepackag
  • springboot maven项目集成阿里p3c-pmd插件使用

    阿里巴巴规约使用的是pmd代码静态分析工具 xff0c 通过maven pmd plugin这个maven插件实现 pom文件引入 span class token operator lt span span class token ope
  • 关于VR的历史及发展

    寒假我看了关于一些虚拟现实的东西 xff0c 并在网上查获了一些资料 xff0c 作出以下归纳总结 xff1a 虚拟现实 xff0c 无法绕开它的历史 xff0c 最早可以追溯到公元前427年的古希腊时代 xff0c 当时的哲学家柏拉图在提
  • linux安装jdk环境(多种方式)

    linux系统通用安装 通过tar gz压缩包安装 此方法适用于绝大部分的linux系统 下载tar gz的压缩包 xff0c 这里使用官网下载 进入 xff1a http www oracle com technetwork java j
  • 线程的生产者和消费者模式

    多个线程同时运行时 xff0c 会产生线程并发可使用同步操作确保数据的安全性 xff0c 如果需要各线程之间交互 xff0c 可是使用线程等待和唤醒模式 xff0c 在这里常用的等待唤醒中经典的模式为 生产者和消费者模式 生产者和消费者由两
  • 获取操作日志记录(springboot+AOP)

    下面是我在公司写操作日志记录的时候的代码使用的aop自定义注解的方式 xff0c 这里记录一下代码希望可以给大家带来一些帮助 xff0c 顺便自己也巩固一下 方便随时取用 Aop注解实现日志的话其实不难 xff0c 我认为只要理解下面三个点
  • ThinkPHP5 SQL注入(select方法)

    ThinkPHP5 SQL注入 xff08 select方法 xff09 漏洞概要初始配置漏洞利用漏洞分析漏洞修复攻击总结 漏洞概要 本次漏洞存在于 Mysql 类的 parseWhereItem 方法中 xff0c 由于程序没有对数据进行
  • Windows下通过PowerShell终端直接制作tar.gz压缩包

    因为工作需要 xff0c 笔者经常要在windows系统里上传多个文件到linux环境上 centos linux下默认支持tar gz压缩格式 xff0c 因此一般都是通过制作tar gz压缩包来传的 原来在Windows下制作tar g
  • 一日一技:Ocelot网关使用IdentityServer4认证

    概述 Ocelot是一个用 NET Core实现的开源API网关技术 IdentityServer4是一个基于OpenID Connect和OAuth2 0的针对ASP NET Core的框架 xff0c 以中间件的形式存在 OAuth是一
  • Android Studio模拟器启动后不停闪烁(未解决)

    问题描述 xff1a Android Studio模拟器启动后不停闪烁 解决方法 xff1a 右侧点击Device Manager打开设备管理 xff0c 点击修改标志 将Graphics 图样 换成Software 软件 xff0c 点击
  • 复杂网络建模的实现(哈工大深圳复杂网络建模课程Project)

    任务 xff1a 1 xff0c 三张不同的网络 xff1a 已知某人的名称 已知某人的家乡 已知某人的方言 分析这三者各自的网络性能 xff08 节点度数分布 平均最短路径长度 集聚系数 xff09 以及动态行为 xff08 在刻意攻击
  • 免登陆Oracle官网下载JDK

    Oracle官网下载JDK 方法一 免登录下载 进入官网 xff0c 选择需要下载的JDK版本 xff0c 这里以JDK8为例 点击下载 xff0c 勾选同意 在正常情况下 xff0c 点击 Download jdk 8u333 windo
  • linux rancher 清理docker容器磁盘空间

    目录说明 var lib docker containers xff1a 是 Docker 在 Linux 系统上默认存储容器信息的目录 在该目录下 xff0c 每个运行的 Docker 容器都有一个单独的目录 xff0c 以容器 ID 命
  • 如何在官网下载COCO数据集

    官网地址 xff1a https cocodataset org download 1 选择下载的数据 xff0c 右键 xff0c 获取下载地址 2 将 http 改为 https 示例获得的下载地址为 xff1a http images
  • 两个互相引用对象的垃圾回收

    部分转自 xff1a 深入理解java虚拟机 一书 判断对象是否存活 1 引用计数算法 给对象添加一个引用计数器 xff0c 每当有一个地方引用它时 xff0c 计数器值就加1 当引用失效时 xff0c 计数器值就减1 任何时刻计数器为0的
  • ssm整合时,通过jdbc.properties文件无法连接mysql问题

    最近在重温ssm框架 在搭建基础的项目进行单元测试时 xff0c 发现无法连接mysql数据库 通过各种查资料终于发现了原因 原始jdbc properties文件 由于username这个属性会被系统的username变量覆盖 xff0c
  • Mysql数据库之左连接left join 右连接right join 内连接inner join

    最近 xff0c 公司的用户达到了700 43 万 xff0c 意味着数据库已经达到700 43 万 xff0c 聊聊傻傻分不清的连接查询吧 xff01 前提 数据库中一共有三个表 class book phone 而且每个数据库表中都有1
  • VMware虚拟机软件,配置Linux Ubuntu操作系统环境,及安装问题总结大全

    文章目录 1 xff1a 前言2 xff1a 基本认识3 下载环境4 xff1a VM虚拟机的安装5 xff1a ubuntu的下载6 xff1a 把ubuntu安装在VM虚拟机上7 VMware Tools工具8 Source insig
  • linux常用命令(Beginner note)

    命令 ls 列出所有文件及文件夹 ls 路径 xff1a 列出所给路径下的所有文件及文件夹 选项 xff1a xff08 可组合使用 xff0c 也可简写组合形式 xff0c 例 xff1a alh xff0c 无先后顺序 xff09 a
  • 利用JS-SDK微信分享接口调用(后端.NET)

    一直都想研究一下JS SDK微信分享的接口调用 xff0c 由于最近工作需要 xff0c 研究了一下 xff0c 目前只是实现了部分接口的调用 xff1b 其他接口调用也是类似的 xff1b 在开发之前 xff0c 需要提前准备一个微信公众