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

 

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


推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • Ext JS MVC系列一:环境搭建与框架概览
    本文主要介绍了如何在项目中使用Ext JS 4作为前端框架,并详细讲解了Ext JS 4的MVC开发模式。文章将从项目目录结构、相关CSS和JS文件的引用以及MVC框架的整体认识三个方面进行总结。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
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社区 版权所有