微信sdk 签名

时间:2023-03-09 09:23:34
微信sdk 签名
<?php
namespace app\wechat\service;
use think\Config;
class Signature
{
protected $appId ;
protected $appSecret;
protected $path; public function __construct($type='service') { $this->appId = Config::get('wx_'.$type.'.appId');
$this->appSecret = Config::get('wx_'.$type.'.appSecret');
$this->path = Config::get('wx_'.$type.'.fileUrl');
}
public function getSignPackage() { $jsapiTicket = $this->getJsApiTicket();
$url = urldecode($_GET['sign_url']);
$timestamp = time();
$nonceStr = get_rand_str(16, 0, 1, 0);
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
"appId" => $this->appId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
return $signPackage;
} private function getJsApiTicket() { $JsApiTicket = $this->path . "JsApiTicket_pssh.json";//缓存文件名
!is_file($JsApiTicket) && touch($JsApiTicket, '777');
$data = json_decode(file_get_contents($JsApiTicket), true);
if ($data['expire_time'] < time() or !$data['expire_time']) {
$accessToken = $this->access_Token();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = json_decode(httpRequest($url, 'GET'), true);
$ticket = $res['ticket'];
if ($ticket) {
$data['expire_time'] = time() + 7000;
$data['jsapi_ticket'] = $ticket;
$fp = fopen($JsApiTicket, "w+");
fwrite($fp, json_encode($data));
fclose($fp);
}
} else {
$ticket = $data['jsapi_ticket'];
}
return $ticket;
} public function access_Token() { $tokenFile = $this->path . "accessToken_pssh.json";//缓存文件名
!is_file($tokenFile) && touch($tokenFile, '777');
$data = json_decode(file_get_contents($tokenFile), true);
if ($data['expire_time'] < time() or !$data['expire_time']) {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appId=".$this->appId."&secret=".$this->appSecret;
$res = httpRequest($url, 'GET');
$res = json_decode($res,true);
$access_token = $res['access_token'];
if($access_token) {
$data['expire_time'] = time() + 7000;
$data['access_token'] = $access_token;
$fp = fopen($tokenFile, "w");
fwrite($fp, json_encode($data));
fclose($fp);
}
} else {
$access_token = $data['access_token'];
}
return $access_token;
} }

使用 (上面的配置文件根据自己的需要写)

public function getSignPackage()
{
$sign = new SignatureService('service');
$result = $sign->getSignPackage();
return json($result);
}

这是基于TP5写的  自己记录用  要是能看懂就拿走

SignatureService()方法里面的参数是区分不同公众号 这样也要有不同的配置文件
function share_disable(){
$.ajax({
type: 'GET',
url: localurl + "/index.php/……/getSignPackage",
data: {sign_url:encodeURIComponent(location.href.split('#')[0])},
dataType: 'JSON',
success: function(data){ wx.config({
// debug :true,
appId: data.appId,
timestamp: data.timestamp,
nonceStr: data.nonceStr,
signature: data.signature,
jsApiList: [
"hideMenuItems"
]
});
wx.ready(function () {
wx.hideMenuItems({
menuList: [
"menuItem:share:qq",
"menuItem:share:timeline",
"menuItem:share:appMessage",
"menuItem:share:QZone",
"menuItem:share:weiboApp",
"menuItem:favorite",
"menuItem:share:facebook",
"menuItem:copyUrl",
"menuItem:openWithQQBrowser",
"menuItem:share:email",
"menuItem:openWithSafari",
"menuItem:originPage"
] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
});
});
}
}); }

这是隐藏分享按钮的示例