专栏首页石瞳禅的互联网实验室微信JS-SDK分享功能的.Net实现

微信JS-SDK分享功能的.Net实现

JS-SDK接口是什么?

为了方便开发者实现微信内的网页(基于微信浏览器访问的网页)功能,比如拍照、选图、语音、位置等手机系统的能力,并方便开发者直接使用微信分享、扫一扫等微信特有的能力,微信推出了JS-SDK的整体开发包,供开发者方便使用。

分享功能

官方文档里提供了phpjavanode.js以及python的示例代码,唯独没有c#版的,为了弥补广大.net用户的需求,我把php版本的示例代码逻辑照搬成了.net版,并在网页前端中加入了分享功能,希望对大家有用

程序实现

流程图

程序里关键的类是JSSDK,里面包含服务端请求认证的所有逻辑过程,下面是过程的流程图:

关键代码分析

为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,所以.net里引用了比较高版本(.Net 4.5+)的网络包进行http请求。

private string httpGet(string url)
{
    if (url.StartsWith("https"))
        System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

    HttpClient httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = httpClient.GetAsync(url).Result;

    if (response.IsSuccessStatusCode)
    {
        string result = response.Content.ReadAsStringAsync().Result;
        return result;
    }
    return null;
}

获取access_token,先从本地的access_token.aspx里找,如果没有或者过期(7000秒),则重新到微信服务器获取。

private string getAccessToken()
{
    string accessToken = string.Empty;
    var data = JObject.Parse(getAspxFile("access_token.aspx", ASPX_HEAD[1]));
    if (data != null && long.Parse(data["expire_time"].ToString()) < Utils.ConvertTimeStamp(DateTime.Now))
    {
        string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
            + this.appId + "&secret=" + this.appSecret;
        var jRes = JObject.Parse(httpGet(url));
        accessToken = jRes["access_token"].ToString();
        if (!string.IsNullOrEmpty(accessToken))
        {
            data["expire_time"] = Utils.ConvertTimeStamp(new DateTime()) + 7000;
            data["access_token"] = accessToken;
            setAspxFile("access_token.aspx", data.ToString(), ASPX_HEAD[1]);
        }
    }
    else
        accessToken = data["access_token"].ToString();
    return accessToken;
}

获取jsapi_ticket,原理与access_token一样。

private string getJsApiTicket()
{
    string ticket = string.Empty;
    var data = JObject.Parse(getAspxFile("jsapi_ticket.aspx", ASPX_HEAD[0]));
    if (data != null && long.Parse(data["expire_time"].ToString()) < Utils.ConvertTimeStamp(DateTime.Now))
    {
        string accessToken = getAccessToken();
        string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token="
            + accessToken;
        var jRes = JObject.Parse(httpGet(url));
        ticket = jRes["ticket"].ToString();
        if (!string.IsNullOrEmpty(ticket))
        {
            data["expire_time"] = Utils.ConvertTimeStamp(new DateTime()) + 7000;
            data["jsapi_ticket"] = ticket;
            setAspxFile("jsapi_ticket.aspx", data.ToString(), ASPX_HEAD[0]);
        }
    }
    else
        ticket = data["jsapi_ticket"].ToString();
    return ticket;
}

完整代码

https://github.com/stozen/jssdk-wxshare

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ASP.NET MVC下判断用户登录和授权状态方法

    在我们日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题。登录功能(Authentication),针对于所有用户都开放;而授权(Authorizati...

    石瞳禅
  • gliffy在手,管理、产品、架构我都有!

    作为一个管理者,你要制定整个部门乃至全公司的组织架构图,或者你要向老板分析企业现状并交给他一份完美的计划,此时,你可能会使用PowerPoint、Keynote...

    石瞳禅
  • 解决Android AVD启动报错问题

    好不容易从ADT Bundle转为Android Studio的开发环境,一路荆棘,现在又遇到了模拟器的问题,本来直接用真机调试程序会更快些,但是为了模拟多种系...

    石瞳禅
  • 百度easydl之图像分类构建是否佩戴口罩模型

    今天试了下百度esaydl的图像分类方面的功能,其优点是主需要上传自己的数据集,不需要关注模型训练,就可以得到相应的结果。最后得到的模型可以调用云api在本地进...

    绝命生
  • GCAC90 20.4 Computational zero-knowledge and applications

    20.4 Computational zero-knowledge and applications

    安包
  • 一个纯JS脚本的文档敲诈者剖析(附解密工具)

    0x00 概述 近日,腾讯反病毒实验室拦截到一个名为RAA的敲诈者木马,其所有的功能均在JS脚本里完成。这有别于过往敲诈者仅把JS脚本当作一个下载器,去下载和执...

    FB客服
  • 译文 | 在使用过采样或欠采样处理类别不均衡数据后,如何正确做交叉验证?

    最近读的一篇英文博客,讲的很不错,于是便抽空翻译成了中文。 [关于我在这篇文章中使用的术语可以在 Physionet (http://www.physionet...

    用户1332428
  • CCF考试——201609-1最大波动

      小明正在利用股票的波动程度来研究股票。小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘...

    AI那点小事
  • Saltstack远程执行

    Return组件可以理解为SaltStack系统对执行Minion返回后的数据存储或者返回给其他程序,支持多种存储方式,例如 MySQL、MongoDB 、Re...

    菲宇
  • AI 挑战赛 | 基于一分钟渐进情绪行为数据集(OMG-Emotion)的情绪识别挑战赛

    大部分的情感系统基于 Paul Ekman 的分类方案,即六种普遍情感:厌恶、恐惧、幸福、惊奇、悲伤和愤怒。虽然 Ekman 在他的研究中表明,这些情绪是通过人...

    AI研习社

扫码关注云+社区

领取腾讯云代金券