<?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(); } ?>
代码说明
getAccessToken($appId, $appSecret)
:该函数用于获取
access_token
,并实现了缓存机制,避免重复请求。缓存在
access_token_cache.json
文件中,并设置为 3600 秒有效期。如果缓存有效,直接返回
access_token
,否则请求新的access_token
。createQRCode($accessToken, $sceneStr, $expireSeconds)
:该函数用于生成带参数的二维码,参数
sceneStr
是自定义的场景值。参数
expireSeconds
设置二维码的有效期(秒),默认是7天(最大为604800秒,即7天)。函数发送请求到
https://api.weixin.qq.com/cgi-bin/qrcode/create
,然后返回二维码图片的URL。主代码部分:
设置了
appId
和appSecret
,并调用上述两个函数来获取二维码的URL。
注意事项
sceneStr
应为字符串类型,且长度不能超过64个字符。expire_seconds
只在生成临时二维码时有效(最大值为 604800 秒),永久二维码不需要该参数。在生产环境中,如果
access_token
的缓存管理较为复杂,可以考虑使用数据库或其他缓存工具(如 Redis)。