微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php微信高级接口群发 多客服

本文实例为大家分享PHP微信高级接口群发、多客服源码,供大家参考,具体内容如下

'tokenaccesskey',//填写你设定的key * 'appid'=>'wxdk1234567890',//填写高级调用功能的app id * 'appsecret'=>'xxxxxxxxxxxxxxxxxxx',//填写高级调用功能的密钥 * ); */ class WeiXinTool {

private $appid;
private $appsecret;
private $access_token;
private $mediaType = array('image' => array("jpg"),'voice' => array('amr','MP3'),'video' => array('mp4'),'thumb' => array("jpg"));
private $mediaMaxSize = array('image' => 131072,'voice' => 262144,'video' => 1048576,'thumb' => 65536);
private $tem_file_path = "";

// 授权地址
const AUTH_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
// 素材上传
const UPLOAD_MEDIA_URL = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s";
const GET_MEDIA_URL = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s";
const UPLOAD_NEWS_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=%s";

public function __construct($options) {
$this->appid = isset($options['appid']) ? $options['appid'] : '';
$this->appsecret = isset($options['appsecret']) ? $options['appsecret'] : '';
//需修改
//上传图片临时文件目录自定义
$this->tem_file_path = YYUC_FRAME_PATH . YYUC_PUB . '/' . Session::get('upath');
}

/**

  • 修改
  • 具体业务需求,图文信息上传至素材库
  • 微站文章上传至微信素材
  • @param type $wid
  • @param type $aid
  • @return int
    */
    public function uploadArticlesToWeiXinServer($wid,$aid) {
//具体图文组装过程,需<a href="https://www.jb51.cc/tag/xiugai/" target="_blank" class="keywords">修改</a>
$m = new Model('website_article');
$m_pubs = new Model('pubs');
$m_pubs->find(array("id" => $wid));
$m->find(array("wid" => $wid,'id' => $aid));
$res = array();
if ($m->has_id() && $m_pubs->has_id()) {
  $res[] = $m->get_model_array();

// var_dump($res);
$m->Votetouser = json_decode($m->Votetouser,TRUE);
$articles = $m->Votetouser[0];
$m_article = new Model('website_article');
$ress = $m_article->where(array('wid' => $wid,'id' => $articles))->list_all_array();
$res = array_merge($res,$ress);
} else {
$errarr = array();
$errarr['errcode'] = 44003;
$errarr['errmsg'] = self::$errorno[$errarr['errcode']];
return $errarr;
}
$items = array();
foreach ($res as $k => $v) {
$mediaid = $this->uploadMedia($v['picurl']);
if ($mediaid['media_id']) {
$thumb_media_id = $mediaid['media_id'];
} else {
return $mediaid;
}
$item = array(
"thumb_media_id" => $thumb_media_id,"author" => $m_pubs->pubun,"title" => $v['title'],"content_source_url" => WeiXinTool::complateUrl(WeiSite::parseArticleLinkData($v)),"content" => $v['reply_content'],//内容 富文本
"digest" => $v['description']//描述
);
$items[] = $item;
}
//以上具体图文组装过程,需修改

$postData['articles'] = $items;
$error = $this->uploadNews($postData);
return $error;

}

/**

  • 修改
  • 微站文章关键字匹配数据解析
    */
    public static function getArticleData($keyword) {
    global $wid;
    $m = new Model('website_article');
    $m->find(array('wid' => $wid,'keyword@~' => " " . $keyword . " "));
    $res = array();
    if ($m->has_id()) {
    $res[] = array("tit" => $m->title,"pic" => $m->picurl,"dec" => $m->description,"url" => WeiSite::parseArticleLinkData($m->get_model_array()));
    $m->Votetouser = json_decode($m->Votetouser,TRUE);
    $articles = $m->Votetouser[0];
    if (!empty($articles)) {
    foreach ($articles as $v) {
    $m_article = new Model('website_article');
    $m_article->find(array('wid' => $wid,'id' => $v));
    $res[] = array("tit" => $m_article->title,"pic" => $m_article->picurl,"dec" => $m_article->description,"url" => WeiSite::parseArticleLinkData($m_article->get_model_array()));
    }
    }
    return $res;
    }
    }

/**

  • 获取accesstoken
  • @param type $flag 强制刷新accesstoken 开关
  • @return type
    */
    public function getAccesstoken($flag = FALSE) {
    $url = sprintf(self::AUTH_URL,$this->appid,$this->appsecret);
    $result = Cache::get(md5($url));
    if ($flag || empty($result)) {
    $result = $this->http_get($url);
    $result = json_decode($result,TRUE);
    if ($result['errcode']) {
    return $result['errcode'];
    }
    Cache::set(md5($url),$result,1);
    }
    $this->access_token = $result['access_token'];
    return true;
    }

/**

  • 上传媒体
  • @param type $file 媒体文件 $url或者物理路径地址
  • @param type $type 类型
  • @return int
  • return
    array (size=3)
    'type' => string 'image' (length=5)
    'media_id' => string '-0Lr3rX9mDYBB7i5bDydvwFHHm3zW2Uxt0OoDFBPmGRfYiwckiALqHHDlP9jCm' (length=64)
    'created_at' => int 1400477181
    */
    public function uploadMedia($file,$type = "image") {
    $file = self::complateUrl($file);
    $urlarr = parse_url($file);
    $filetype = explode(".",$urlarr['path']);
    $filetype = strtolower($filetype[count($filetype) - 1]);
    $resizeSize = 100; //图片处理后另存质量
    if (!key_exists($type,$this->mediaType) || !in_array($filetype,$this->mediaType[$type])) {
    // return 40005; //格式错误
    $errarr = array();
    $errarr['errcode'] = 40005;
    $errarr['errmsg'] = self::$errorno[$errarr['errcode']];
    return $errarr;
    }
$temp_file = $this->tem_file_path . 'uploadMedia.' . $filetype;
$temp_file_resize = $this->tem_file_path . 'uploadMediaResize.' . $filetype;
file_put_contents($temp_file,self::http_get($file));
$handle = fopen($temp_file,"r");
$fstat = fstat($handle);

if ($fstat['size'] > $this->mediaMaxSize[$type]) {
  $resizeSize = intval($this->mediaMaxSize[$type] / $fstat['size'] * 100);
  Imag<a href="https://www.jb51.cc/tag/eto/" target="_blank" class="keywords">eto</a>ol::resizeImage($temp_file_resize,$temp_file,400,$resizeSize); //<a href="https://www.jb51.cc/tag/tupian/" target="_blank" class="keywords">图片</a>太大再处理压缩
  $temp_file = $temp_file_resize;

// return 40006; //大小错误
}
$filePath = realpath($temp_file);
$uploadUrl = sprintf(self::UPLOAD_MEDIA_URL,$this->access_token,$type);
$postData = array("r" => time(),'media' => "@{$filePath}");
$result = self::http_post($uploadUrl,$postData);
$result = json_decode($result,TRUE);
return $result;
}

/**

  • 群发图文信息
  • @param type $touser 粉丝数组/粉丝组id
  • @param type $media_id
  • @return type
    */
    public function sendArticles($touser,$media_id) {
    $errarr = array();
    $postData = array();
    $postData['mpnews'] = array("media_id" => $media_id);
    $postData['msgtype'] = "mpnews";
    if (is_array($touser)) {
    //用户列表群发
    $postData['touser'] = $touser;
    $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=%s';
    } else {
    $group = intval($touser);
    $groups = $this->getGroups(true);
    if (key_exists($group,$groups['list'])) {
    $postData['filter'] = array("group_id" => $group);
    } else {
    $errarr['errcode'] = 40050; //无效分组id
    $errarr['errmsg'] = self::$errorno[$errarr['errcode']];
    return $errarr;
    }
    $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=%s';
    }
    $url = sprintf($url,$this->access_token);
    $result = self::http_post($url,self::json_encode($postData));
    $result = json_decode($result,TRUE);
    return $result;
    }

/**

/**

  • 群发图文素材上传
    $postData = array('articles' => array($item,$item,...));
    $item = array(
    "thumb_media_id" => "WMQubqCECMQwAjqh8CI500LfhyoG0vmTTlKKJM5oP-of0uLML1_2s26j8XeIorDL","author" => "xxx","title" => "Happy Day","content_source_url" => "www.qq.com","content" => "content","digest" => "digest"
    );
  • return
    array (size=3)
    'type' => string 'news' (length=4)
    'media_id' => string 'OuXqv2dgZzxAmK4z-tvStgr6InG18oIllWkD6Tj1qJZVRg-2f64FDU2D3J7dptHs' (length=64)
    'created_at' => int 1400477183
    */
    public function uploadNews($postData) {
    $uploadUrl = sprintf(self::UPLOAD_NEWS_URL,$this->access_token);
    $result = self::http_post($uploadUrl,TRUE);
    return $result;
    }

/**

  • 获取粉丝列表
  • @param type $nextOpenId
  • @return type
    */
    public function getAllConnects($nextOpenId = "") {
    $url = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s';
    $url = sprintf($url,$nextOpenId);
    $result = self::http_get($url);
    $result = json_decode($result,TRUE);
    $count = count($result['data']['openid']);
    $list = $result['data']['openid'];
    if ($result['data']['openid'][$count - 1] == $result['next_openid']) {
    return $result['data']['openid'];
    } else {
    $templist = $this->getAllConnects($result['next_openid']);
    $list = array_merge($list,$templist);
    return $list;
    }
    }

/**

/**

  • 更新粉丝组信息
  • @param type $openid
  • @param type $groupid
  • @return type
    */
    public function updateFansGroups($openid,$groupid) {
    $url = 'https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=%s';
    $url = sprintf($url,$this->access_token);
    $postData = array("to_groupid" => $groupid,'openid' => $openid);
    $result = self::http_post($url,TRUE);
    $this->getGroups(true);
    return $result;
    }

/**

/**

  • 获取唯一key
  • @param type $key
  • @return type
    */
    public function getKey($key) {
    return md5($this->appid . $this->appsecret . $key);
    }

/**

  • 获取媒体图片到本地
  • @param type $mediaid
  • @return string
    */
    public function getMedia($mediaid) {
    $url = sprintf(self::GET_MEDIA_URL,$mediaid);
    $result = self::http_get($url);
    $temp_file = $this->tem_file_path . 'getMedia.jpg';
    file_put_contents($temp_file,$result);
    return $temp_file;
    }

/**

  • 用户
  • @param type $flag 强制刷新用户
  • @return type
    */
    public function getGroups($flag = false) {
    $key = $this->appid . 'gasdfev' . $this->appsecret;
    $result = Cache::get($key);
    if (empty($result) || $flag) {
    $url = 'https://api.weixin.qq.com/cgi-bin/groups/get?access_token=%s';
    $url = sprintf($url,$this->access_token);
    $result = self::http_get($url);
    $result = json_decode($result,TRUE);
    $temg = array();
    $temlist = array();
    foreach ($result['groups'] as $k => $v) {
    $temg[$v['id']] = $v;
    $temlist[$v['id']] = $v['name'];
    }
    $result['map'] = $temg;
    $result['list'] = $temlist;
    Cache::set($key,$result);
    }
    return $result;
    }

/**

/**

/**

  • 多客服接入
  • @global type $wid
  • @param type $postObj
    */
    public static function responseService($postObj) {
    global $wid;
    $fromUsername = $postObj->FromUserName;
    $toUsername = $postObj->ToUserName;
    $textTpl = " %s "; $resstr = sprintf($textTpl,$fromUsername,$toUsername,time()); echo $resstr; }

/**

  • 微信回复多图文
  • @global type $wid
  • @param type $res
  • array(array(),array()
  • );
  • @param type $rid
  • @param type $postObj
    */
    public static function response_morearts($res,$postObj) {
    global $wid;
    $fromUsername = $postObj->FromUserName;
    $toUsername = $postObj->ToUserName;
    $textTpl = " %s %s ITEM "; $resstr = sprintf($textTpl,time(),"news",count($res)); $item = ''; $subitem = " <![CDATA[%s]]> "; foreach ($res as $r) { $r['url'] = self::parseUrl($r['url']); $item .= sprintf($subitem,$r['tit'],$r['des'],self::complateUrl($r['pic']),self::replacetoWXUrl(self::complateUrl($r['url']),$postObj)); } $resstr = str_replace('ITEM',$resstr); echo $resstr; }

/**

  • url解析
  • @param type $url
  • @return string
    */
    public static function complateUrl($url) {
    if (false === stristr($url,"http://")) {//查找http:// 如果不存在
    if (0 === strpos($url,'/')) {//查找首字母 如果存在
    $url = substr($url,1); //去除/
    }
    $url = "http://" . $_SERVER['HTTP_HOST'] . '/' . $url; //拼接完整路径
    }
    return $url;
    }

/**

  • 微信url固定参数替换
  • @param type $url
  • @param type $postObj
  • @return type
    */
    public static function replacetoWXUrl($url,$postObj) {
    global $wechatid;
    return str_ireplace('fromUsername',$wechatid,$url);
    }

/**

  • 完成以下行为
  • parseUrlParam
  • setUrlPublicParam
  • buildUrlParam
  • @param type $url
  • @param type $other 附加参数 基础参数wid wxid wechatid
    */
    public static function parseUrl($url,$other = array()) {
    $url = self::parseUrlParam($url);
    $url = self::setUrlPublicParam($url);
    if (is_array($other) && !empty($other)) {
    $url['param'] = array_merge($url['param'],$other);
    }
    $url = self::buildUrlParam($url);
    return $url;
    }

/**

  • 分析url
  • @param type $url
  • @return type
    */
    public static function parseUrlParam($url) {
    $temp = explode("?",$url);
    $url0 = $temp[0];
    $url1 = $temp[1];
    $p = explode("&",$url1);
    $param = array();
    foreach ($p as $v) {
    $tempp = explode("=",$v);
    $param[$tempp[0]] = $tempp[1];
    }
    return array("url" => $url0,"param" => $param);
    }

/**

  • 组装url
  • @param type $arr
  • @return type
    */
    public static function buildUrlParam($arr) {
    $url = $arr['url'];
    $param = $arr['param'];
    $param_arr = array();
    foreach ($param as $k => $v) {
    if ($k == "") continue;
    $param_arr[] = $k . "=" . $v;
    }
    return $url . "?" . implode("&",$param_arr) . "#mp.weixin.qq.com";
    }

/**

  • 设置微信保留参数信息
  • @global type $uid
  • @global type $wid
  • @global type $wechatid
  • @param type $url
  • @return type
    */
    public static function setUrlPublicParam($url) {
    global $uid,$wid,$wechatid;
    $url['param']['wid'] = $wid;
    $url['param']['wxid'] = $wechatid;
    $url['param']['wechatid'] = $wechatid;
    return $url;
    }

public static $errorno = array(
'-1' => '系统繁忙','0' => '请求成功','40001' => '获取access_token时AppSecret错误,或者access_token无效','40002' => '不合法的凭证类型','40003' => '不合法的OpenID','40004' => '不合法的媒体文件类型','40005' => '不合法的文件类型','40006' => '不合法的文件大小','40007' => '不合法的媒体文件id','40008' => '不合法的消息类型','40009' => '不合法的图片文件大小','40010' => '不合法的语音文件大小','40011' => '不合法的视频文件大小','40012' => '不合法的缩略图文件大小','40013' => '不合法的APPID','40014' => '不合法的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' => '分组名字不合法','40059' => '不合法的消息id','41001' => '缺少access_token参数','41002' => '缺少appid参数','41003' => '缺少refresh_token参数','41004' => '缺少secret参数','41005' => '缺少多媒体文件数据','41006' => '缺少media_id参数','41007' => '缺少子菜单数据','41008' => '缺少oauth code','41009' => '缺少openid','42001' => 'access_token超时','42002' => 'refresh_token超时','42003' => 'oauth_code超时','43001' => '需要GET请求','43002' => '需要POST请求','43003' => '需要HTTPS请求','43004' => '需要接收者关注','43005' => '需要好友关系','44001' => '多媒体文件为空','44002' => 'POST的数据包为空','44003' => '图文消息内容为空','44004' => '文本消息内容为空','45001' => '多媒体文件大小超过限制','45002' => '消息内容超过限制','45003' => '标题字段超过限制','45004' => '描述字段超过限制','45005' => '链接字段超过限制','45006' => '图片链接字段超过限制','45007' => '语音播放时间超过限制','45008' => '图文消息超过限制','45009' => '接口调用超过限制','45010' => '创建菜单个数超过限制','45015' => '回复时间超过限制','45016' => '系统分组,不允许修改','45017' => '分组名字过长','45018' => '分组数量超过上限','46001' => '不存在媒体数据','46002' => '不存在的菜单版本','46003' => '不存在的菜单数据','46004' => '不存在的用户','47001' => '解析JSON/XML内容错误','48001' => 'api功能未授权','50001' => '用户未授权该api'
);

/**

  • GET 请求
  • @param string $url
    */
    public static function http_get($url) {
    if (!function_exists('curl_init')) {
    die('curl 未开启');
    };
    $oCurl = curl_init();
    if (stripos($url,"https://") !== FALSE) {
    curl_setopt($oCurl,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($oCurl,CURLOPT_SSL_VERIFYHOST,FALSE);
    }
    curl_setopt($oCurl,CURLOPT_URL,$url);
    curl_setopt($oCurl,CURLOPT_RETURNTRANSFER,1);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if (intval($aStatus["http_code"]) == 200) {
    return $sContent;
    } else {
    return false;
    }
    }

/**

  • POST 请求
  • @param string $url
  • @param array $param
  • @return string content
    */
    public static function http_post($url,$param,$httpBuildQuery = false) {
    if (!function_exists('curl_init')) {
    die('curl 未开启');
    };
    $oCurl = curl_init();
    if (stripos($url,false);
    }
    curl_setopt($oCurl,1);
    // curl_setopt($oCurl,CURLOPT_HTTPHEADER,$header);//设置HTTP头
    curl_setopt($oCurl,CURLOPT_POST,1);
    if ($httpBuildQuery) {
    $param = http_build_query($param);
    }
    curl_setopt($oCurl,CURLOPT_POSTFIELDS,$param);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if (intval($aStatus["http_code"]) == 200) {
    return $sContent;
    } else {
    return false;
    }
    }

/**

  • 微信api不支持中文转义的json结构
  • @param array $arr
    /
    static function json_encode($arr) {
    $parts = array();
    $is_list = false;
    //Find out if the given array is a numerical array
    $keys = array_keys($arr);
    $max_length = count($arr) - 1;
    if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //See if the first key is 0 and last key is length - 1
    $is_list = true;
    for ($i = 0; $i < count($keys); $i ++) { //See if each key correspondes to its position
    if ($i != $keys [$i]) { //A key fails at position check.
    $is_list = false; //It is an associative array.
    break;
    }
    }
    }
    foreach ($arr as $key => $value) {
    if (is_array($value)) { //Custom handling for arrays
    if ($is_list) $parts [] = self::json_encode($value); /
    :RECURSION: /
    else $parts [] = '"' . $key . '":' . self::json_encode($value); /
    :RECURSION: */
    } else {
    $str = '';
    if (!$is_list) $str = '"' . $key . '":';
    //Custom handling for multiple data types
    if (is_numeric($value) && $value < 2000000000) $str .= $value; //Numbers
    elseif ($value === false) $str .= 'false'; //The booleans
    elseif ($value === true) $str .= 'true';
    else $str .= '"' . addslashes($value) . '"';
    //All other things
    // :Todo: Is there any more datatype we should be in the lookout for? (Object?)
    $parts [] = $str;
    }
    }
    $json = implode(',',$parts);
    if ($is_list) return '[' . $json . ']'; //Return numerical JSON
    return '{' . $json . '}'; //Return associative JSON
    }

}

以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流程
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中APP的支付的配置与实现流程
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛,就离不开通讯了,然后我就想到了长连接。这里本人用的是GatewayWorker框架。
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中JSAPI的支付实现流程
服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用