那为什么会出现这样的问题呢??
当打开分享页面时,是由微信内置浏览器打开了你分享的链接地址,所以打开后二次分享和你从安卓端首次分享出来时已经不是一个概念了。从安卓端首次分享出来,你配置好了分享内容。直接二次分享时,转发的是你接收的那条分享信息,该信息甚至还包含了分享来源,所以一般很少出现二次失效的问题。而间接二次分享时,微信内置浏览器甚至会重排版你的网页信息,也拿不到你分享时的配置信息,所以你二次分享后就出现了失效的问题。
2.二次分享失效的解决
要想解决二次失效的问题,需要从分享的目标网页使用微信的jssdk进行分享配置。即你需要在目标网页实现分享功能。
看到这个答案,你是不是觉得一脸懵逼?
别急呀,这个问题并不难解决。既然已经明白了问题所在,那么就干呗。我相信既然有解决方案,并且有技术能解决,那就都不是问题。
2.1 准备
首先,要解决这个问题,你需要有一个公众号,因为使用jssdk配置微信分享时,需要有公众号,且该公众号需要进行认证。
其次,你需要后台为你增加一个接口,进行微信签名认证。如果没有后台也不要紧,我会将后台实现方案给出来。还得有一个备案好的域名。
最后,就是需要把目标网页回炉重造,所以你要拿到目标网页的源码。
如果你是纯安卓端开发的话,建议此篇文章分享给写web端看。因为到了这一步,已经和安卓端没有半毛钱关系了。当然你要看也是阔以的,最起码解决方案可以瞅瞅。
2.2 公众号相关配置
如果你的公众号有专门的人负责的话,你就可以帅气的扔一句。给我把目标网页的域名添加到
如果公司没有公众号的话,可就得多干点事情了。申请公众号和认证公众号我就不再描述,有认证材料就很简单。
首先,登录到微信公众平台,在开发配置模块设置公众号开发信息。你需要拿到AppSecret和AppID。然后可以配置一下ip白名单,将你公司的服务器ip添加到白名单之中。不配置的话是访问不了微信服务的哟。为什么设置ip白名单,在下图之中也是有相关描述的。
然后在公众号设置的功能设置里面设置业务安全域名和js接口域名。业务安全域名一般指你后端存放的域名,通过该域名可以访问微信提供的开放接口。而js接口域名则指目标网页地址所在域名,设置JS接口安全域名后,公众号开发者可在该域名下调用微信开放的JS接口。
总之两个都设置一下,如果前后端都放在一个服务器的话,那么可以设置相同的域名。前提是域名得备案。
2.3 后台接口
微信jssdk开发文档
点击可以查看jssdk开发文档,里面有详细的介绍信息。这里我就对微信分享进行描述。
首先需要做一下配置。
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
从配置文件中我们可以看到,有三个字段需要我们在前端进行配置。尤其重要的便是签名。
那么这三个字段如何生成呢?总不能在前端进行生成吧。当然放在后端了,前端只需要往后端进行请求就行了。
那么后端怎么做呢?
首先需要拿到access_token。
请求地址为
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=yourappid&secret=yoursecret`
请求方式为GET就行。返回内容为json格式,这个可以通过微信给的调试工具进行调试查看返回内容。
在线接口调试工具 http://mp.weixin.qq.com/debug?token=2091322458&lang=zh_CN
然后再通过access_token来获取ticket(门票???)
"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi" % (
access_token)
最后就是生成签名了,生成签名的话,还是比较有趣的。
sha_str = "jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s" % (ticket, noncer, timestamp, request_url);
我们需要使用前面获取到ticket noncer,timestamp,request_url四个字段来拼接成一个字符串。最后通过sha加密来作为signature(签名)。
noncer:生成15位的随机字符串,可以是字母和数字
timestamp:时间戳
request_url:目标网页的链接 该链接是动态的比如包含了分享者的ip地址之类的,建议从前端将链接传过来
# 获取15位随机字符串
def get_noncer():
str_list = [random.choice(string.digits + string.ascii_letters) for i in range(15)]
random_str = ''.join(str_list)
return random_str
# 获取时间戳
def gettimestamp():
return int(time.time())
sha加密字符串
def getsha(sha_str:str):
sha = hashlib.sha1(sha_str.encode('utf-8'))
encrypts = sha.hexdigest()
return encrypts
当然appid也建议从后端进行返回,不放在目标网页里面。
这样就获取到了我们前端所需的配置数据了。
2.4 前端分享配置
首先引入jssdk
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
这里建议这种引用方式,不要下载后放在服务器。
然后在ready函数里面配置微信分享信息。这里建议ready函数里面先访问后端接口先请求配置信息,拿到配置数据,再进行配置
wx.config({
ebug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。打印标识config:
appId: appId, // 必填,公众号的唯一标识
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: signature, // 必填,签名,见附录1
jsApiList: ['onMenuShareTimeline', // 分享朋友圈
'onMenuShareAppMessage', //好友或群
'onMenuShareQQ', //qq
'onMenuShareQZone' //qq空间
] // 分享好友 // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
当然,还可以有腾讯微博可以分享,这里就不加进去了,具体视情况而定。
文末
我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。
以后的路也希望我们能一起走下去。(谢谢大家一直以来的支持)
部分资料一览:
- 330页PDF Android学习核心笔记(内含8大板块)
-
Android学习的系统对应视频
-
Android进阶的系统对应学习资料
- Android BAT大厂面试题(有解析)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!