Maison  >  Article  >  développement back-end  >  PHP gère l'interception des téléchargements de photos par le SDK WeChat

PHP gère l'interception des téléchargements de photos par le SDK WeChat

不言
不言original
2018-04-26 13:43:281948parcourir

Cet article présente principalement le traitement PHP des téléchargements de photos interceptés par le SDK WeChat. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Cadre TP3.2 de traitement côté PHP<.>

Un : Nom de la classe :

namespace Home\Controller;
use Think\Controller;
use  app\common\Curl;
class ParentController extends Controller
{
    public function __construct(){
        parent::__construct();
        $this->appId = &#39;你的appid&#39;;
        $this->appSecret = &#39;你的appSecret&#39;;
        $openid = session(&#39;openid&#39;);
        // session("openid",&#39;ogC7U1XRM3ZOqjLZ99O2coJjYsrU&#39;);
        if(!$openid){
            $this->get_openid();
        }
    }


Deux : Méthode :

Renvoyer les paramètres WeChat nécessaires au client :

/**
     * 给客户端返回必要微信参数
     * @Author   TGHan
     * @DateTime 2018-04-26
     * @return   [type]     [description]
     */
    public function modifyinfor() {
        $jsapiTicket = $this->getJsApiTicket();
        // 注意 URL 一定要动态获取,不能 hardcode.
        $protocol = (!empty($_SERVER[&#39;HTTPS&#39;]) && $_SERVER[&#39;HTTPS&#39;] !== &#39;off&#39; || $_SERVER[&#39;SERVER_PORT&#39;] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $timestamp = time();
        $nonceStr = $this->createNonceStr();
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
        $signature = sha1($string);
        $signPackage = array(
          "appId"     => $this->appId,
          "nonceStr"  => $nonceStr,
          "timestamp" => $timestamp,
          "url"       => $url,
          "signature" => $signature,
          "rawString" => $string
        );
        $this->assign(&#39;signPackage&#39;,$signPackage);
        $this->display();
    }


    public function createNonceStr($length = 16) {
        $chars ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }


    public function getJsApiTicket() {
        // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
        $data =json_decode(file_get_contents("jsapi_ticket.json"));
        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            // 如果是企业号用以下 URL 获取 ticket
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;
            if ($ticket) {
                $data->expire_time = time() + 7000;
                $data->jsapi_ticket = $ticket;
                $fp = fopen("jsapi_ticket.json", "w");
                fwrite($fp, json_encode($data));
                fclose($fp);
            }
        } else {
            $ticket = $data->jsapi_ticket;
        }
        return $ticket;
    }


    public function getAccessToken() {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        $data =json_decode(file_get_contents("access_token.json"));
        if ($data->expire_time < time()) {
            // 如果是企业号用以下URL获取access_token
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                $data->expire_time = time() + 7000;
                $data->access_token = $access_token;
                $fp = fopen("access_token.json", "w");
                fwrite($fp, json_encode($data));
                fclose($fp);
            }
        } else {
            $access_token = $data->access_token;
        }
        return $access_token;
    }


    public function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
        // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
        curl_setopt($curl, CURLOPT_URL, $url);


        $res = curl_exec($curl);
        curl_close($curl);


        return $res;
    }
Trois : Méthode :

Téléchargement d'images

1. Définissez le chemin du fichier et écrivez le flux d'images

2. le serveur WeChat

3. Téléchargez l'image et renvoyez le chemin de l'image au client

/*图片
    * 获取media_id 
    */  
    public function upload_head(){  
        if(IS_POST){  
            $serverId = I(&#39;post.media_id&#39;);  
            if(!empty($serverId)){  
                $news_file = $this->doWechatPic( $serverId );
                $this->ajaxReturn(array("is_success"=>"success","msg"=>"上传成功","url"=>$news_file));
            }else{
                $this->ajaxReturn(array("is_success"=>"error","msg"=>"上传失败1"));
            }
        } 
    }  


    /* 
    * 从微信服务器获取图片流 
    */  
    public function doWechatPic($serverId){//media_id=jlJs_iQIOA-TKLuhk4nCdPEdXnJ6paIeToO8vr-WUGvz05-6i5n498EzI232xSxn  
        $media_id = $serverId;//提交过来的serverId即$media_id     
        $access_token = $this->getAccessToken();
        $pic_url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={$access_token}&media_id={$media_id}";  
        $filebody = file_get_contents($pic_url);//通过接口获取图片流  
        $filename = date("Ymd").&#39;_&#39;.uniqid().&#39;.jpg&#39;;//定义图片名字及格式  
        return $this->saveFile($filename, $filebody);  
    }  


    /* 
    * 定义文件路径,写入图片流 
    */  
    public function saveFile($filename, $filecontent){  
        $upload_dir = "./Public/static/images/headers";//保存路径,以时间作目录分层  
        $mkpath = $upload_dir;          
        if(!is_dir($mkpath)){  
            if(!mkdir($mkpath)){  
                die(&#39;no mkdir power&#39;);  
            }  
            if(!chmod($mkpath,0755)){//若服务器在阿里云上不建议使用0644  
                die(&#39;no chmod power&#39;);  
            }  
        }
        $savepath = $upload_dir.&#39;/&#39;.$filename;       
        if(file_put_contents($savepath, $filecontent)){//写入图片流生成图片
            $news_file = substr($savepath,1);
            return $news_file;//返回图片路径  
        }else{  
            die(&#39;save failed&#39;);  
        }  


    }
Quatre : Une fois l'image téléchargée, le client renvoie le chemin de l'image et l'insère dans le

public function save_child(){
        $openid = session("openid");
        $class_tid = session("class_tid");
        if(IS_POST){
            $data = array();
            $data[&#39;cd_head&#39;] = I(&#39;post.cd_head&#39;) ? I(&#39;post.cd_head&#39;) : &#39;&#39;;
            $data[&#39;cd_name&#39;] = I(&#39;post.cd_name&#39;) ? I(&#39;post.cd_name&#39;) : &#39;&#39;;
            $data[&#39;cd_birthday&#39;] = I(&#39;post.cd_birthday&#39;) ? I(&#39;post.cd_birthday&#39;) : &#39;&#39;;
            $data[&#39;cd_sex&#39;] = I(&#39;post.cd_sex&#39;) ? I(&#39;post.cd_sex&#39;) : &#39;&#39;;
            $editData = M("parent_child")->where("class_tid=&#39;{$class_tid}&#39; and wx_openid=&#39;{$openid}&#39;")->save($data);
            if($editData !== false){
                $this->ajaxReturn(array("is_success"=>"success","msg"=>"修改成功"));
            }else{
                $this->ajaxReturn(array("is_success"=>"error","msg"=>"修改失败"));
            }
        }
    }
Connexe recommandé :

Comment traiter les fichiers téléchargés par formulaire en PHP

Étapes du traitement des images au format BMP en PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn