签名已经生成了,并且和微信签名测试工具生成的签名一样,扫码访问页面时,还是弹出invalid signature,该怎么解决?!求指点!
图片描述
微信生成的
自己生成的与微信的一至
签名已经生成了,并且和微信签名测试工具生成的签名一样,扫码访问页面时,还是弹出invalid signature,该怎么解决?!求指点!
图片描述
微信生成的
自己生成的与微信的一至
<?php
class JSSDK {
private $appId;
private $appSecret;
public function __construct($appId, $appSecret) {
$this->appId = $appId;
$this->appSecret = $appSecret;
}
public function getSignPackage() {
$jsapiTicket = getJsapiTicket();
if($jsapiTicket&&$jsapiTicket<>''){
// 注意 URL 一定要动态获取,不能 hardcode.
$protocol = (!empty($_SERVER ['HTTPS']) && $_SERVER ['HTTPS'] !== 'off' || $_SERVER ['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$timestamp = time();
$nonceStr = $this->createNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket={$jsapiTicket}&noncestr={$nonceStr}×tamp={$timestamp}&url={$url}";
$signature = sha1($string);
$signPackage = array(
"appId" => $this->appId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
return $signPackage;
}else{
return false;
}
}
private function createNonceStr($length = 16) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0; $i < $length; $i ++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
private function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
}
上面是开源的库,调用方法就算getSignPackage(),执行之后得到nonceStr、signature、timestamp
$jssdk =new \JSSDK(C('APPID'), C('APPSECRET'));
$data=$jssdk->getSignPackage();
$this->assign('nonceStr', $data['nonceStr']);
$this->assign('signature', $data['signature']);
$this->assign('appid', C('APPID'));
$this->assign('timestamp', $data['timestamp']);
我记得公众平台的后台有个jssdk的安全目录要设置的。
你的js中调用了四次wxshare函数。
而你的timestamp,nonceStr每次调用都不同的。
所以签名错误。
<?php
$share = wxshare();
?>
wx.config({
appId:'xxx',
timestamp:<?=$share[0]?>,
nonceStr:'<?=$share[1]?>',
signature:'<?=$share[2]?>',
jsApiList:[xxx]
});
生成签名只是一种算法,如果你的签名结果和微信提供的签名工具返回的结果一样的话,肯定不需要考虑你的签名方法,因为已经是正确的。
再来考虑签名所需的参数,只有url和jsapi_ticket相对于后端和前端来说是不确定的:
1、看url,根据微信官方文档:前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),确认在微信客户端打开的实际链接是不是你php代码里拿到的url,因为微信客户端打开一个链接的时候它会自己在后面加上很多参数
2、看jsapi_ticket,这个仔细看一下生成的代码有没有错误的地方
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
不熟悉php ...
确定一下 是不是 url 的问题?