.NET微信自定义分享标题、缩略图、超链接及描述的设置方法
前端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微信自定义分享标题、缩略图、超链接及描述的设置方法的更多相关文章
- H5微信自定义分享链接(设置标题+简介+图片)
起源:最近公司在做招募广告的html5页面,然后做出来后,产品提出一个问题,需要分享出去的链接是卡片形式,内容也要自己定义,这下就难到我了,因为是第一次遇到这种需求,果断百度,然而,我就像大家一样,看 ...
- .netcore2.1 JS-SDK 从后台获取微信签名,实现自定义分享标题、描述、图片
最近项目移动端需要实现微信自定义分享功能,包含分享自定义标题.描述等. 首先到公众号的后台,功能设置里面,添加将要被分享的域名,如图 后端签名算法实现 ,参考腾讯开发者文档https://mp.wei ...
- ThinkPHP5集成JS-SDK实现微信自定义分享功能
最近开发一个项目,需要将链接分享给好友时能够自定义标题.简介和logo,现将ThinkPHP5集成JS-SDK实现微信自定义分享功能的过程整理成文. 一.准备工作 1.认证的公众号 不管是订阅号还是服 ...
- Vue微信自定义分享时安卓系统config:ok,ios系统config:invalid signature签名错误,或者安卓和ios二次分享时均config:ok但是分享无效的解决办法
简述需求:要求指定页面可以进行微信自定义分享(自定义标题,描述,图片,链接),剩下的页面隐藏所有基础接口.二次分享依然可以正常使用,切换至其他页面也可以正常进行自定义分享. 这两天在做微信自定义分享的 ...
- 生成二维码、微信自定义分享到朋友圈、ipa不从应用商店安装
生成二维码网址:http://www.liantu.com/ 微信自定义分享到朋友圈:http://www.cnblogs.com/memor-y/p/6728179.html ipa不从应用商店安装 ...
- JSSDK微信自定义分享
背景:15年之前的微信分享只需要加入一段js就可以实现.后来微信官方全部禁止了.现在的微信分享全部得使用jssdk. 一.分享功能: 在微信内(必须在微信里)打开网站页面,分享给朋友或者分享到朋友圈时 ...
- JSSDK微信自定义分享朋友圈
服务项目 新手技术咨询 企业技术咨询 定制开发 服务说明 QQ有问必答 QQ.微信.电话 微信开发.php开发,网站开发,系统定制,小程序开发 价格说明 200元/月 1000/月 商议 ...
- H5页面分享微信自定义分享title和img
前端开发H5 需分享到朋友圈和发给好友,想自定义分享的title和图表还有简短一句话,还需调用微信的api 首先需获取到微信的appId,timestamp,nonceStr,signature 微信 ...
- php 微信 自定义分享接口
<?php class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appS ...
随机推荐
- android 导入自己的生成的jar,老是 could not find class
最近开始学习android,开发一个小项目,功能很简单,就是从服务器上获取数据,之后显示在手机上.打算把访问服务器的功能打包成一个jar文件.然后android 引入jar包. 在eclipse 里 ...
- Windows—JDK安装与环境变量配置
本文介绍JDK的安装与环境变量配置. 工具/原料 JDK1.8.0_65 WIN7 32bit jdk-8u65-windows-i586.exe 方法/步骤 安装JDK 选择安装目录 安装过程中会 ...
- SQL导出excel
我在SQL 2008R2 里面用下面的命令成功导出excel 文件. EXEC master..xp_cmdshell 'bcp "select * from Car_data.dbo.Ca ...
- 使用 IN 的子查询
通过 IN(或 NOT IN)引入的子查询结果是一列零值或更多值.子查询返回结果之后,外部查询将利用这些结果. 下列查询会找到所有曾出版过商业书籍的出版商的名称. USE pubs SELECT pu ...
- PHP 每天的总结(1)
今天写博客的心情比以往还要糟糕,因为........................(完结). 1.获取某输入框的值,有两中获取方式,GET和POST .前者 没有为顾客的账户安全着想.而后者返之: ...
- linux kernel tainted
日志中会有一些信息: dmesg | grep -i tainted 具体代码可以通过proc看到: cat /proc/sys/kernel/tainted 数字的意义: tainted: Non- ...
- vbs常用代码
在网上查找资料的时候发现好多经典的vbs代码收集起来也为了以后学习. VBS播放音乐 Dim wmp Set wmp = CreateObject("WMPlayer.OCX") ...
- [安卓]windows下如何安装Android源码
本文改写于:http://www.cnblogs.com/skyme/archive/2011/05/14/2046040.html 1.下载并安装git: 在git-scm.com上下载并安装git ...
- Redisson-Parent 2.5.0 和 3.0.0 发布
Redisson-Parent 2.5.0 和 3.0.0 发布了,Redisson 是基于 Redis 服务之上构建的分布式.可伸缩的 Java 数据结构,高级的 Redis 客户端. Rediss ...
- Mybatis-动态 SQL
MyBatis 的强大特性之一便是它的动态 SQL. 如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省 ...