最近项目需要,需要调用微信的JS-SDK,加密信息需要服务端这边提供,首先需要在公众号后台添加接口域名,IP白名单等。
/**CURL*/
function curlPost($url, $data = [])
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
/** 生成随机码*/
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;
}
先获取access_token(有效期7200秒)
private function getJsdkToken(){ $url = https://api.weixin.qq.com/cgi-bin/token $accesstoken = Cache::get('jsdk'); if(!$accesstoken) { $queryarr = array( "appid" => $app_id, 'secret' => $app_secret, "grant_type" => "client_credential", ); $response = curlPost($url, $queryarr); $accesstoken = (array)json_decode($response, true); Cache::set('jsdk',$accesstoken,7000); } return $accesstoken['access_token'] ? $accesstoken['access_token'] : []; }
通过acces_token获取Jsapi_ticket(有效期7200秒)
private function getApiTicket()
{
$url = https://api.weixin.qq.com/cgi-bin/ticket/getticket
$apiticket = Cache::get('apiticket');
if(!$apiticket) {
$accesstoken = $this->getJsdkToken();
$queryarr = array('access_token' => $accesstoken ,
"type" => "jsapi");
$response = curlPost($url, $queryarr);
$apiticket = (array)json_decode($response, true);
Cache::set('apiticket'$apiticket,7000);
}
return $apiticket['ticket'] ? $apiticket['ticket'] : [];
}
获得jsapi_ticket,就可以获取JS-SDK权限验证签名 url是前端传过来的
public function getSignPackage($url)
{
$jsapiTicket = $this->getApiTicket();
$timestamp = time();
$nonceStr = $this->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=".$jsapiTicket."&noncestr=".$nonceStr."×tamp=".$timestamp."&url=".$url;
$signature = sha1($string);
$wxConfig = Wxapp::getWxappCache(); //获取微信配置消息
$signPackage = array("appId"=> $app_id,"nonceStr" => $nonceStr,
"timestamp" => $timestamp,"signature" => $signature);
return $signPackage;
}
前端需要的这些参数返回过去即可,如有其他问题可以查看微信官方文档
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
网页的URL,不包含#及其后面部分。注意:对于没有只有域名没有 path 的 URL ,浏览器会自动加上 / 作为 path,如打开 http://qq.com 则获取到的 URL 为 http://qq.com/),以上仅供参考。