微信多圖文群發(fā)接口調(diào)用(含預覽接口)

前瞻

之前寫了個通用的微信管理,領(lǐng)導說實用性太差,要加上群發(fā)管理,哎真是站著說話不腰疼,難為人,沒辦法,自己是打工的,干吧;不過個人覺得還是直接上微信后臺方便的多。先看下我的目錄


框架:tp3.2

思路

我這里是模擬的微信后臺添加的方式,首先有個群發(fā)主題(一個欄目),然后在群發(fā)內(nèi)容里在對應主題添加內(nèi)容,一個主題可以對應著多個內(nèi)容(多圖文)??梢钥聪挛业捻撁妫?/p>


我的群發(fā)內(nèi)容頁面:



數(shù)據(jù)庫字段:
  • 群發(fā)主題


  • 群發(fā)內(nèi)容


實現(xiàn)群發(fā)功能需要以下幾步:

  1. 上傳群發(fā)內(nèi)容的標題圖到微信服務器,拿到media_id(即thumb_media_id),這是上傳主題素材用的;調(diào)用接口地址http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html (我也不知道微信公眾平臺有幾個開發(fā)文檔,我看到了3個不同版本,這個是我點擊客戶接口進去的)
  2. 上傳群發(fā)內(nèi)容編輯器所編輯內(nèi)容所有圖片,拿到對應服務器的url并替換;這個也是必須的,否則,微信不會顯示圖片;調(diào)用地址:http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html
  3. 上傳主題素材,拿到media_id,用于群發(fā),這個和上面2的地址一樣
  4. 利用素材的media_id,上傳或者預覽,地址也是2

代碼:(因為我的是測試號,沒權(quán)限好像是,但是我的預覽接口成功了,預覽和素材只是最后一步不一樣)

namespace Admin\Controller;

class massController extends AuthController{

    protected $MassObj;
    protected $MassReturnObj;
    protected $conf;

    public function __construct(){
        parent::__construct();
        $this->MassObj = D('Mass');//主題表
        $this->MassReturnObj = D('MassReturn');//主題內(nèi)容表
    }
/**
     * [delmass 發(fā)送群發(fā)主題]
     * @return [JSON] [返回成功與失敗]
     */
    public function sendmass(){
      //這里我是異步post請求的,可以是get,看個人
        if( !empty( $_POST ) ){
            $id = I('post.id');
            $data = $this->MassReturnObj->order('mass_order')->where(array('mass_id'=>$id))->select();//拿到主題內(nèi)容數(shù)據(jù)
            $access_token = $this->getWxAccessToken();//下面有函數(shù)
            //循環(huán)遍歷每個圖文
            foreach( $data as $k=>$v){
                //調(diào)用基礎(chǔ)支持的上傳多媒體文件,上傳標題圖
                $url="http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={$access_token}&type=image";
                $arr = array('media'=>'@'.$_SERVER['DOCUMENT_ROOT'].$v['pic_url'],'form-data'=>$v['pic_url']);
                $res = $this->http_curl($url,'post','',$arr);
                if( !$res ){
                    $this->ajaxReturn( array( 'code'=>1,'msg'=>'id為'.$v['id'].'的數(shù)據(jù)標題圖圖片上傳失敗!' ) );
                } 
                $v['media_id'] = $res['media_id'];//標題圖的thumb_media_id
                $v['wxpic'] = $res['url'];
                $content = $v['content'];
                preg_match_all('/<img.*?src="(.*?)".*?>/is',$content,$arr);//提取編輯內(nèi)容的所有img的src
                $url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={$access_token}&type=image";
                //將內(nèi)容里面的所有img圖片上傳到微信服務器,并替換新的圖片地址
                foreach( $arr[1] as $k1=>$vo ){
                    $arr = array('media'=>'@'.$_SERVER['DOCUMENT_ROOT'].$vo,'form-data'=>$vo);
                    //調(diào)用圖片上傳到微信服務器接口
                    $res = $this->http_curl($url,'post','',$arr);
                    if( !$res['url'] ){
                        $this->ajaxReturn( array( 'code'=>1,'msg'=>'id為'.$v['id'].'的消息內(nèi)容頁面的第'.($k1+1).'張圖片上傳失??!' ) );
                    }
                    $content = str_replace($vo,$res['url'],$content);//替換新的圖片地址
                }
                //拼接主題素材數(shù)組,這塊漢字需要用urlencode轉(zhuǎn)一下,轉(zhuǎn)成json再用urldecode轉(zhuǎn)回,否則消息頁面是亂碼
                $postArr['articles'][] = array(
                    "thumb_media_id"=>$v['media_id'],
                    "author"=>urlencode($v['author']),
                    "title"=>urlencode($v['title']),
                    "content_source_url"=>urlencode($v['url']),
                    "content"=>urlencode(htmlspecialchars(str_replace("\"","'",$content))),//需要str_replace將上引號換成單引號
                    "digest"=>urlencode($v['description']),
                    "show_cover_pic"=>"0"
                );
            }
            //將數(shù)組轉(zhuǎn)為json
            $postArr = htmlspecialchars_decode(urldecode(json_encode($postArr)));
            //調(diào)用上傳素材接口
            $url = 'https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token='.$access_token;
            //上傳整個素材post
            $res = $this->http_curl($url,'post','json',$postArr);
            $media_id = $res['media_id'];//群發(fā)素材的media_id
            $url= "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=".$access_token;
            $postArr = array(
                "filter"=>[
                    "is_to_all"=>true,
                ],
                "mpnews"=>[
                    "media_id"=>$media_id
                ],
                "msgtype"=>"mpnews"
            );
            $postArr = json_encode( $postArr );
            $res = $this->http_curl($url,'post','json',$postArr);
            if( $res['errcode']==0 && $res['msg_data_id'] ){
                $this->MassObj->setField('put_time',time());
                $this->ajaxReturn( array( 'code'=>0,'msg'=>'發(fā)送成功!' ) );
            }else{
                $this->ajaxReturn( array( 'code'=>1,'msg'=>$res['errcode'].':'.$res['errmsg'] ) );
            }
        }else{
            $this->ajaxReturn( array( 'code'=>1,'msg'=>'無效操作' ) );
        }
    }
}

預覽接口

public function send(){
        //Gl8DWQUSQHXlB7IBKXcyqF79PSS9Mm_rTvwJsIHx_rPs3oMgWR8tB6l5Z4CNStXo
        if( !empty( $_POST ) ){
            $id = I('post.id');
            $data = $this->MassReturnObj->order('mass_order')->where(array('mass_id'=>$id))->select();
            $access_token = $this->getWxAccessToken();
            foreach( $data as $k=>$v){
                //調(diào)用基礎(chǔ)支持的上傳多媒體文件
                $url="http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={$access_token}&type=image";
                $arr = array('media'=>'@'.$_SERVER['DOCUMENT_ROOT'].$v['pic_url'],'form-data'=>$v['pic_url']);
                $res = $this->http_curl($url,'post','',$arr);
                if( !$res ){
                    $this->ajaxReturn( array( 'code'=>1,'msg'=>'id為'.$v['id'].'的數(shù)據(jù)標題圖圖片上傳失敗!' ) );
                }
                echo "1111<br />";var_dump($res);echo "<br />";
                $v['media_id'] = $res['media_id'];//標題圖的thumb_media_id
                $v['wxpic'] = $res['url'];
                $content = $v['content'];
                preg_match_all('/<img.*?src="(.*?)".*?>/is',$content,$arr);//提取所有img的src
                $url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={$access_token}&type=image";
                //將內(nèi)容里面的所有img圖片上傳到微信服務器,并替換新的圖片地址
                foreach( $arr[1] as $k1=>$vo ){
                    $arr = array('media'=>'@'.$_SERVER['DOCUMENT_ROOT'].$vo,'form-data'=>$vo);
                    //調(diào)用圖片上傳到微信服務器接口
                    $res = $this->http_curl($url,'post','',$arr);
                    if( !$res['url'] ){
                        $this->ajaxReturn( array( 'code'=>1,'msg'=>'id為'.$v['id'].'的消息內(nèi)容頁面的第'.($k1+1).'張圖片上傳失敗!' ) );
                    }
                    $content = str_replace($vo,$res['url'],$content);
                }
                //拼接數(shù)組
                $postArr['articles'][] = array(
                    "thumb_media_id"=>$v['media_id'],
                    "author"=>urlencode($v['author']),
                    "title"=>urlencode($v['title']),
                    "content_source_url"=>urlencode($v['url']),
                    "content"=>urlencode(htmlspecialchars(str_replace("\"","'",$content))),
                    "digest"=>urlencode($v['description']),
                    "show_cover_pic"=>"0"
                );
            }
            //將數(shù)組轉(zhuǎn)為json
            $postArr = htmlspecialchars_decode(urldecode(json_encode($postArr)));
            //調(diào)用上傳素材接口
            $url = 'https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token='.$access_token;
            //上傳整個素材post
            $res = $this->http_curl($url,'post','json',$postArr);
            echo "1111<br />";var_dump($res);echo "<br />";
            $media_id = $res['media_id'];//群發(fā)素材的media_id
            $url= "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=".$access_token;
            $postArr = array(
                "touser"=>"oV3xFwbYr3X4sYFepGUgDNgn6cGg",
                "mpnews"=>[
                    "media_id"=>$media_id
                ],
                "msgtype"=>"mpnews"
            );
            $postArr = json_encode( $postArr );
            $res = $this->http_curl($url,'post','json',$postArr);
            echo "1111<br />";var_dump($res);
            if( $res['errcode']==0 && $res['errmsg'] ){
//                $this->MassObj->setField('is_send',1);
                $this->ajaxReturn( array( 'code'=>0,'msg'=>'發(fā)送成功!' ) );
            }else{
                $this->ajaxReturn( array( 'code'=>1,'msg'=>$res['errcode'].':'.$res['errmsg'] ) );
            }
        }else{
            $this->ajaxReturn( array( 'code'=>1,'msg'=>'無效操作' ) );
        }
    }

可以將上面的echo去掉,不去的話可以看返回值,調(diào)試用
用到的函數(shù)

/**
     *
     *獲取全局access_token
     * @return $access_token string
     */
    function getWxAccessToken(){
        //將access_token存在session中
        if( $_SESSION['access_token'] && $_SESSION['expire_time']>time() ){
            return $_SESSION['access_token'];
        }else{
            $this->conf = M('Wechat')->find(1);
            //如果access_token不存在或者過期,重新獲取
            $appid = $this->conf['appid'];//公眾號的appid
            $appsecret =  $this->conf['appsecret'];//公眾號的appsecret 
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
            $res = $this->http_curl($url);
            $access_token = $res['access_token'];
            //將獲取到的access_token存到session
            $_SESSION['access_token'] = $access_token;
            $_SESSION['expire_time'] = time()+7000;//access_token過期時間為2小時,所以把session過期時間也修改過來
            return $access_token;
        }
    }
    /**
     *
     *$url 接口url string
     *$type 請求類型 string
     *$res 返回數(shù)據(jù)類型 string
     *$arr post請求參數(shù) array
     *
     */
    public function http_curl($url,$type='get',$res='json',$arr=''){
        //1.初始化curl
        $ch = curl_init();
        //2.設(shè)置curl的參數(shù)
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        if($type == 'post'){
            curl_setopt($ch,CURLOPT_POST,1);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
        }
        //3.采集
        $output = curl_exec($ch);
        //4.關(guān)閉
        curl_close($ch);
        if($res == 'json'){
            if( curl_error($ch) ){
                return curl_error($ch);//請求失敗返回錯誤信息
            }else{
                return json_decode($output,true);//請求成功返回json
            }
        }else{
            if( curl_error($ch) ){
                return curl_error($ch);//請求失敗返回錯誤信息
            }else{
                return json_decode($output,true);//請求成功返回json
            }
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容