热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Asp.netMVC微信开发——微信分享接口

当你的网站链接在微信内打开时,我们有时候会将这个链接分享给朋友或者分享到朋友圈如果接入了微信分享的接口,就会如下图B的形式呈现,如果没有接入,则会以A的形式呈现我们当然会希望以B的

当你的网站链接在微信内打开时,我们有时候会将这个链接分享给朋友或者分享到朋友圈

如果接入了微信分享的接口,就会如下图B的形式呈现,如果没有接入,则会以A的形式呈现

《Asp.net MVC微信开发——微信分享接口》

我们当然会希望以B的形式呈现,不仅好看而且显得专业。这篇内容为大家分享一下我怎样接入微信分享的接口。

第一步,准备工作

你需要注册好一个公众号且认证通过,得到属于自己的AppID和AppSecret配置好JS接口的安全域名

第二步,在你想要分享的页面的控制程序中配置Wx.config的信息

上代码,代码中有很详细的注释

using System;
using System.Collections.Generic;
using System.Web.Mvc;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Net;
using System.Web.Security;
using System.Text;
using System.Security.Cryptography;
namespace XunYouWeb.Controllers
{
//wx.config数据实体类
public class WXShareModel
{
public string appId { get; set; }
public string nonceStr { get; set; }
public string timestamp { get; set; }
public string signature { get; set; }
public string ticket { get; set; }
public string url { get; set; }
public void MakeSign()
{
var string1Builder = new StringBuilder();
string1Builder.Append("jsapi_ticket=").Append(ticket).Append("&")
.Append("nOncestr=").Append(nonceStr).Append("&")
.Append("timestamp=").Append(timestamp).Append("&")
.Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
var string1 = string1Builder.ToString();
signature = Sha1(string1, Encoding.Default);//GetSwcSH1(string1);
}
public static string Sha1(string orgStr, Encoding encode)
{
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] bytes_in = encode.GetBytes(orgStr);
byte[] bytes_out = sha1.ComputeHash(bytes_in);
sha1.Dispose();
string result = BitConverter.ToString(bytes_out);
result = result.Replace("-", "");
return result;
}
}
//Jsapiticket实体类
public class Jsapiticket
{
public string ticket { get; set; }
public DateTime expires_in { get; set; }
}
public class WechatController : BaseController
{
public static readonly string appid =System.Web.Configuration.WebConfigurationManager.AppSettings["AppId"];
public static string _ticket = "";
public static DateTime lastTimestamp;
//我的内容页,也是我想要分享出去的页面
public ActionResult wcpcdetail()
{
string ticket ="";
Jsapiticket ticketModel = new Jsapiticket();
if (System.Web.HttpContext.Current.Application["jsapiTicket"] != null)
{
ticketModel = System.Web.HttpContext.Current.Application["jsapiTicket"] as Jsapiticket; //取缓存的ticket
}
else
{
System.Web.HttpContext.Current.Application["jsapiTicket"] = ticketModel; //存一个空的ticket
}
if (string.IsNullOrEmpty(ticketModel.ticket) || lastTimestamp == null || (lastTimestamp - DateTime.Now).Milliseconds >= 7200) //验证是否过期
{
ticket = Helper.Comm.HttpPost2(ip + "/api/Index/CreateTicket", null); //获取API接口中生成的ticket
ticket = ticket.Trim('"');
lastTimestamp = DateTime.Now;
if (string.IsNullOrEmpty(ticket))
{
return Json(new { issuccess = false, error = "获取ticket失败" });
}
SaveTicket(ticket);
}
else
{
ticket = ticketModel.ticket;
}
var model = new WXShareModel();
model.appId = appid;
model.nOnceStr= CreateNonceStr();
model.timestamp = GetTimeStamp();
model.ticket = ticket;
model.url = Request.Url.AbsoluteUri.Split('#')[0];
model.MakeSign();
return View(model); //把数据model返回到页面
}
//缓存获取到的jsapiticket (access_token和jsapiticket都是有7200秒的过期时间, 并且每天生成的次数有限制,所以必须缓存)
//这里我只缓存ticket,如果ticket过期了,access_token也重新生成
public static void SaveTicket(string ticket)
{
var jsapiTicket = new Jsapiticket();
jsapiTicket.ticket = ticket;
jsapiTicket.expires_in = DateTime.Now;
//存储
System.Web.HttpContext.Current.Application["jsapiTicket"] = jsapiTicket;
}
//生成nonceStr,微信需要这个字段来保证生成signature的唯一性
private string CreateNonceStr(int length = 16)
{
string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
string str = "";
for (int i = 0; i {
Random v = new Random(Guid.NewGuid().GetHashCode()); //加入随机数种子,保证循环出的是不一样的值
int index = v.Next(chars.Length);
str += chars.Substring(index, 1);
}
return str;
}
//返回需要的时间戳
private static string GetTimeStamp()
{
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
}
}

 

第三步,在API中生成access_token和jsapiticket

ps:我的项目考虑到多平台的使用,所以用到了API接口,也可以不用,方法基本是一致的,只需要把appid和secret换成你自己的就好

上代码

using System;
using System.Data.Entity;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using Helper;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using System.Net.Http;
using System.IO;
namespace WebApi.Controllers
{
#region 自定义实体类
public class WechatModels
{
public string access_token { get; set; }
public string expires_in { get; set; }
}
public class TicketModel
{
public int errcode { get; set; }
public string errmsg { get; set; }
public string ticket { get; set; }
public int expires_in { get; set; }
}
#endregion
public class IndexController : ApiController
{
///


/// 获取ticket
///

///
[HttpPost]
public IHttpActionResult CreateTicket(dynamic data)
{
//get accesstoken
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=******&secret=******");
var wm = new System.Net.Http.HttpClient().GetAsync(url).Result.Content.ReadAsStringAsync().Result;
WechatModels info = JsonConvert.DeserializeObject(wm);
//get ticket
string turl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", info.access_token);
var tickets = new System.Net.Http.HttpClient().GetAsync(turl).Result.Content.ReadAsStringAsync().Result;
TicketModel tinfo = JsonConvert.DeserializeObject(tickets);
return Json(tinfo.ticket.Trim('"'));
}
}
}

最后一步,前台视图页面

@{
Layout = "~/Views/Shared/_Layout.cshtml";
}


title




content


至此就完成了所有的工作!测试成功!

《Asp.net MVC微信开发——微信分享接口》

 

需要注意的点:

1.分享测试都需要放在服务器上才能成功,也可以使用微信官方提供的微信开发者工具

2.一开始测试的时候开启debug模式,每次打开页面都会弹出消息,通过弹出消息判断问题

3.微信公众平台的运维中心中有一个日志查询,可以查询自己的接口被调用的情况,配合查找问题

4.微信提供了接口签名校验工具 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

5.开发的时候肯定无数次看到“nvalid signature”这个报错,冷静下来,一步步的排查才能最终解决

 

希望这篇案例对大家有帮助!


推荐阅读
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 工作用可能会用到会话分组:Message是消息实体对象,里面有toId和fromId指明接收方ID和发送方Id,通过组合形式“12-22-”为map的key其中Mess ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • TableAPI报一下异常:FieldtypesofqueryresultandregisteredTableSink
    报错信息如下:Exceptioninthread“main”org.apache.flink.table.api.ValidationException:Fieldtypesofq ... [详细]
  • Python——Pandas 时间序列数据处理
    介绍Pandas是非常著名的开源数据处理库,我们可以通过它完成对数据集进行快速读取、转换、过滤、分析等一系列操作。同样,Pandas已经被证明为是非常强大的用于处理时间序列数据的工 ... [详细]
  • 微信登录(网站应用)ASP.NET第一步:请求CODE.第二步:通过CODE获取access_token.第三步:通过access_token调用接 ... [详细]
  • 起因由于我录制过一个小程序的课程,里面有消息模板的讲解。最近有几位同学反馈官方要取消消息模板,使用订阅消息。为了方便大家容易学 PythonFlask构建微信小程序订餐系统 课程。 ... [详细]
author-avatar
无为南子_274
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有