要实现微信分享网页时自定义缩略图和简介,需开发者在公众平台网站中创建公众号、获取接口权限后,通过微信JS-SDK的分享接口,来实现微信分享功能。
下面来说明实现步骤。
第一部分 准备步骤
步骤一:注册微信公众号。
步骤二:认证微信公众号。
通过左侧导航“设置”--“微信认证”进入。不进行认证,无法使用微信JS-SDK分享接口。详见接口权限说明文档。
开通微信认证需准备如下图所示材料,具体认证流程详见微信认证申请流程(企业类型)文档。
步骤三:设置IP白名单。获取AppID和AppSecret。
通过左侧导航“开发”--“基本配置”进入。通过开发者ID及密码调用获取access_token接口时,需要设置访问来源IP为白名单。可将服务器ip、开发机ip、测试机ip都进行设置。
步骤四:配置JS接口安全域名。
通过左侧导航“设置”--“公众号设置”--“功能设置”进入。设置JS接口安全域名后,公众号开发者才可在该域名下调用微信开放的JS接口。具体设置步骤如下图所示。
步骤五:填写服务器配置。(可选)
通过左侧导航“开发”--“基本配置”进入。仅仅是为了实现分享功能的话,不是必填项,但为了实现其他功能(如回复消息),需进行配置。服务器配置是为了正确响应微信发送的Token验证等信息。详见入门指引文档中“1.4开发者基本配置”部分。
第二部分 开发步骤
步骤1:通过公众号里的AppID和AppSecret获取access_token(接口调用凭据),并进行缓存(有效期为2小时)
公众平台以access_token为接口调用凭据,来调用接口,所有接口的调用需要先获取access_token,access_token在2小时内有效,过期需要重新获取,但1天内获取次数有限,开发者需自行存储,详见获取接口调用凭据(access_token)文档。
public static string GetAccess_token() { string access_token = string.Empty; //从缓存获取 string cacheName = "Weixin_access_token"; object obj = CacheHelper.GetCache(cacheName); if (obj != null) { access_token = obj.ToString(); } //从接口获取 else { string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + AppID + "&secret=" + AppSecret; access_token = SubmitHttpWebRequest(url, "access_token"); //设置缓存 //7200秒内有效,不可无限次调取微信接口 CacheHelper.SetCache(cacheName, access_token, 7200); } return access_token; }
步骤2:获取jsapi_ticket,并进行缓存(有效期为2小时)。jsapi_ticket是公众号用于调用微信JS接口的临时票据
public static string GetJsapi_Ticket() { string jsapi_ticket = string.Empty; //从缓存获取 string cacheName = "Weixin_jsapi_ticket"; object obj = CacheHelper.GetCache(cacheName); if (obj != null) { jsapi_ticket = obj.ToString(); } //从接口获取 else { string access_token = GetAccess_token(); string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + access_token; jsapi_ticket = SubmitHttpWebRequest(url, "ticket"); //设置缓存 //7200秒内有效,不可无限次调取微信接口 CacheHelper.SetCache(cacheName, jsapi_ticket, 7200); } return jsapi_ticket; }
步骤3:生成JS-SDK权限验证的签名信息,并通过接口调用
签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
public static string[] GetSignature(string url) { //JSAPI调用凭证 string jsapi_ticket = GetJsapi_Ticket(); //随机生成的字符串 string noncestr = CreateRandCode(); //当前时间戳 TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); string timestamp = ((Int64)ts.TotalSeconds).ToString(); //string timestamp = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();//.net framework4.6 //url if (url.IndexOf("#") > 0) { url = url.Substring(0, url.IndexOf("#")); } //签名 StringBuilder string1 = new StringBuilder(); string1.AppendFormat("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3