内嵌在微信中的网页,右上角都会有一个默认的分享功能。如下图所示,第一个为自定义的效果,第二个为默认的效果。实现了自定义的分享链接是不是更让人有点击的欲望?下面讲解下开发的过程。

一、准备,设置js接口安全域名

这需要使用微信的jssdk,先需要在微信公众号后台进行设置:公众号设置-->功能设置-->JS接口安全域名。打开这个页面之后你会看到下面的提示。需要先下载这个文件并上传到指定域名的根目录。

这个文件里面是一个字符串,从名称看是用来校验用的。先上传了这个文件,你才能保存成功。这样你就可以使用jssdk了。

二、前端配置

首先要说明的是分享功能是一个配置功能,绑定在按钮的click事件中是没有效果的。也就是说只有点击右上角的分享才有效果(有的文字内容分享不知道是怎么实现的)。官方的js有四个步骤,首先是引入jssdk:

  1. <script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>

根据官方的配置参数,我们可以定义一个WXShareModel对象:

  1. public class WXShareModel
  2. {
  3. public string appId { get; set; }
  4. public string nonceStr { get; set; }
  5. public long timestamp { get; set; }
  6.  
  7. public string signature { get; set; }
  8.  
  9. public string ticket { get; set; }
  10. public string url { get; set; }
  11.  
  12. public void MakeSign()
  13. {
  14. var string1Builder = new StringBuilder();
  15. string1Builder.Append("jsapi_ticket=").Append(ticket).Append("&")
  16. .Append("noncestr=").Append(nonceStr).Append("&")
  17. .Append("timestamp=").Append(timestamp).Append("&")
  18. .Append("url=").Append(url.IndexOf("#") >= ? url.Substring(, url.IndexOf("#")) : url);
  19. var string1 = string1Builder.ToString();
  20. signature = Util.Sha1(string1, Encoding.Default);
  21.  
  22. }
  23. }

然后是进行配置:

  1. wx.config({
  2. debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  3. appId: '@Model.appId', // 必填,公众号的唯一标识
  4. timestamp: '@Model.timestamp', // 必填,生成签名的时间戳
  5. nonceStr: '@Model.nonceStr', // 必填,生成签名的随机串
  6. signature: '@Model.signature',// 必填,签名,见附录1
  7. jsApiList: ["checkJsApi", "onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ", "onMenuShareQZone"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
  8. });
  9.  
  10. wx.ready(function () {
  11. document.querySelector('#checkJsApi').onclick = function () {
  12. wx.checkJsApi({
  13. jsApiList: [
  14. 'getNetworkType',
  15. 'previewImage'
  16. ],
  17. success: function (res) {
  18. alert(JSON.stringify(res));
  19. }
  20. });
  21. };
  22.     //朋友圈
  23. wx.onMenuShareTimeline({
  24. title: '暖木科技', // 分享标题
  25. link: 'http://www.warmwood.com/home/lampindex', // 分享链接
  26. imgUrl: 'http://www.warmwood.com/images/s1.jpg',
  27. success: function (res) {
  28. alert('已分享');
  29. },
  30. cancel: function (res) {
  31. alert('已取消');
  32. },
  33. fail: function (res) {
  34. alert(JSON.stringify(res));
  35. }
  36. });
  37. //朋友
  38. wx.onMenuShareAppMessage({
  39. title: '暖木科技', // 分享标题
  40. desc: '宝宝的睡眠很重要,你的睡眠也很重要', // 分享描述
  41. link: 'http://www.warmwood.com/home/lampindex', // 分享链接
  42. imgUrl: 'http://www.warmwood.com/images/s1.jpg', // 分享图标
  43. type: '', // 分享类型,music、video或link,不填默认为link
  44. dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
  45. success: function () {
  46. // 用户确认分享后执行的回调函数
  47. alert("分享");
  48. },
  49. cancel: function () {
  50. // 用户取消分享后执行的回调函数
  51. alert("取消分享");
  52. }
  53. });
  54. });

然后剩下就是后端的事情了。后端的关键是获取access_token和jsapi_ticket以及生成正确的签名。另外如果要统计分享的数量,最好就是在success方法中进行统计了。

三、生成签名

1.access_token

获取access_token方法全平台都是一致的。

  1. public const string AccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
  1. public TokenResult GetAccessToken()
  2. {
  3. var url = string.Format(WxDeviceConfig.AccessTokenUrl, WxDeviceConfig.AppId, WxDeviceConfig.APPSECRET);
  4. var res = SendHelp.Send<TokenResult>(null, url, null, CommonJsonSendType.GET);
  5. return res;
  6. }

access_token的超时时间是7200秒,所以先可以缓存起来。SendHelp文章末尾可下载

2.获取jsapi_ticket

access_token的作用就是为了获取jsapi_ticket。用get方式获取,url:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi,返回的JSON对象如下。

  1. {
  2. "errcode":0,
  3. "errmsg":"ok",
  4. "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
  5. "expires_in":7200
  6. }

所以可以定义一个模型:

  1. public class jsapiTicketModel
  2. {
  3. public string errcode { get; set; }
  4. public string errmsg { get; set; }
  5.  
  6. public string ticket { get; set; }
  7.  
  8. public string expires_in { get; set; }
  9. }

再完成获取ticket的方法:

  1. public jsapiTicketModel GetJsApiTicket(string accessToken)
  2. {
  3. var url = string.Format(WxPayConfig.Jsapi_ticketUrl, accessToken);
  4. return SendHelp.Send<jsapiTicketModel>(accessToken, url, "", CommonJsonSendType.GET);
  5. }

ticket过期时间也是7200秒,并且不能频繁的请求,所以也需要再服务端缓存起来。

  1. private void setCacheTicket(string cache)
  2. {
  3. _cacheManager.Set(tokenKey, cache, 7200);
  4. }

MemoryCacheManager:

3.签名

终于到这一步了,然后你在文档中看到让你失望的一幕:

么有C#的demo,支付那边都提供了,为啥jssdk没有提供,好吧先不吐槽了。官方也说明白签名的规则。一开始我使用的是https://github.com/night-king/weixinSDK中的签名:

  1. public static string Sha1(string orgStr, string encode = "UTF-8")
  2. {
  3. var sha1 = new SHA1Managed();
  4. var sha1bytes = System.Text.Encoding.GetEncoding(encode).GetBytes(orgStr);
  5. byte[] resultHash = sha1.ComputeHash(sha1bytes);
  6. string sha1String = BitConverter.ToString(resultHash).ToLower();
  7. sha1String = sha1String.Replace("-", "");
  8. return sha1String;
  9. }//错误示例

得出的结果和官方校验的不一致,一直提示签名错误。

正确的写法是:

  1. public static string Sha1(string orgStr, Encoding encode)
  2. {
  3. SHA1 sha1 = new SHA1CryptoServiceProvider();
  4. byte[] bytes_in = encode.GetBytes(orgStr);
  5. byte[] bytes_out = sha1.ComputeHash(bytes_in);
  6. sha1.Dispose();
  7. string result = BitConverter.ToString(bytes_out);
  8. result = result.Replace("-", "");
  9. return result;
  10. }

和官方校验的结果一直后,就ok了(忽略大小写)。另外一个需要注意的地方是签名中的url。如果页面有参数,model中的url也需要带参数,#号后面的不要。不然也是会报签名错误。

  1. public ActionResult H5Share()
  2. {
  3. var model = new WXShareModel();
  4. model.appId = WxPayConfig.APPID;
  5. model.nonceStr = WxPayApi.GenerateNonceStr();
  6. model.timestamp = Util.CreateTimestamp();
  7. model.ticket = GetTicket();
  8. model.url = "http://www.warmwood.com/AuthWeiXin/share";// domain + Request.Url.PathAndQuery;
  9. model.MakeSign();
  10. Logger.Debug("获取到ticket:" + model.ticket);
  11. Logger.Debug("获取到签名:" + model.signature);
  12. return View(model);
  13. }

四、小结

wx.config中的debug为true会alert各种操作结果。参数正确之后界面会提示:

至此,分享的功能就ok了。也就打开了调用其他jssdk的大门。另外文中的SendHelp对象是用的Senparc(基于.net4.5)的dll。

参考资料:

签名校验:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

官方文档:https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

【微信开发】【Asp.net MVC】-- 微信分享功能的更多相关文章

  1. c#微信开发,使用JS-SDK自定义分享功能,分享朋友圈,分享给朋友等

    如果一个后端开发掌握了微信开发,甚至有微信开发上线项目,这在换工作的时候 还是有竞争力的. 微信开发的资料很多,但是用asp.net c#进行微信开发好像比较少,或者资料不够完整. 使用JS-SDK自 ...

  2. C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  3. C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  4. ASP.NET MVC 微信公共平台开发之获取用户消息并处理

    ASP.NET MVC 微信公共平台开发 获取用户消息并处理 获取用户消息 用户发送的消息是在微信服务器发送的一个HTTP POST请求中包含的,获取用户发送的消息要从POST请求的数据流中获取 微信 ...

  5. ASP.NET MVC 微信公共平台开发之验证消息的真实性

    ASP.NET MVC 微信公共平台开发 验证消息的真实性 在MVC Controller所在项目中添加过滤器,在过滤器中重写 public override void OnActionExecuti ...

  6. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

  7. 【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付           今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...

  8. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  9. ASP.NET MVC 微信JS-SDK认证

    layout: post title: ASP.NET MVC 微信JS-SDK认证 category: .net date: 2016-11-01 00:00:00 tags: .net javas ...

  10. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

随机推荐

  1. jquery+html三级联动下拉框

    jquery+html三级联动下拉框及详情页面加载时的select初始化问题   html写的三个下拉框,如下: <select name="ddlQYWZYJ" id=&q ...

  2. 在vi中使用perltidy格式化perl代码

    格式优美的perl代码不但让人赏心悦目,并且能够方便阅读. perltidy的是sourceforge的一个小项目,在我们写完乱七八糟的代码后,他能像变魔术一样把代码整理得漂美丽亮,快来体验一下吧!! ...

  3. NET Socket服务编程

    smark https://github.com/IKende/ .NET Socket服务编程之-高效连接接入编 在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务 ...

  4. Error with mysqld_safe

    出处:http://bugs.mysql.com/bug.php?id=18403 Description: - I downloaded the binary file “Standard 5.0. ...

  5. Android 使用Gson解析json案例具体解释

    一.眼下解析json有三种工具:org.json(Java经常使用的解析),fastjson(阿里巴巴project师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:h ...

  6. Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception

    最近rails3.2在更改数据库表字段,然后要回滚取消,但在运行rake db:rollback命令,错误: rake aborted! An error has occurred, all late ...

  7. 使用UDL文件来测试SQL Server数据库连接

    原文 来自http://www.2cto.com/database/201308/234427.html 使用UDL测试SQL Server连接问题   做数据库经常会遇到SQL Server连接的问 ...

  8. Just a complaint about the college examinations

    Well , you know. As a college student who want to find a good job after graduating  like me , scores ...

  9. SQL计算年代差

    1.用datediff函数 select datediff(yyyy,StuBirthday,getdate())>17 2.用year函数 select (year(getdate()-yea ...

  10. Binder机制,从Java到C (2. IPC in System Service :AMS)

    1.建立Activity和Service的IPC之前 在上一篇 Binder机制,从Java到C (1. IPC in Application Remote Service)  里面有说到Activi ...