获取access_token
//如果数据表里没有数据或者小于当前时间戳
if (empty($token) or $token['time'] < $time) {
$sql2 = "select appid,secret from user where id_sh=1";
$u_info = $db->select_one($sql2);
//从接口获取access_token(需要填写appid,secret)
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$u_info[appid]&secret=$u_info[secret]";
//把整个文件读入一个字符串中file_get_contents
$json = file_get_contents($url);
//把json格式转化为数组
$result = json_decode($json, true);
//获取关联数组中名字为access_token的值就是access_token
$access_token = $result['access_token'];
//如果表里面有记录且表里的时间戳小于当前时间戳,即时间戳过期 要重新储存
$datat = [
'access_token' => $access_token,
'time' => $time + 7200
];
if ($token) {
$datat['access_token'] = "'$access_token'";
$res = $db->update($datat, 'token');
} else {
$res = $db->insert($datat, 'token');
}
} else {
$access_token = $token['access_token'];
}
微信网页开发-添加卡卷
//从接口获取access_token(需要填写appid,secret)
//获取jsapi_ticket
//获取微信jsapi_ticket接口地址
$jsapi_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$access_token&type=jsapi";
//将其通过do_post_request()方法转换成json格式的字符串;
$getdata = do_post_request($jsapi_url, urldecode($data));
//将json格式的字符串通过json_decode解码成数组
$arr_jsapi = json_decode($getdata, true);
//获取数组中名字为ticket的值就是jsapi_ticket
$jsapi_ticket = $arr_jsapi['ticket'];
//获取卡券api_ticket
//获取微信api_ticket接口地址
$api_ticket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$access_token&type=wx_card";
//将其通过do_post_request()方法转换成json格式的字符串;
$getdata2 = do_post_request($api_ticket, urldecode($data));
//将json格式的字符串通过json_decode解码成数组
$arr_api = json_decode($getdata2, true);
//获取数组中名字为ticket的值就是api_ticket
$api_tickets = $arr_api['ticket'];
//获取使用接口的url地址要动态获取
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url1 = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
//生成js的签名函数包括参数jsapi_ticket,noncestr,timestamp,url,
//参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳)
//, url(当前网页的URL,不包含#及其后面部分) 。
//对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,
//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。
//这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,
//不进行URL 转义。
$str = 'jsapi_ticket=' . $jsapi_ticket . '&noncestr=' . $n . '×tamp=' . $time . '&url=' . $url1;
//将$str进行sha1加密就得到了js的签名
$jsSign = sha1($str);
//生成卡券的签名(参与签名的参数一定要和cardList里面的参数一样否则会报错),卡券的签名和js的签名是不一样的
//签名算法是按照这几个参数值按照字典顺序排列之后再按照sha1加密
$arr = array($_GET['cid'], $api_tickets, $time); //组装参数
asort($arr, SORT_STRING);
$sortString = "";
foreach ($arr as $temp) {
$sortString = $sortString . $temp;
}
$cardSign = sha1($sortString);
js部分
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: "<?php echo $u_info['appid'] ?>", // 必填,公众号的唯一标识
timestamp: "<?php echo $time ?>", // 必填,生成签名的时间戳
nonceStr: "<?php echo $n ?>", // 必填,生成签名的随机串
signature: "<?php echo $jsSign ?>", // 必填,签名
jsApiList: [
'addCard'
] // 必填,需要使用的JS接口列表
});
wx.ready(function() {
//添加卡券
window.ac = function() {
wx.addCard({
cardList: [{
cardId: "<?php echo $_GET['cid'] ?>",
cardExt: '{"timestamp":"<?php echo $time ?>","signature":"<?php echo $cardSign ?>"}'
}],
success: function(res) {
// alert('已添加卡券:' + JSON.stringify(res.cardList));
返回的code为加密后的code码,可以解码获取code码
}
});
};
});