<?php
/**
* 获取 access_token
* @param string $appId 微信公众号的 AppID
* @param string $appSecret 微信公众号的 AppSecret
* @return string 返回 access_token
*/
function getAccessToken($appId, $appSecret) {
$cacheFile = 'access_token_cache.json';
// 检查缓存文件是否存在并且有效
if (file_exists($cacheFile)) {
$cacheData = json_decode(file_get_contents($cacheFile), true);
if (isset($cacheData['access_token']) && time() < $cacheData['expires_at']) {
return $cacheData['access_token'];
}
}
// 请求新的 access_token
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";
$response = file_get_contents($url);
$data = json_decode($response, true);
if (isset($data['access_token'])) {
// 保存 access_token 到缓存,并设置过期时间
$cacheData = [
'access_token' => $data['access_token'],
'expires_at' => time() + 3600 // 设置为 3600 秒有效期
];
file_put_contents($cacheFile, json_encode($cacheData));
return $data['access_token'];
} else {
throw new Exception("获取access_token失败: " . json_encode($data));
}
}
/**
* 生成带参数的二维码
* @param string $accessToken 有效的 access_token
* @param string $sceneStr 场景值(自定义参数)
* @param int $expireSeconds 二维码有效时间(临时二维码)
* @return string 返回二维码图片 URL
*/
function createQRCode($accessToken, $sceneStr, $expireSeconds = 604800) {
// 微信生成二维码的接口
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$accessToken}";
// 请求数据:生成临时带参数二维码
$postData = json_encode([
'expire_seconds' => $expireSeconds,
'action_name' => 'QR_STR_SCENE',
'action_info' => [
'scene' => ['scene_str' => $sceneStr]
]
], JSON_UNESCAPED_UNICODE);
// 发起 POST 请求
$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => $postData
]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$data = json_decode($response, true);
if (isset($data['ticket'])) {
// 根据 ticket 生成二维码 URL
$ticket = urlencode($data['ticket']);
$qrcodeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={$ticket}";
return $qrcodeUrl;
} else {
throw new Exception("生成二维码失败: " . json_encode($data));
}
}
// 配置微信公众号的 AppID 和 AppSecret
$appId = 'YOUR_APP_ID';
$appSecret = 'YOUR_APP_SECRET';
$sceneStr = 'your_custom_parameter'; // 例如自定义参数
try {
// 获取 access_token
$accessToken = getAccessToken($appId, $appSecret);
// 生成带参数的二维码
$qrcodeUrl = createQRCode($accessToken, $sceneStr);
echo "二维码 URL: " . $qrcodeUrl;
} catch (Exception $e) {
echo $e->getMessage();
}
?>