第一步:获取accesstoken
第二步:用accesstoken获取ticket,然后将ticket写入缓存,过期时间7200秒
第三步:获取前端传递的分享页面的url
第四步:将参数进行拼接,然后使用sha1()进行加密生成sign
第五步:将参数返回给前端配置
下面的代码示例我用的是Tp5.0框架,每一步都有注释,不明白的地方仔细看注释。
//分享获取token
public function jksb_accesstoken(){
$appid = '微信公众号id';
$secret = '微信公众号秘钥';
//拼接调用api接口获取accesstoken
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;
//调用curl get请求
$token = $this->curlHttp($url);
//获取到accesstoken之后再调接口获取ticket
$jsapi_ticket_url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket? access_token='.$token['access_token'].'&type=jsapi';
//调用curl get请求
$jsapi_ticket = $this->curlHttp($jsapi_ticket_url);
//将返回的ticket写入缓存,ticket过期时间7200秒
Cache::set('jsapi_ticket', $jsapi_ticket['ticket'], 7100);
//返回ticket
return $jsapi_ticket['ticket'];
}
//接受前端传递过来的url参数
public function jksb_sign(){
$post = $this->request->param();
//从缓存里面获取ticket
$jsapi_ticket = Cache::get('jsapi_ticket');
//判断是否过期
if(!$jsapi_ticket){
//过期了就调用获取ticket的方法,重新获取
$jsapi_ticket = $this->jksb_accesstoken();
}
//noncestr 是自定义的随机字符串,这里随便写
$noncestr='GlfeZYTPz0wzccnW';
//time = 当前时间
$time = time();
//url是前端传递的url
$url =$post['url'];
//将要加密的内容拼接为字符串
$sign_str ='jsapi_ticket='.$jsapi_ticket.'&noncestr='.$noncestr.'×tamp='.$time.'&url='.$url;
//使用sha1()进行加密
$sign = sha1($sign_str);
//将参数返回给前端配置
$return['time'] = $time; //时间
$return['url'] = $url; //当前分享页面的地址,由前端传递给后端,后端加密完之后再返回给前端
$return['sign'] = $sign; //加密之后的签名
$return['noncestr'] = $noncestr;//随机字符串
return json_encode($return); //返回
}
/**
* 发送get请求
*/
public function curlHttp($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
//释放curl句柄
curl_close($ch);
return json_decode($output,true);
}