<?php
// 文件路径: ecmsapi/index.php?mod=wechat&act=getphone
// 设置响应头
header('Content-Type: application/json;charset=utf-8');
$appid = 'XXXX';
$secret = 'XXXX';
// 检查请求方法
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['code' => 0, 'msg' => '请求方法错误']);
exit;
}
// 获取参数
$code = isset($_POST['code']) ? $_POST['code'] : '';
$openid = isset($_POST['openid']) ? $_POST['openid'] : '';
$session_key = isset($_POST['session_key']) ? $_POST['session_key'] : '';
// 参数验证
if (empty($code)) {
echo json_encode(['code' => 0, 'msg' => '参数不完整:缺少code']);
exit;
}
// 获取access_token (确保这个函数能正确获取有效的access_token)
$access_token = getAccessToken();
if (empty($access_token)) {
echo json_encode(['code' => 0, 'msg' => '获取access_token失败']);
exit;
}
// 调用微信接口获取手机号
$url = “https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={$access_token}”;
$data = [
'code' => $code
];
// 记录请求日志
error_log(“请求微信API: ” . $url);
error_log(“请求数据: ” . json_encode($data));
$result = httpRequest($url, json_encode($data), ['Content-Type: application/json']);
error_log(“微信API响应: ” . $result);
$result = json_decode($result, true);
// 检查微信接口返回结果
if (isset($result['errcode']) && $result['errcode'] == 0 && isset($result['phone_info']['phoneNumber'])) {
// 成功获取手机号
$phone = $result['phone_info']['phoneNumber'];
// 可以在这里将手机号与openid关联并存入数据库
// savePhoneToDatabase($openid, $phone);
echo json_encode([
'code' => 1,
'msg' => '获取手机号成功',
'data' => [
'phone' => $phone
]
]);
} else {
// 获取手机号失败
$errMsg = isset($result['errmsg']) ? $result['errmsg'] : '获取手机号失败';
$errCode = isset($result['errcode']) ? $result['errcode'] : 0;
echo json_encode([
'code' => 0,
'msg' => “错误: {$errMsg}, 错误码: {$errCode}”
]);
}
exit;
/**
* 获取微信接口调用凭证access_token
* @return string access_token
*/
function getAccessToken() {
$appid = 'XXXXXX';
$secret = '3XXXXXX';
// 使用文件缓存access_token
$cache_file = __DIR__ . '/access_token_cache.json';
$token_data = [];
// 检查缓存文件是否存在且可读
if (file_exists($cache_file) && is_readable($cache_file)) {
$token_data = json_decode(file_get_contents($cache_file), true);
}
// 检查缓存的access_token是否有效
if (isset($token_data['access_token']) && isset($token_data['expire_time']) && time() < $token_data['expire_time']) {
error_log(“使用缓存的access_token: ” . $token_data['access_token']);
return $token_data['access_token'];
}
// 重新获取access_token
error_log(“重新获取access_token”);
$url = “https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}”;
$res = httpRequest($url);
error_log(“微信token接口响应: ” . $res);
$res = json_decode($res, true);
if (isset($res['access_token'])) {
$access_token = $res['access_token'];
$expires_in = isset($res['expires_in']) ? intval($res['expires_in']) : 7200;
$expire_time = time() + $expires_in – 200; // 提前200秒更新
// 保存到缓存文件
$token_data = [
'access_token' => $access_token,
'expire_time' => $expire_time
];
// 确保目录存在且可写
$dir = dirname($cache_file);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
// 写入缓存文件
if (file_put_contents($cache_file, json_encode($token_data)) === false) {
error_log(“无法写入access_token缓存文件”);
}
return $access_token;
} else {
error_log(“获取access_token失败: ” . json_encode($res));
return '';
}
}
/**
* 发送HTTP请求
* @param string $url 请求URL
* @param string $data POST数据
* @param array $headers 请求头
* @return string 响应内容
*/
function httpRequest($url, $data = null, $headers = []) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
if (!empty($data)) {
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
if (!empty($headers)) {
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($curl);
if ($output === false) {
error_log(“CURL错误: ” . curl_error($curl));
}
curl_close($curl);
return $output;
}
?>















暂无评论内容