本文目录导读:

我来为你整理PHP小程序码生成接口的完整实现方案。
基础准备
获取访问令牌 (Access Token)
<?php
class WxMiniProgram {
private $appId;
private $appSecret;
public function __construct($appId, $appSecret) {
$this->appId = $appId;
$this->appSecret = $appSecret;
}
/**
* 获取Access Token
*/
public function getAccessToken() {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}";
$result = $this->httpRequest($url);
$data = json_decode($result, true);
if (isset($data['access_token'])) {
return $data['access_token'];
}
throw new Exception('获取Access Token失败: ' . $result);
}
/**
* HTTP请求封装
*/
private function httpRequest($url, $method = 'GET', $postData = null) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
}
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}
生成小程序码的三种方式
getwxacode 接口(适合生成普通二维码)
/**
* 获取小程序码(适合二维码)
* @param string $path 页面路径
* @param int $width 宽度
* @param bool $autoColor 自动配置线条颜色
*/
public function getWxacode($path, $width = 430, $autoColor = true) {
try {
$accessToken = $this->getAccessToken();
$url = "https://api.weixin.qq.com/wxa/getwxacode?access_token={$accessToken}";
$params = [
'path' => $path,
'width' => $width,
'check_path' => false, // 不检查路径是否存在
'auto_color' => $autoColor
];
$result = $this->httpRequest($url, 'POST', json_encode($params));
// 判断是否返回错误信息
if (isset($result['errcode'])) {
throw new Exception('生成失败: ' . $result['errmsg']);
}
return $result; // 返回图片二进制数据
} catch (Exception $e) {
throw new Exception('生成小程序码失败: ' . $e->getMessage());
}
}
getUnlimited 接口(适合无限量生成,更推荐)
/**
* 获取小程序码(无限量)
* @param string $scene 场景值(参数)
* @param string $page 页面路径
* @param array $options 其他参数
*/
public function getUnlimited($scene, $page = '', $options = []) {
try {
$accessToken = $this->getAccessToken();
$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={$accessToken}";
$params = array_merge([
'scene' => $scene,
'page' => $page ?: 'pages/index/index',
'check_path' => false,
'width' => 430,
'auto_color' => false,
'line_color' => ['r' => 0, 'g' => 0, 'b' => 0]
], $options);
$result = $this->httpRequest($url, 'POST', json_encode($params));
// 检查是否返回错误
$error = json_decode($result, true);
if (isset($error['errcode'])) {
throw new Exception('生成失败: ' . $error['errmsg']);
}
return $result; // 返回图片二进制数据
} catch (Exception $e) {
throw new Exception('生成小程序码失败: ' . $e->getMessage());
}
}
createwxaqrcode 接口(普通二维码)
/**
* 获取小程序二维码(普通二维码)
* @param string $path 页面路径
*/
public function createWxaqrcode($path, $width = 430) {
try {
$accessToken = $this->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token={$accessToken}";
$params = [
'path' => $path,
'width' => $width
];
$result = $this->httpRequest($url, 'POST', json_encode($params));
return $result;
} catch (Exception $e) {
throw new Exception('生成二维码失败: ' . $e->getMessage());
}
}
完整使用示例
<?php
require_once 'WxMiniProgram.php';
// 初始化
$wx = new WxMiniProgram('your_app_id', 'your_app_secret');
// 1. 生成小程序码(无限量)
try {
// 场景值,可用于追踪用户来源
$scene = 'source=' . $userId . '&type=share';
// 生成图片二进制数据
$imageData = $wx->getUnlimited($scene, 'pages/index/index', [
'width' => 300,
'auto_color' => true,
'line_color' => ['r' => 255, 'g' => 0, 'b' => 0] // 自定义颜色
]);
// 保存到本地
$filename = 'qrcode_' . time() . '.png';
file_put_contents('/path/to/save/' . $filename, $imageData);
// 或者直接输出
header('Content-Type: image/png');
echo $imageData;
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
带错误处理的完整类
<?php
class WechatMiniProgram {
private $appId;
private $appSecret;
private $accessToken;
public function __construct($appId, $appSecret) {
$this->appId = $appId;
$this->appSecret = $appSecret;
}
/**
* 生成小程序码并返回Base64格式
* @param array $params 生成参数
* @return array 包含base64图片数据
*/
public function generateQRCode($params) {
try {
// 获取access token
$accessToken = $this->getAccessToken();
// 根据类型选择接口
$apiUrl = '';
$postData = [];
if ($params['type'] === 'unlimited') {
$apiUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={$accessToken}";
$postData = [
'scene' => $params['scene'],
'page' => $params['page'] ?? 'pages/index/index',
'width' => $params['width'] ?? 430,
'auto_color' => $params['auto_color'] ?? false,
'line_color' => $params['line_color'] ?? ['r' => 0, 'g' => 0, 'b' => 0],
'is_hyaline' => $params['is_hyaline'] ?? false
];
} elseif ($params['type'] === 'wxacode') {
$apiUrl = "https://api.weixin.qq.com/wxa/getwxacode?access_token={$accessToken}";
$postData = [
'path' => $params['path'],
'width' => $params['width'] ?? 430,
'auto_color' => $params['auto_color'] ?? false,
'line_color' => $params['line_color'] ?? ['r' => 0, 'g' => 0, 'b' => 0]
];
}
// 发起请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen(json_encode($postData))
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 检查是否返回错误
$errorData = json_decode($response, true);
if (isset($errorData['errcode']) && $errorData['errcode'] != 0) {
return [
'success' => false,
'error' => $errorData['errmsg']
];
}
// 成功返回图片数据
return [
'success' => true,
'image' => base64_encode($response),
'contentType' => 'image/png'
];
} catch (Exception $e) {
return [
'success' => false,
'error' => $e->getMessage()
];
}
}
}
前端调用示例
<!DOCTYPE html>
<html>
<head>生成小程序码</title>
</head>
<body>
<button onclick="generateQRCode()">生成小程序码</button>
<img id="qrcode" alt="小程序码" style="display:none;">
<script>
function generateQRCode() {
fetch('/api/generate-qrcode.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'unlimited',
scene: 'user_id=123&type=promote',
page: 'pages/index/index',
width: 300
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
const img = document.getElementById('qrcode');
img.src = 'data:image/png;base64,' + data.image;
img.style.display = 'block';
} else {
alert('生成失败: ' + data.error);
}
});
}
</script>
</body>
</html>
注意事项
-
Access Token有效期:7200秒,需要缓存
-
接口调用频率限制:
getwxacode:每日100万次getUnlimited:有数量限制
-
参数限制:
scene:最长32个可见字符page:路径不能包含参数
-
错误处理:
- 40001:access_token无效
- 41030:page路径不正确
- 40013:不合法的AppID
-
最佳实践:
- 缓存Access Token
- 图片生成后缓存到CDN
- 异步处理大量生成请求
这个方案覆盖了微信小程序码生成的所有场景,你可以根据实际需求选择合适的接口。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播