Files
mier-php/application/api/wxapi/WxClient.php
2025-08-11 10:22:05 +08:00

448 lines
15 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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不合法'
];
}