PHP 实现 获取JS-SDK签名 调用微信功能接口

2017-09-12 13:21:17

<?php
/**
* 1.获取ac_token
* 2.获取微信临时票据
* 3.获取JSSDK 签名信息。(用于调用微信JS-SDK用)
*
*/

define('APP_ID','wx60cf2bbb7d439XXX');
define('APP_SEC','d7b96a06768e0a302669e51389aaeeXXX');

$wx_token = getAccessToken(APP_ID,APP_SEC); //获取ac_token (生存时间7200 , 获取后需设置缓存)
$ticket = getTicket($wx_token); // 使用token 获取JsApiTicket(调用微信临时票据;生存时间7200 , 获取后需设置缓存)
$signPackage = getSignPackage(getCurrentUrl(), $ticket, APP_ID);//获取JSSDK签名信息 ,通过config接口注入权限验证配置

/**
* 前端请求微信JS-SDK接口
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
<script type="text/javascript">
var wxConfig = {appId: "{$JSSDKSignPackage.appId}", timestamp: "{$JSSDKSignPackage.timestamp}", nonceStr: "{$JSSDKSignPackage.nonceStr}", signature: "{$JSSDKSignPackage.signature}"};
</script>
<script type="text/javascript" src="http://murongshuai.blog.163.com/blog/__ADDONS__/JSSDK/js/sdk.js"></script>

*/

/**
* 获取微信基础AccessToken
* @param type $getNewToken 是否强制刷新
* @return type
*/
function getAccessToken($appid,$appsecret) {
$key = 'AccessToken_' . $appid . '_' . $appsecret;
$wx_token = '';
$accessToken = getWxAccessToken( $appid, $appsecret);
$wx_token = $accessToken['access_token'];
return $wx_token;
}

/**
* 获取基础AccessToken
* @param type $appid
* @param type $appSecret
* @param type $type
* @return type
*/
function getWxAccessToken($appid, $appSecret, $type = 'client_credential') {
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=' . $type . '&appid=' . $appid . '&secret=' . $appSecret;
$data = http($url,null ,'GET');
$json = json_decode($data, true);
return $json;
}

/**
* 获取调用微信临时票据
* @param type $access_token 全局唯一票据
* @param type $type
* @return type
*/
function getTicket($access_token, $type = 'jsapi') {
$url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $access_token . '&type=' . $type;
$result = http($url);
$json = json_decode($result, true);
return $json;
}

/**
* 获取JSSDK签名信息
* @param type $url
* @param type $ticket
* @return type
*/
function getSignPackage($url, $ticket ,$appId) {
$timestamp = time();
$nonceStr = getNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$ticket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
'appId' => $appId,
'nonceStr' => $nonceStr,
'timestamp' => $timestamp,
'url' => $url,
'signature' => $signature,
'rawString' => $string
);
return $signPackage;
}

function getNonceStr($length = 16) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}

/**
* 获取当前访问的地址
* @return string
* 需开启php curl 扩展
*/
function getCurrentUrl() {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = $protocol . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
return $url;
}

function http($url, $param = null, $method = 'POST') {
try {
$opts = array(
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
);
/* 根据请求类型设置特定参数 */
$opts[CURLOPT_URL] = $url;
if (strtoupper($method) == 'POST' && !is_null($param)) {
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $param;
if (is_string($param)) { //发送JSON数据
$opts[CURLOPT_HTTPHEADER] = array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($param),
);
}
}
/* 初始化并执行curl请求 */
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error) {//发生错误
//throw new \Exception('请求发生错误:' . $error);
$data = array('errcode' => -1, 'errmsg' => $error);
}
} catch (\Exception $ex) {
$data = array('errcode' => -1, 'errmsg' => $ex->getMessage());
}
return $data;
}

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注