微信二次分享失效的解决办法

1、问题描述

根据需求要给一个页面加上微信分享。代码写完,测试:进入页面,点击分享到朋友圈,成功!退出,到朋友圈点开刚刚分享的页面,再分享,出错了。链接图片不见了(如果分享给好友,描述也变成了URL)。

2、简要分析

仔细看的话,发现分享后的URL变了。

原因在于:分享后微信会在原URL后面添加一串参数(form和isappinstalled之类),这就导致分享时签名的URL和当前页面的URL不一致,验证失败(开启debug就能看到提示)。

3、解决办法(最彻底的,注意本节末尾加粗部分)

我这里是 PHP 版本的解决办法,其他语言原理一致。

其实微信官方文档提醒过要动态获取URL,然后用动态获取到的URL去签名。动态获取URL方法:

$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";  
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

但是这并不能彻底解决问题:当URL中含有隔离参数的 & 符号时问题又会复现(如 http://www.abc.com/share.php?form=xxxx&isappinstalled=xxxx)。

因为签名时直接拼接了字符串,注意我圈出来的这里,这是官方的 JSSDK.php 文件:

于是请求微信服务器的时候,你的URL就被认为是 http://www.abc.com/share.php?form=xxxx,少了 &isappinstalled=xxxx,因为它变成了请求链接的另一个参数了。

所以,最终解决方式应该是:

先动态获取要分享页面的URL,然后在签名的时候使用 urlencode() 先把 URL 转码,再去拼接请求的链接。其他地方就不要转码了!!!

4、小记

微信分享在这点的确是个坑!只能这么说。至于为什么微信要在分享后给URL加参数,这应该是他需要据此区分某些东西的缘故。可能是官方在早期的时候还没有某些需求,后期随着需求和业务的增加也就不得不持续增加功能,导致出现一些细节上的照顾不周。这也是难以避免的,所以,以后写代码,我也要多思考思考了。

猜你喜欢

转载自www.cnblogs.com/alanabc/p/9020761.html