Files
mier-php/application/api/wxapi/WxClient.php

448 lines
15 KiB
PHP
Raw Normal View History

2025-08-11 10:22:05 +08:00
<?php
namespace app\api\wxapi;
/* 发送curl请求
* $WxClient =new WxClient();
* $WxClient->appID='wx8efa24d0434873ae';
* $WxClient->appsecret='123ce1bd44bbdd6ce3339a69f24820e9';
* $WxClient->setTypeCurl(WxClient::TYPE_CURL_POST); //发送post请求时需要设置
* $QrcodeInfo=$WxClient->execute($QrcodeCreatePost);
* */
class WxClient
{
const TYPE_CURL_GET='GET';
const TYPE_CURL_POST='POST';
const TYPE_CURL_JSON='JSON';
public $serverUrl = "https://api.weixin.qq.com/";
public $accessToken;
public $connectTimeout = 0;
public $readTimeout = 0;
public $appID='';
public $appsecret='';
public $typeCurl; //get or post
public $IsReturn=false;
public function execute($request){
switch ($this->typeCurl){
case self::TYPE_CURL_POST;
$resq=$this->post_execute($request);
break;
case self::TYPE_CURL_JSON;
$resq=$this->json_execute($request);
break;
default :
$resq=$this->get_execute($request);
}
return $resq;
}
public function get_curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //以文件流的形式返回,不要直接输出
//curl_setopt($ch, CURLOPT_FAILONERROR, false);
if ($this->readTimeout) {
curl_setopt($ch, CURLOPT_TIMEOUT, $this->readTimeout);
}
if ($this->connectTimeout) {
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
}
//https 请求
if(strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
$reponse = curl_exec($ch);
if (curl_errno($ch))
{
throw new \Exception(curl_error($ch),0);
}
else
{
$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (200 !== $httpStatusCode)
{
throw new \Exception($reponse,$httpStatusCode);
}
}
curl_close($ch);
return $reponse;
}
public function get_execute($request)
{
//获取业务参数
$apiParams = $request->getApiParas();
//系统参数放入GET请求串
$requestUrl = ((property_exists($request,'serverUrl'))?$request->serverUrl:$this->serverUrl) . $request->getApiMethodName() . "?";
foreach ($apiParams as $key => $value)
{
$requestUrl .= "$key=" . $value . "&";
}
$requestUrl=trim($requestUrl,"&");
//发起HTTP请求
try
{
$resp = $this->get_curl($requestUrl);
}
catch (\Exception $e)
{
$result->code = $e->getCode();
$result->msg = $e->getMessage();
return $result;
}
if($this->IsReturn){
return $resp;
}
$respObject = json_decode($resp);
if(isset($respObject->errcode)){
$respObject->errmsg=isset($this->errmsg[$respObject->errcode])?$this->errmsg[$respObject->errcode]:$respObject->errmsg;
}
return $respObject;
}
public function post_curl($url, $postFields = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if ($this->readTimeout) {
curl_setopt($ch, CURLOPT_TIMEOUT, $this->readTimeout);
}
if ($this->connectTimeout) {
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
}
//https 请求
if(strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
if (is_array($postFields) && 0 < count($postFields))
{
$postBodyString = "";
$postMultipart = false;
foreach ($postFields as $k => $v)
{
if("@" != substr($v, 0, 1))//判断是不是文件上传
{
$postBodyString .= "$k=" . urlencode($v) . "&";
}
else//文件上传用multipart/form-data否则用www-form-urlencoded
{
$postMultipart = true;
}
}
unset($k, $v);
curl_setopt($ch, CURLOPT_POST, true);
if ($postMultipart)
{
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
}
else
{
curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString,0,-1));
}
}else{
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
}
$reponse = curl_exec($ch);
if (curl_errno($ch))
{
throw new \Exception(curl_error($ch),0);
}
else
{
$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (200 !== $httpStatusCode)
{
throw new \Exception($reponse,$httpStatusCode);
}
}
curl_close($ch);
return $reponse;
}
public function post_execute($request)
{
//获取业务参数
$apiParams = $request->getApiParas();
//系统参数放入post请求串
$requestUrl = ((property_exists($request,'serverUrl'))?$request->serverUrl:$this->serverUrl) . $request->getApiMethodName() . "?";
$getParams = $request->getGetParas();
foreach ($getParams as $key => $value)
{
$requestUrl .= "$key=" . $value . "&";
}
$requestUrl=trim($requestUrl,"&");
//发起HTTP请求
try
{
$resp = $this->post_curl($requestUrl,$apiParams);
}
catch (\Exception $e)
{
$result->code = $e->getCode();
$result->msg = $e->getMessage();
return $result;
}
if($this->IsReturn){
return $resp;
}
$respObject = json_decode($resp);
if(isset($respObject->errcode)){
$respObject->errmsg=isset($this->errmsg[$respObject->errcode])?$this->errmsg[$respObject->errcode]:$respObject->errmsg;
}
return $respObject;
}
function post_curl_json($url, $postFields) {
$data_string=json_encode($postFields);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8','Content-Length: ' . strlen($data_string)));
if(strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
ob_start();
curl_exec($ch);
$return_content = ob_get_contents();
ob_end_clean();
$return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return $return_content;
}
public function json_execute($request)
{
//获取业务参数
$apiParams = $request->getApiParas();
//系统参数放入post请求串
$requestUrl = ((property_exists($request,'serverUrl'))?$request->serverUrl:$this->serverUrl) . $request->getApiMethodName() . "?";
$getParams = $request->getGetParas();
foreach ($getParams as $key => $value)
{
$requestUrl .= "$key=" . $value . "&";
}
$requestUrl=trim($requestUrl,"&");
//发起HTTP请求
try
{
$resp = $this->post_curl_json($requestUrl,$apiParams);
}
catch (\Exception $e)
{
$result->code = $e->getCode();
$result->msg = $e->getMessage();
return $result;
}
if($this->IsReturn){
return $resp;
}
$respObject = json_decode($resp);
if(isset($respObject->errcode)){
$respObject->errmsg=isset($this->errmsg[$respObject->errcode])?$this->errmsg[$respObject->errcode]:$respObject->errmsg;
}
return $respObject;
}
public function setTypeCurl($typeCurl){
$this->typeCurl=$typeCurl;
return $this;
}
public function setIsReturn($IsReturn=false){
$this->IsReturn=$IsReturn;
return $this;
}
public function getTypeCurl(){
return $this->typeCurl;
}
public function xmlToArray($xml)
{
//将XML转为array
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_data;
}
public $errmsg=[
'-1'=>'系统繁忙,此时请开发者稍候再试',
'0'=>'请求成功',
'40001'=>'获取access_token时AppSecret错误或者access_token无效。请开发者认真比对AppSecret的正确性或查看是否正在为恰当的公众号调用接口',
'40002'=>'不合法的凭证类型',
'40003'=>'不合法的OpenID请开发者确认OpenID该用户是否已关注公众号或是否是其他公众号的OpenID',
'40004'=>'不合法的媒体文件类型',
'40005'=>'不合法的文件类型',
'40006'=>'不合法的文件大小',
'40007'=>'不合法的媒体文件id',
'40008'=>'不合法的消息类型',
'40009'=>'不合法的图片文件大小',
'40010'=>'不合法的语音文件大小',
'40011'=>'不合法的视频文件大小',
'40012'=>'不合法的缩略图文件大小',
'40013'=>'不合法的AppID请开发者检查AppID的正确性避免异常字符注意大小写',
'40014'=>'不合法的access_token请开发者认真比对access_token的有效性如是否过期或查看是否正在为恰当的公众号调用接口',
'40015'=>'不合法的菜单类型',
'40016'=>'不合法的按钮个数',
'40017'=>'不合法的按钮个数',
'40018'=>'不合法的按钮名字长度',
'40019'=>'不合法的按钮KEY长度',
'40020'=>'不合法的按钮URL长度',
'40021'=>'不合法的菜单版本号',
'40022'=>'不合法的子菜单级数',
'40023'=>'不合法的子菜单按钮个数',
'40024'=>'不合法的子菜单按钮类型',
'40025'=>'不合法的子菜单按钮名字长度',
'40026'=>'不合法的子菜单按钮KEY长度',
'40027'=>'不合法的子菜单按钮URL长度',
'40028'=>'不合法的自定义菜单使用用户',
'40029'=>'不合法的oauth_code',
'40030'=>'不合法的refresh_token',
'40031'=>'不合法的openid列表',
'40032'=>'不合法的openid列表长度',
'40033'=>'不合法的请求字符,不能包含\uxxxx格式的字符',
'40035'=>'不合法的参数',
'40038'=>'不合法的请求格式',
'40039'=>'不合法的URL长度',
'40050'=>'不合法的分组id',
'40051'=>'分组名字不合法',
'40117'=>'分组名字不合法',
'40118'=>'media_id大小不合法',
'40119'=>'button类型错误',
'40120'=>'button类型错误',
'40121'=>'不合法的media_id类型',
'40132'=>'微信号不合法',
'40137'=>'不支持的图片格式',
'40155'=>'请勿添加其他公众号的主页链接',
'41001'=>'缺少access_token参数',
'41002'=>'缺少appid参数',
'41003'=>'缺少refresh_token参数',
'41004'=>'缺少secret参数',
'41005'=>'缺少多媒体文件数据',
'41006'=>'缺少media_id参数',
'41007'=>'缺少子菜单数据',
'41008'=>'缺少oauth code',
'41009'=>'缺少openid',
'42001'=>'access_token超时请检查access_token的有效期请参考基础支持-获取access_token中对access_token的详细机制说明',
'42002'=>'refresh_token超时',
'42003'=>'oauth_code超时',
'42007'=>'用户修改微信密码accesstoken和refreshtoken失效需要重新授权',
'43001'=>'需要GET请求',
'43002'=>'需要POST请求',
'43003'=>'需要HTTPS请求',
'43004'=>'需要接收者关注',
'43005'=>'需要好友关系',
'43019'=>'需要将接收者从黑名单中移除',
'44001'=>'多媒体文件为空',
'44002'=>'POST的数据包为空',
'44003'=>'图文消息内容为空',
'44004'=>'文本消息内容为空',
'45001'=>'多媒体文件大小超过限制',
'45002'=>'消息内容超过限制',
'45003'=>'标题字段超过限制',
'45004'=>'描述字段超过限制',
'45005'=>'链接字段超过限制',
'45006'=>'图片链接字段超过限制',
'45007'=>'语音播放时间超过限制',
'45008'=>'图文消息超过限制',
'45009'=>'接口调用超过限制',
'45010'=>'创建菜单个数超过限制',
'45011'=>'API调用太频繁请稍候再试',
'45015'=>'回复时间超过限制',
'45016'=>'系统分组,不允许修改',
'45017'=>'分组名字过长',
'45018'=>'分组数量超过上限',
'45047'=>'客服接口下行条数超过上限',
'46001'=>'不存在媒体数据',
'46002'=>'不存在的菜单版本',
'46003'=>'不存在的菜单数据',
'46004'=>'不存在的用户',
'47001'=>'解析JSON/XML内容错误',
'48001'=>'api功能未授权请确认公众号已获得该接口可以在公众平台官网-开发者中心页中查看接口权限',
'48002'=>'粉丝拒收消息(粉丝在公众号选项中,关闭了“接收消息”)',
'48004'=>'api接口被封禁请登录mp.weixin.qq.com查看详情',
'48005'=>'api禁止删除被自动回复和自定义菜单引用的素材',
'48006'=>'api禁止清零调用次数因为清零次数达到上限',
'50001'=>'用户未授权该api',
'50002'=>'用户受限,可能是违规后接口被封禁',
'61451'=>'参数错误(invalid parameter)',
'61452'=>'无效客服账号(invalid kf_account)',
'61453'=>'客服帐号已存在(kf_account exsited)',
'61454'=>'客服帐号名长度超过限制(仅允许10个英文字符不包括@及@后的公众号的微信号)(invalid kf_acount length)',
'61455'=>'客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)',
'61456'=>'客服帐号个数超过限制(10个客服账号)(kf_account count exceeded)',
'61457'=>'无效头像文件类型(invalid file type)',
'61450'=>'系统错误(system error)',
'61500'=>'日期格式错误',
'65301'=>'不存在此menuid对应的个性化菜单',
'65302'=>'没有相应的用户',
'65303'=>'没有默认菜单,不能创建个性化菜单',
'65304'=>'MatchRule信息为空',
'65305'=>'个性化菜单数量受限',
'65306'=>'不支持个性化菜单的帐号',
'65307'=>'个性化菜单信息为空',
'65308'=>'包含没有响应类型的button',
'65309'=>'个性化菜单开关处于关闭状态',
'65310'=>'填写了省份或城市信息,国家信息不能为空',
'65311'=>'填写了城市信息,省份信息不能为空',
'65312'=>'不合法的国家信息',
'65313'=>'不合法的省份信息',
'65314'=>'不合法的城市信息',
'65316'=>'该公众号的菜单设置了过多的域名外跳最多跳转到3个域名的链接',
'65317'=>'不合法的URL',
'9001001'=>'POST数据参数不合法',
'9001002'=>'远端服务不可用',
'9001003'=>'Ticket不合法',
'9001004'=>'获取摇周边用户信息失败',
'9001005'=>'获取商户信息失败',
'9001006'=>'获取OpenID失败',
'9001007'=>'上传文件缺失',
'9001008'=>'上传素材的文件类型不合法',
'9001009'=>'上传素材的文件尺寸不合法',
'9001010'=>'上传失败',
'9001020'=>'帐号不合法',
'9001021'=>'已有设备激活率低于50%,不能新增设备',
'9001022'=>'设备申请数不合法必须为大于0的数字',
'9001023'=>'已存在审核中的设备ID申请',
'9001024'=>'一次查询设备ID数量不能超过50',
'9001025'=>'设备ID不合法',
'9001026'=>'页面ID不合法',
'9001027'=>'页面参数不合法',
'9001028'=>'一次删除页面ID数量不能超过10',
'9001029'=>'页面已应用在设备中,请先解除应用关系再删除',
'9001030'=>'一次查询页面ID数量不能超过50',
'9001031'=>'时间区间不合法',
'9001032'=>'保存设备与页面的绑定关系参数错误',
'9001033'=>'门店ID不合法',
'9001034'=>'设备备注信息过长',
'9001035'=>'设备申请参数不合法',
'9001036'=>'查询起始值begin不合法'
];
}