WeChat SDK intercepts photo upload, PHP processing

PHP side processing TP3.2 framework

One: class name:

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



Two: method:

Return the necessary WeChat parameters to the client:

/**
     * Return the necessary WeChat parameters to the client
     * @Author TGHan
     * @DateTime 2018-04-26
     * @return [type] [description]
     */
    public function modifyinfor() {
        $jsapiTicket = $this->getJsApiTicket() ;
        // Note that the URL must be dynamically obtained, not hardcode.
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT' ] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $timestamp = time();
        $nonceStr = $this ->createNonceStr();
        // The order of the parameters here should be sorted in ascending order according to the key value ASCII code
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
        $signature = sha1($string);
        $signPackage = array(
          "appId"     => $this->appId,
          "nonceStr"  => $nonceStr,
          "timestamp" => $timestamp,
          "url"       => $url,
          "signature" => $signature,
          "rawString" => $string
        );
        $this->assign('signPackage',$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 should be stored and updated globally, the following code is written to a file as an example
        $data =json_decode(file_get_contents("jsapi_ticket.json"));
        if ($data ->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            // If it is an enterprise account, use the following URL to get the 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 should be stored and updated globally, the following code is written to a file as an example
        $ data =json_decode(file_get_contents("access_token.json"));
        if ($data->expire_time < time()) {
            // If it is an enterprise account, use the following URL to get 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);
        // To ensure the security of data transmission between the third-party server and the WeChat server, all WeChat interfaces are called in HTTPS mode, and the following 2 lines of code must be used to enable ssl security verification.
        // If the code verification fails here during deployment, please go to http://curl.haxx.se/ca/cacert.pem to download a new certificate discrimination file.
        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;
    }

Three: method:

upload picture

1. Define the file path and write the image stream

2. Get image stream from WeChat server 

3. Upload the image and return the image path to the client

/*图片
    * 获取media_id 
    */  
    public function upload_head(){  
        if(IS_POST){  
            $serverId = I('post.media_id');  
            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       */       * Get picture stream from WeChat server      /*      }           } 
            }








        $media_id = $serverId;//The submitted serverId is $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);//Get the picture stream through the interface  
        $filename = date("Ymd").'_'.uniqid(). '.jpg';//Define the image name and format  
        return $this->saveFile($filename, $filebody);  
    }  


    /* 
    * Define the file path and write to the image stream 
    */  
    public function saveFile($filename, $filecontent) {  
        $upload_dir = "./Public/static/images/headers";//Save the path, use time as the directory hierarchy  
        $mkpath = $upload_dir;          
        if(!  is_dir($mkpath)){  
            if(!mkdir($mkpath)){  
                die('no mkdir power');  
            }  
            if(!chmod($mkpath,0755)){//If the server is on Alibaba Cloud, it is not recommended to use 0644  
                die('no chmod power ');  
            }  
        }
        $savepath = $upload_dir.'/'.$filename;       
        if(file_put_contents($savepath, $filecontent)){//Write image stream to generate image
            $news_file = substr($savepath,1);
            return $news_file;//Return image path  
        }else{  
            die('save failed');  
        }  


    } 

Four: After the image is uploaded, the client returns the image path and inserts it into the database

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324915408&siteId=291194637