前端Js引用:

  <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">
var data = '<%=JsApiirray %>';
data = eval("(" + data + ")");//实例化
wxconfig(data);
</script>
<script>
function wxconfig(data) {
wx.config({
// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
debug: false,
// 必填,公众号的唯一标识
appId: data.appId,
// 必填,生成签名的时间戳
timestamp: data.timestamp,
// 必填,生成签名的随机串
nonceStr: data.nonceStr,
// 必填,签名
signature: data.signature,
// 必填,需要使用的JS接口列表
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo'
]
});
}
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
wx.ready(function () {
wx.checkJsApi({
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo'
]
});
var title = "上海长宽神游戏“神龟不掉线”,千万别小看它!";
var des = "我玩过了上海长宽的游戏神作“神龟不掉线”,真的比想象中更难,你快来试试并领取电影红包吧!";
wx.onMenuShareTimeline({
title: title, //分享标题
link: 'http://m.gwbnsh.net.cn/sgbdx/', //分享链接
desc: des, //分享描述
imgUrl: 'http://m.gwbnsh.net.cn/sgbdx/img/logo.png',//分享图片地址
trigger: function (res) {
//alert('用户点击分享到朋友圈');
},
success: function (res) {
$.ajax({
type: "POST",
url: "User.ashx", //处理页的相对地址
data: { isshare: 1 },
async: true,
success: function (data) {
location = "http://m.maizuo.com/act/lucky-package/?__locate=false#!/active/NUxySmNbvQFF";
}
});
},
cancel: function (res) {
//alert('已取消');
}
});
wx.onMenuShareAppMessage({
title: title, //分享标题
link: 'http://m.gwbnsh.net.cn/sgbdx/', //分享链接
desc: des, //分享描述
imgUrl: 'http://m.gwbnsh.net.cn/sgbdx/img/logo.png',//分享图片地址
trigger: function (res) {
//alert('用户点击分享到朋友圈');
},
success: function (res) {
$.ajax({
type: "POST",
url: "User.ashx", //处理页的相对地址
data: { isshare: 1 },
async: true,
success: function (data) {
location = "http://m.maizuo.com/act/lucky-package/?__locate=false#!/active/NUxySmNbvQFF";
}
});
},
cancel: function (res) {
//alert('已取消');
}
});
wx.onMenuShareQQ({
title: title, //分享标题
link: 'http://m.gwbnsh.net.cn/sgbdx/', //分享链接
desc: des, //分享描述
imgUrl: 'http://m.gwbnsh.net.cn/sgbdx/img/logo.png',//分享图片地址
trigger: function (res) {
//alert('用户点击分享到朋友圈');
},
success: function (res) {
$.ajax({
type: "POST",
url: "User.ashx", //处理页的相对地址
data: { isshare: 1 },
async: true,
success: function (data) {
location = "http://m.maizuo.com/act/lucky-package/?__locate=false#!/active/NUxySmNbvQFF";
}
});
},
cancel: function (res) {
//alert('已取消');
}
});
wx.onMenuShareQZone({
title: title, //分享标题
link: 'http://m.gwbnsh.net.cn/sgbdx/', //分享链接
desc: des, //分享描述
imgUrl: 'http://m.gwbnsh.net.cn/sgbdx/img/logo.png',//分享图片地址
trigger: function (res) {
//alert('用户点击分享到朋友圈');
},
success: function (res) {
$.ajax({
type: "POST",
url: "User.ashx", //处理页的相对地址
data: { isshare: 1 },
async: true,
success: function (data) {
location = "http://m.maizuo.com/act/lucky-package/?__locate=false#!/active/NUxySmNbvQFF";
}
});
},
cancel: function (res) {
//alert('已取消');
}
});
wx.error(function (res) {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
alert("errorMSG:" + res);
});
});
</script>

或者

 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">
var data = '<%=JsApiirray %>';
data = eval("(" + data + ")");//实例化
wxconfig(data);
</script>
<script>
function wxconfig(data) {
wx.config({
// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
debug: false,
// 必填,公众号的唯一标识
appId: data.appId,
// 必填,生成签名的时间戳
timestamp: data.timestamp,
// 必填,生成签名的随机串
nonceStr: data.nonceStr,
// 必填,签名
signature: data.signature,
// 必填,需要使用的JS接口列表
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo'
]
});
}
/*
* 注意:
* 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
* 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
* 3. 完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/1c97470084b73f8e224fe6d9bab1625b.html
* 如有问题请通过以下渠道反馈:
* 邮箱地址:weixin-open@qq.com
* 邮件主题:【微信JS-SDK反馈】具体问题
* 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。
*config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
*/
wx.ready(function () {
wx.checkJsApi({
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo'
],
success: function (res) {
alert(JSON.stringify(res));
}
});
var shareData = {
title: '标题',
desc: '描述',
link: '链接',
imgUrl: '图片',
trigger: function (res) {
alert('用户点击发送给朋友');
},
success: function (res) {
alert('已分享');
},
cancel: function (res) {
alert('已取消');
},
fail: function (res) {
alert(JSON.stringify(res));
}
};
wx.onMenuShareAppMessage(shareData);
wx.onMenuShareTimeline(shareData);
wx.onMenuShareQQ(shareData);
wx.onMenuShareWeibo(shareData);
});
wx.error(function (res) {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
alert("errorMSG:" + res);
});
</script>

验证JsAPI权限配置:

 #region 验证JsApi权限配置
/// <summary>
/// 获取JsApi权限配置的数组/四个参数
/// </summary>
/// <returns></returns>
public string GetJsApiInfo(string Appid, string Appsecret)
{
string timestamp = CommonMethod.ConvertDateTimeInt(DateTime.Now).ToString();//生成签名的时间戳
string nonceStr = CommonMethod.GetRandCode();//生成签名的随机串
string url = System.Web.HttpContext.Current.Request.Url.AbsoluteUri.ToString();//当前的地址
string jsapi_ticket = "";
//ticket 缓存7200秒
if (System.Web.HttpContext.Current.Session["jsapi_ticket"] == null)
{
jsapi_ticket = CommonMethod.WebRequestPostOrGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + BasicApi.GetTokenSession(Appid, Appsecret) + "&type=jsapi", "");
System.Web.HttpContext.Current.Session["jsapi_ticket"] = jsapi_ticket;
System.Web.HttpContext.Current.Session.Timeout = ;
}
else
{
jsapi_ticket = System.Web.HttpContext.Current.Session["jsapi_ticket"].ToString();
}
Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(jsapi_ticket);
jsapi_ticket = respDic["ticket"].ToString();//获取ticket
string[] ArrayList = { "jsapi_ticket=" + jsapi_ticket, "timestamp=" + timestamp, "noncestr=" + nonceStr, "url=" + url };
Array.Sort(ArrayList);
string signature = string.Join("&", ArrayList);
signature = Md5Hash(signature).ToLower();
return "{\"appId\":\"" + Appid + "\", \"timestamp\":" + timestamp + ",\"nonceStr\":\"" + nonceStr + "\",\"signature\":\"" + signature + "\"}";
}
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private string Md5Hash(string input)
{
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
StringBuilder sBuilder = new StringBuilder();
for (int i = ; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
} #endregion

基础接口BasicApi.cs:

 using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
namespace Web
{// <summary>
/// 基础接口
/// </summary>
public class BasicApi
{
public static string SessionAccessToken = "";//access_token缓存 其他接口的通行证 public BasicApi() { } #region 获取access_token缓存
public static string GetTokenSession(string AppID, string AppSecret)
{
string TokenSession = ""; if (System.Web.HttpContext.Current.Session[SessionAccessToken] == null)
{
TokenSession = AddTokenSession(AppID, AppSecret);
}
else
{
TokenSession = System.Web.HttpContext.Current.Session[SessionAccessToken].ToString();
} return TokenSession;
}
/// <summary>
/// 添加AccessToken缓存
/// </summary>
/// <param name="AppID"></param>
/// <param name="AppSecret"></param>
/// <returns></returns>
public static string AddTokenSession(string AppID, string AppSecret)
{
//获取AccessToken
string AccessToken = GetAccessToken(AppID, AppSecret);
HttpContext.Current.Session[SessionAccessToken] = AccessToken;
HttpContext.Current.Session.Timeout = ;
return AccessToken;
} /// <summary>
/// 获取AccessToken
/// </summary>
/// <param name="AppID"></param>
/// <param name="AppSecret"></param>
/// <returns></returns>
public static string GetAccessToken(string AppID, string AppSecret)
{
JavaScriptSerializer Jss = new JavaScriptSerializer();
string respText = CommonMethod.WebRequestPostOrGet(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", AppID, AppSecret), "");
Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(respText);
string accessToken = respDic["access_token"].ToString();
return accessToken;
}
/// <summary>
/// 用code换取获取用户信息(包括非关注用户的)
/// </summary>
/// <param name="openid"></param>
/// <param name="access_token"></param>
/// <returns></returns>
public static JObject GetUserInfo(string openid, string access_token)
{
JavaScriptSerializer Jss = new JavaScriptSerializer();
string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", access_token, openid);
WebClient wc = new WebClient();
byte[] bytes = wc.DownloadData(url);
wc.Encoding = Encoding.UTF8;
string jsonText = Encoding.UTF8.GetString(bytes);
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
return jo;
}
#endregion
}
}

通用方法CommonMethod.cs:

 using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web; namespace Web
{
/// <summary>
/// 通用方法类
/// </summary>
public class CommonMethod
{
#region Post/Get提交调用抓取
/// <summary>
/// Post/get 提交调用抓取
/// </summary>
/// <param name="url">提交地址</param>
/// <param name="param">参数</param>
/// <returns>string</returns>
public static string WebRequestPostOrGet(string sUrl, string sParam)
{
byte[] bt = System.Text.Encoding.UTF8.GetBytes(sParam); Uri uriurl = new Uri(sUrl);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uriurl);//HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + (url.IndexOf("?") > -1 ? "" : "?") + param);
req.Method = "Post";
req.Timeout = * ;
req.ContentType = "application/x-www-form-urlencoded;";
req.ContentLength = bt.Length; using (Stream reqStream = req.GetRequestStream())//using 使用可以释放using段内的内存
{
reqStream.Write(bt, , bt.Length);
reqStream.Flush();
}
try
{
using (WebResponse res = req.GetResponse())
{
//在这里对接收到的页面内容进行处理 Stream resStream = res.GetResponseStream(); StreamReader resStreamReader = new StreamReader(resStream, System.Text.Encoding.UTF8); string resLine; System.Text.StringBuilder resStringBuilder = new System.Text.StringBuilder(); while ((resLine = resStreamReader.ReadLine()) != null)
{
resStringBuilder.Append(resLine + System.Environment.NewLine);
} resStream.Close();
resStreamReader.Close(); return resStringBuilder.ToString();
}
}
catch (Exception ex)
{
return ex.Message;//url错误时候回报错
}
}
#endregion Post/Get提交调用抓取 #region unix/datatime 时间转换
/// <summary>
/// unix时间转换为datetime
/// </summary>
/// <param name="timeStamp"></param>
/// <returns></returns>
public static DateTime UnixTimeToTime(string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(, , ));
long lTime = long.Parse(timeStamp + "");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
} /// <summary>
/// datetime转换为unixtime
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
public static int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(, , ));
return (int)(time - startTime).TotalSeconds;
}
#endregion #region 记录bug,以便调试
/// <summary>
/// 记录bug,以便调试
/// </summary>
public static bool WriteTxt(string str)
{
try
{
string LogPath = HttpContext.Current.Server.MapPath("/err_log/");
if (!Directory.Exists(LogPath))
{
Directory.CreateDirectory(LogPath);
}
FileStream FileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("/err_log//lwf_" + DateTime.Now.ToLongDateString() + "_.txt"), FileMode.Append);
StreamWriter StreamWriter = new StreamWriter(FileStream);
//开始写入
StreamWriter.WriteLine(str);
//清空缓冲区
StreamWriter.Flush();
//关闭流
StreamWriter.Close();
FileStream.Close();
}
catch (Exception)
{
return false;
}
return true;
}
#endregion #region 生成随机字符
/// <summary>
/// 生成随机字符
/// </summary>
/// <param name="iLength">生成字符串的长度</param>
/// <returns>返回随机字符串</returns>
public static string GetRandCode(int iLength)
{
string sCode = "";
if (iLength == )
{
iLength = ;
}
string codeSerial = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] arr = codeSerial.Split(',');
int randValue = -;
Random rand = new Random(unchecked((int)DateTime.Now.Ticks));
for (int i = ; i < iLength; i++)
{
randValue = rand.Next(, arr.Length - );
sCode += arr[randValue];
}
return sCode;
}
#endregion
}
}

附件为源码:微信分享Demo

.NET微信自定义分享标题、缩略图、超链接及描述的设置方法的更多相关文章

  1. H5微信自定义分享链接(设置标题+简介+图片)

    起源:最近公司在做招募广告的html5页面,然后做出来后,产品提出一个问题,需要分享出去的链接是卡片形式,内容也要自己定义,这下就难到我了,因为是第一次遇到这种需求,果断百度,然而,我就像大家一样,看 ...

  2. .netcore2.1 JS-SDK 从后台获取微信签名,实现自定义分享标题、描述、图片

    最近项目移动端需要实现微信自定义分享功能,包含分享自定义标题.描述等. 首先到公众号的后台,功能设置里面,添加将要被分享的域名,如图 后端签名算法实现 ,参考腾讯开发者文档https://mp.wei ...

  3. ThinkPHP5集成JS-SDK实现微信自定义分享功能

    最近开发一个项目,需要将链接分享给好友时能够自定义标题.简介和logo,现将ThinkPHP5集成JS-SDK实现微信自定义分享功能的过程整理成文. 一.准备工作 1.认证的公众号 不管是订阅号还是服 ...

  4. Vue微信自定义分享时安卓系统config:ok,ios系统config:invalid signature签名错误,或者安卓和ios二次分享时均config:ok但是分享无效的解决办法

    简述需求:要求指定页面可以进行微信自定义分享(自定义标题,描述,图片,链接),剩下的页面隐藏所有基础接口.二次分享依然可以正常使用,切换至其他页面也可以正常进行自定义分享. 这两天在做微信自定义分享的 ...

  5. 生成二维码、微信自定义分享到朋友圈、ipa不从应用商店安装

    生成二维码网址:http://www.liantu.com/ 微信自定义分享到朋友圈:http://www.cnblogs.com/memor-y/p/6728179.html ipa不从应用商店安装 ...

  6. JSSDK微信自定义分享

    背景:15年之前的微信分享只需要加入一段js就可以实现.后来微信官方全部禁止了.现在的微信分享全部得使用jssdk. 一.分享功能: 在微信内(必须在微信里)打开网站页面,分享给朋友或者分享到朋友圈时 ...

  7. JSSDK微信自定义分享朋友圈

    服务项目 新手技术咨询 企业技术咨询 定制开发 服务说明 QQ有问必答 QQ.微信.电话 微信开发.php开发,网站开发,系统定制,小程序开发 价格说明 200元/月 1000/月 商议       ...

  8. H5页面分享微信自定义分享title和img

    前端开发H5 需分享到朋友圈和发给好友,想自定义分享的title和图表还有简短一句话,还需调用微信的api 首先需获取到微信的appId,timestamp,nonceStr,signature 微信 ...

  9. php 微信 自定义分享接口

    <?php class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appS ...

随机推荐

  1. stage3D之疑问

    1.stage3D本身是建立在图形API(如DirectX.Opengl等)之上的一套API,那么在创建stage3D demo时,如何指定使用哪种图形API呢?

  2. Python内置的字符串处理函数整理

    Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...

  3. python的类和对象——进阶篇

    写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...

  4. web 标准相关

    摘自:http://www.cnblogs.com/artech/p/restful-web-api-01.html 一.TCP/IP与HTTP TCP/IP是以IP和TCP协议为核心的一整套网络协议 ...

  5. E:Sudoku

    总时间限制: 2000ms 内存限制: 65536kB描述Sudoku is a very simple task. A square table with 9 rows and 9 columns ...

  6. java 代理的三种实现方式

    Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...

  7. linux下使用shell查看apache IP访问量

    1.查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[$NF]} ...

  8. Launch Screen在iOS7/8中的实现

    Launch Screen在iOS7/8中的实现 目前项目中需要解决的问题是: 兼容iOS7和iOS8,之前的版本不需要支持了 实现兼容3.5.4.4.7和5.5寸屏幕,竖屏的Lauch Screen ...

  9. Swift学习

    Swift 中文教程(一)基础数据类型 基础类型 虽然Swift是一个为开发iOS和OS X app设计的全新编程语言,但是Swift的很多特性还是跟和Objective-C相似. Swift也提供了 ...

  10. 验证页面多个input文本的必填项

    前台页面 JS : function CheckMustWrite(){ var count = $("input[mustwrite = 'true']", document.f ...