php微信公众号生成带参数的二维码

<?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();
}
?>

代码说明

  1. getAccessToken($appId, $appSecret)

    • 该函数用于获取 access_token,并实现了缓存机制,避免重复请求。

    • 缓存在 access_token_cache.json 文件中,并设置为 3600 秒有效期。

    • 如果缓存有效,直接返回 access_token,否则请求新的 access_token

  2. createQRCode($accessToken, $sceneStr, $expireSeconds)

    • 该函数用于生成带参数的二维码,参数 sceneStr 是自定义的场景值。

    • 参数 expireSeconds 设置二维码的有效期(秒),默认是7天(最大为604800秒,即7天)。

    • 函数发送请求到 https://api.weixin.qq.com/cgi-bin/qrcode/create,然后返回二维码图片的URL。

  3. 主代码部分

    • 设置了 appIdappSecret,并调用上述两个函数来获取二维码的URL。

注意事项

  • sceneStr 应为字符串类型,且长度不能超过64个字符。

  • expire_seconds 只在生成临时二维码时有效(最大值为 604800 秒),永久二维码不需要该参数。

  • 在生产环境中,如果 access_token 的缓存管理较为复杂,可以考虑使用数据库或其他缓存工具(如 Redis)。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年10月    »
123456
78910111213
14151617181920
21222324252627
28293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your xin1234.com Rights Reserved.