前期的准备工作可以去上网查一下,网上介绍的很详细。
大概就是需要微信服务号一个,并且已经通过了实名认证。
用于得到Appid和AppSecret以及设置JS接口安全域名。
这里就不详细介绍了。
需要修改的地方有两处:
① protected string WeiXinAppId = “此次填写你的Appid”;
② protected string WeiXinAppSecret = “此次填写你的AppSecret”;
代码如下:
后台cs部分:
//可能要引用的命名空间
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using System.Text;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Runtime.Serialization.Json
using System.IO;
using System.Net;
using System.Web.Security;
// 接口文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
#region 字段
private string _WeiXinAccessToken = ""; // 微信访问凭证 AccessToken
private string _WeiXinJsapiTicket = ""; // Jsapi 的访问凭证 Ticket
private string _Timestamp = null; // 签名的时间戳
private string _Noncestr = null; // 签名的随机串
private string _Signature = ""; // 签名
// js显示的内容
protected string WeiXinAppId = "此次填写你的Appid";
protected string WeiXinAppSecret = "此次填写你的AppSecret";
protected string JsTitle = "此次填写你的标题"; // 分享标题
protected string JsDesc = "此次填写你的描述"; // 分享描述
protected string JsLink // 分享链接
{
get
{
return Request.Url.ToString();
}
}
// 图片大小要大于300pix才能显示
protected string JsImgUrl = "此次填写你的图片链接"; // 分享图标
#endregion
#region 属性
/// <summary>
/// 签名的时间戳
/// </summary>
protected string Timestamp
{
get
{
if (string.IsNullOrEmpty(_Timestamp))
_Timestamp = GetTimestamp();
return _Timestamp;
}
}
/// <summary>
/// 签名的随机串
/// </summary>
protected string Noncestr
{
get
{
if (string.IsNullOrEmpty(_Noncestr))
_Noncestr = CreateNoncestr();
return _Noncestr;
}
}
/// <summary>
/// 签名
/// </summary>
protected string Signature
{
get
{
if (string.IsNullOrEmpty(_Signature))
{
if (string.IsNullOrEmpty(_WeiXinAccessToken))
GetWeiXinAccessToken();
if (!string.IsNullOrEmpty(_WeiXinAccessToken) && string.IsNullOrEmpty(_WeiXinJsapiTicket))
GetWeiXinJsapiTicket(_WeiXinAccessToken);
if (!string.IsNullOrEmpty(_WeiXinJsapiTicket))
_Signature = GetSignature(_WeiXinJsapiTicket, Noncestr, Timestamp, JsLink);
}
return _Signature;
}
}
#endregion
#region 第一步:Get方式 获取 access_token
/// <summary>
/// 第一步:Get方式 获取 access_token
/// </summary>
/// <returns></returns>
private void GetWeiXinAccessToken()
{
#region Get 方式获取 access_token
string getUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + WeiXinAppId + "&secret=" + WeiXinAppSecret;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(getUrl);
req.Method = "GET";
HttpWebResponse res = null;
Stream st = null;
StreamReader sr = null;
string html = string.Empty;
try
{
res = (HttpWebResponse)req.GetResponse();
st = res.GetResponseStream();
sr = new StreamReader(st, System.Text.Encoding.UTF8);
Console.WriteLine(sr.CurrentEncoding);
html = sr.ReadToEnd();
}
catch (IOException ex)
{
JsMsgBox.Show(this, ex.Message);
_WeiXinAccessToken = "";
}
// 解析内容
try
{
// 反序列化
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeiXinButtonToken));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(html));
WeiXinButtonToken tokenMsg = (WeiXinButtonToken)ser.ReadObject(ms);
_WeiXinAccessToken = tokenMsg.access_token;
}
catch
{
// 反序列化
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeiXinButtonError));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(html));
WeiXinButtonError errrorMsg = (WeiXinButtonError)ser.ReadObject(ms);
JsMsgBox.Show(this, errrorMsg.errcode + ":" + errrorMsg.errmsg);
_WeiXinAccessToken = "";
}
#endregion
Application["WeiXinAccessToken"] = _WeiXinAccessToken;
}
#endregion
#region 第二步:Get方式 获取 jsapi_ticket
/// <summary>
/// 第二步:Get方式 获取 jsapi_ticket
/// </summary>
/// <returns></returns>
private void GetWeiXinJsapiTicket(string accessToken)
{
#region Get 方式获取 jsapi_ticket
string getUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(getUrl);
req.Method = "GET";
HttpWebResponse res = null;
Stream st = null;
StreamReader sr = null;
string html = string.Empty;
try
{
res = (HttpWebResponse)req.GetResponse();
st = res.GetResponseStream();
sr = new StreamReader(st, System.Text.Encoding.UTF8);
Console.WriteLine(sr.CurrentEncoding);
html = sr.ReadToEnd();
}
catch (IOException ex)
{
JsMsgBox.Show(this, ex.Message);
_WeiXinJsapiTicket = "";
}
// 解析内容
try
{
// 反序列化
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeiXinJsapiToken));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(html));
WeiXinJsapiToken tokenMsg = (WeiXinJsapiToken)ser.ReadObject(ms);
_WeiXinJsapiTicket = tokenMsg.ticket;
}
catch
{
}
#endregion
Application["WeiXinJsapiTicket"] = _WeiXinJsapiTicket;
}
#endregion
#region 第三步:获取 签名
/// <summary>
/// 第三步:获取 签名
/// </summary>
/// <param name="jsapi_ticket"></param>
/// <param name="noncestr">生成签名的随机串</param>
/// <param name="timestamp">生成签名的时间戳</param>
/// <param name="url"></param>
/// <returns></returns>
private string GetSignature(string jsapi_ticket, string noncestr, string timestamp, string url)
{
string tmpStr = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url;
return FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
}
#endregion
#region 其它函数
/// <summary>
/// 生成签名的时间戳
/// </summary>
/// <returns></returns>
private string GetTimestamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
/// <summary>
/// 生成签名的随机串
/// </summary>
/// <returns></returns>
private static String CreateNoncestr()
{
String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String res = "";
Random rd = new Random();
for (int i = 0; i < 16; i++)
{
res += chars[rd.Next(chars.Length - 1)];
}
return res;
}
#endregion
//引用
public class JsMsgBox
{
/// <summary>
/// 显示消息提示对话框
/// </summary>
/// <param name="page">当前页面指针,一般为this</param>
/// <param name="msg">提示信息</param>
public static void Show(Page page, string msg)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>alert('" + msg.ToString() + "');</script>");
}
/// <summary>
/// 控件点击 消息确认提示框
/// </summary>
/// <param name="page">当前页面指针,一般为this</param>
/// <param name="msg">提示信息</param>
public static void ShowConfirm(WebControl Control, string msg)
{
Control.Attributes.Add("onclick", "return confirm('" + msg + "');");
}
/// <summary>
/// 显示消息提示对话框,并进行页面跳转
/// </summary>
/// <param name="page">当前页面指针,一般为this</param>
/// <param name="msg">提示信息</param>
/// <param name="url">跳转的目标URL</param>
public static void ShowAndRedirect(Page page, string msg, string url)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>alert('" + msg + "');window.location=\"" + url + "\"</script>");
}
/// <summary>
/// 显示消息提示对话框,并进行页面跳转
/// </summary>
/// <param name="page">当前页面指针,一般为this</param>
/// <param name="msg">提示信息</param>
/// <param name="url">跳转的目标URL</param>
public static void ShowAndRedirects(Page page, string msg, string url)
{
StringBuilder Builder = new StringBuilder();
Builder.Append("<script language='javascript' defer>");
Builder.AppendFormat("alert('{0}');", msg);
Builder.AppendFormat("top.location.href='{0}'", url);
Builder.Append("</script>");
page.ClientScript.RegisterStartupScript(page.GetType(), "message", Builder.ToString());
}
/// <summary>
/// 输出自定义脚本信息
/// </summary>
/// <param name="page">当前页面指针,一般为this</param>
/// <param name="script">输出脚本</param>
public static void ResponseScript(Page page, string script)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>" + script + "</script>");
}
#region 扩展 Js alert插件
/// <summary>
/// Js alert()消息框
/// 使用时:当期页 一定要引入:layer.js
/// </summary>
/// <param name="page"></param>
/// <param name="msg"></param>
public static void ShowMsg(Page page, string msg)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>layer.msg('" + msg.ToString() + "',{icon: 6});</script>");
}
/// <summary>
/// 提示
/// </summary>
/// <param name="page"></param>
/// <param name="msg"></param>
public static void ShowTooMsg(Page page, string msg)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>layer.msg('" + msg.ToString() + "',{icon: 6});</script>");
}
public static void ShowAndRedirectMsg(Page page, string msg, string url)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>layer.msg('" + msg + "',{icon: 6});window.location=\"" + url + "\"</script>");
}
#endregion
public static void ShowLogin(Page page)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>$(function(){liSaveSeta()})</script>");
}
}
// {"errcode":0,"errmsg":"ok"}
public class WeiXinButtonError
{
public int errcode { get; set; }
public string errmsg { get; set; }
}
// {"access_token":"ACCESS_TOKEN","expires_in":7200}
public class WeiXinButtonToken
{
public string access_token { get; set; }
public int expires_in { get; set; }
}
// {"errcode":0,"errmsg":"ok","ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA","expires_in":7200}
public class WeiXinJsapiToken
{
public int errcode { get; set; }
public string errmsg { get; set; }
public string ticket { get; set; }
public int expires_in { get; set; }
}
前端JS部分
<script type="text/javascript">
wx.config({
debug: false, <% /* 开启调试模式,调用的所有api的返回值会在客户端alert出来 */ %>
appId: '<%=WeiXinAppId %>', <% /* 必填,公众号的唯一标识 */ %>
timestamp: <%=Timestamp %>, <% /* 必填,生成签名的时间戳 */ %>
nonceStr: '<%=Noncestr %>', <% /* 必填,生成签名的随机串 */ %>
signature: '<%=Signature %>', <% /* 必填,签名 */ %>
jsApiList: [ <% /* 必填,需要使用的JS接口列表 */ %>
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo'
]
});
</script>
<script type="text/javascript">
wx.ready(function () {
<% /* 以下方法 必须先config成功,然后在wx.ready里才能调用 */ %>
<% /* 注意:以下配置要全部都没错的情况下,才会运行正常,比如图片找不到,就不会显示任何信息 */ %>
<% /* 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 */ %>
wx.onMenuShareTimeline({
title: '<%=JsTitle %>',
link: '<%=JsLink %>',
imgUrl: '<%=JsImgUrl %>',
success: function () {
alert("用户确认分享后执行的回调函数");
},
cancel: function () {
alert("用户取消分享后执行的回调函数");
}
});
<% /* 获取“分享给朋友”按钮点击状态及自定义分享内容接口 */ %>
wx.onMenuShareAppMessage({
title: '<%=JsTitle %>',
desc: '<%=JsDesc %>',
link: '<%=JsLink %>',
imgUrl: '<%=JsImgUrl %>',
type: '', <% /* 分享类型,music、video或link,不填默认为link */ %>
dataUrl: '', <% /* 如果type是music或video,则要提供数据链接,默认为空 */ %>
success: function () {
alert("用户确认分享后执行的回调函数");
},
cancel: function () {
alert("用户取消分享后执行的回调函数");
}
});
<% /* 获取“分享到QQ”按钮点击状态及自定义分享内容接口 */ %>
wx.onMenuShareQQ({
title: '<%=JsTitle %>',
desc: '<%=JsDesc %>',
link: '<%=JsLink %>',
imgUrl: '<%=JsImgUrl %>',
success: function () {
alert("用户确认分享后执行的回调函数");
},
cancel: function () {
alert("用户取消分享后执行的回调函数");
}
});
<% /* 获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 */ %>
wx.onMenuShareWeibo({
title: '<%=JsTitle %>',
desc: '<%=JsDesc %>',
link: '<%=JsLink %>',
imgUrl: '<%=JsImgUrl %>',
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
// alert("config信息验证成功!");
});
</script>