热门标签 | 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”这个报错,冷静下来,一步步的排查才能最终解决

 

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


推荐阅读
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • andr ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 本文探讨了在使用Azure Active Directory进行用户身份验证时,结合AddAuthentication和RequireAuthenticatedUser的必要性及其潜在冗余问题。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • 深入理解ASP.NET MVC中的_ViewStart.cshtml
    本文介绍了_ViewStart.cshtml文件在ASP.NET MVC 3.0及以上版本中的作用和使用方法。该文件位于Views目录下,主要用于统一配置视图布局和其他全局设置。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
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社区 版权所有