大家好,我最近在做一个微信分享网页分享链接的简介和缩略图的修改功能,按着文档和网上的教程来搞了一遍下来,提示签名无效。之后做了很多次各种检查都没发现问题在哪?求指点,下面是js代码,公众号那边域名都绑好的了。
<script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
$(function() {
var baseurl = location.href.split('#')[0];
// var baseurl = location.href;
if(baseurl.search("html")==-1){
baseurl=baseurl+"index.html";
}
baseurl=encodeURI(baseurl);
// <span>alert</span>(baseurl);
$.ajax({
url :"http://www.隐藏/wx_token.php?"+baseurl,
// type:'get',
dataType : "json",
timeout : 5000,
error : function(XMLHttpRequest, textStatus, errorThrown) {
if (textStatus == "timeout") { // 请求超时
<span>alert</span>("请求超时");
} else {
<span>alert</span>(errorThrown);
}
},
success : function(data, textStatus) {
if (textStatus == "success") { // 请求成功
// <span>alert</span>(JSON.stringify(data));
// <span>alert</span>("1:"+data.ticket);
// <span>alert</span>("2:"+data.nonceStr);
// <span>alert</span>("3:"+data.timestamp);
// <span>alert</span>("4:"+data.url);
// <span>alert</span>("5:"+data.signature);
// <span>alert</span>("6:"+data.token);
wx.config({
debug : true,
appId : '隐藏',
timestamp : data.timestamp,
nonceStr : data.nonceStr,
signature : data.signature,
jsApiList : [ 'updateAppMessageShareData','updateTimelineShareData','onMenuShareWeibo']
});
wx.ready(function(){
<span>alert</span>('初始化成功');
});
wx.error(function(res){
<span>alert</span>('初始化失败');
});
}
}
});
});
</script>
以下是PHP代码
<?php
//启动
getSignPackage();
//1获取accesstoken
function getAccessToken()
{
$data = json_decode(file_get_contents("access_token.json"));
if ($data->expire_time < time()) {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=隐藏&secret=隐藏";
$res = json_decode(curlHttp($url));
$access_token = $res->access_token;
if ($access_token) {
$data->expire_time = time() + 7000;
$data->access_token = $access_token;
$fp = fopen("access_token.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
}
} else {
$access_token = $data->access_token;
}
return $access_token;
}
function curlHttp($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt($curl, CURLOPT_TIMEOUT, 500 );
curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,false);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
//2.获取api_ticket
function getJsApiTicket($accessToken) {
$data = json_decode(file_get_contents("jsapi_ticket.json"));
if ($data->expire_time < time()) {
// $accessToken = getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = json_decode(curlHttp($url));
$ticket = $res->ticket;
if ($ticket) {
$data->expire_time = time() + 7000;
$data->jsapi_ticket = $ticket;
$fp = fopen("jsapi_ticket.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
}
} else {
$ticket = $data->jsapi_ticket;
}
return $ticket;
}
// 3获取签名
function getSignPackage() {
// 获取token
$token = getAccessToken();
// 获取ticket
$ticket = getJsApiTicket($token);
// $ticket = $ticketList['ticket'];
// 该url为调用jssdk接口的url
$url = urldecode($_SERVER["QUERY_STRING"]);
// 生成时间戳
$timestamp = time();
// 生成随机字符串
$nonceStr = createNoncestr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序 j -> n -> t -> u
$string = "jsapi_ticket=$ticket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array (
"appId" => '隐藏',
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string,
"ticket" => $ticket,
"token" => $token
);
// var_dump(json_encode($signPackage));
// 返回数据给前端
echo json_encode($signPackage);
}
// 创建随机字符串
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;
}
很急,能解决的可以给顿饭钱,别嫌少啊我很穷的
// 这里参数的顺序要按照 key 值 ASCII 码升序排序 j -> n -> t -> u
$string = "jsapi_ticket=$ticket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$string这里面的“xtamp”写错了,改回×tamp,
哈哈哈~~~ 感谢园豆。但是这个问题也太搞笑了。
if ($data->expire_time < time()) {
// $accessToken = getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
这里我感觉有问题吧,你的$accessToken我理解应该是一个变量,但是你现在这里赋值了吗?你不是注释掉了吗?
$accessToken通过函数function getJsApiTicket($accessToken) 传参数过来,直接获取放到生成ticket链接上的