91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信JS-SDK之圖像接口開發的示例分析

發布時間:2021-09-10 10:17:45 來源:億速云 閱讀:121 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“微信JS-SDK之圖像接口開發的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“微信JS-SDK之圖像接口開發的示例分析”這篇文章吧。

  一、我的思路是:

先調用“拍照或從手機相冊選擇圖片接口”—>選擇成功圖片后—>調用“上傳圖片接口”—>上傳成功后(也就是圖片上傳到了微信服務器上)—>調用“下載圖片接口”—>將圖片下載到自己的服務器存儲。

  二、JSSDK的使用步驟

  1、概述 

  微信JS-SDK是微信公眾平臺面向網頁開發者提供的基于微信內的網頁開發工具包。

  通過使用微信JS-SDK,網頁開發者可借助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信用戶提供更優質的網頁體驗。

  2、使用步驟

  步驟一:綁定域名

  先登錄微信公眾平臺進入“公眾號設置”的“功能設置”里填寫“JS接口安全域名”。

  備注:登錄后可在“開發者中心”查看對應的接口權限。

  步驟二:引入JS文件

  在需要調用JS接口的頁面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

  步驟三:通過config接口注入權限驗證配置

  所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調用(同一個url僅需調用一次,對于變化url的SPA的web app可在每次url變化時進行調用)

wx.config({
    debug: true, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。
    appId: '', // 必填,公眾號的唯一標識
    timestamp: , // 必填,生成簽名的時間戳
    nonceStr: '', // 必填,生成簽名的隨機串
    signature: '',// 必填,簽名,見附錄1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
});
  步驟四:通過ready接口處理成功驗證
wx.ready(function(){

    // config信息驗證后會執行ready方法,所有接口調用都必須在config接口獲得結果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對于用戶觸發時才調用的接口,則可以直接調用,不需要放在ready函數中。
});
  步驟五:通過error接口處理失敗驗證
wx.error(function(res){

    // config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對于SPA可以在這里更新簽名。

});

  接口調用說明

  所有接口通過wx對象(也可使用jWeixin對象)來調用,參數是一個對象,除了每個接口本身需要傳的參數之外,還有以下通用參數:

  1. success:接口調用成功時執行的回調函數。

  2. fail:接口調用失敗時執行的回調函數。

  3. complete:接口調用完成時執行的回調函數,無論成功或失敗都會執行。

  4. cancel:用戶點擊取消時的回調函數,僅部分有用戶取消操作的api才會用到。

  5. trigger: 監聽Menu中的按鈕點擊時觸發的方法,該方法僅支持Menu中的相關接口。

  備注:不要嘗試在trigger中使用ajax異步請求修改本次分享的內容,因為客戶端分享操作是一個同步操作,這時候使用ajax的回包會還沒有返回。


  以上幾個函數都帶有一個參數,類型為對象,其中除了每個接口本身返回的數據之外,還有一個通用屬性errMsg,其值格式如下:

    1. 調用成功時:"xxx:ok" ,其中xxx為調用的接口名

    2. 用戶取消時:"xxx:cancel",其中xxx為調用的接口名

    3. 調用失敗時:其值為具體錯誤信息

  三、開發及代碼分析詳解(用的是CI框架,只要是MVC模式都可以)

  1、先在服務器端取到:公眾號的唯一標識appId、生成簽名的時間戳timestamp、生成簽名的隨機串nonceStr、簽名signature。

<?php
class wx_upload extends xx_Controller {
    public function __construct() {
        parent::__construct();
    }
 
    public function wxUploadImg() {
        //在模板里引入jssdk的js文件
        $this->addResLink('http://res.wx.qq.com/open/js/jweixin-1.0.0.js');
        //取得:公眾號的唯一標識appId、生成簽名的時間戳timestamp、生成簽名的隨機串nonceStr、簽名signature這些值,并以json形式傳到模板頁面
        $this->smartyData['wxJsApi'] = json_encode(array('signPackage' => $this->model->weixin->signPackage()));
    }

圖片上傳控制器

<?php
    class WxModel extends ModelBase{
        public $appId;
        public $appSecret;
        public $token;

        public function __construct() {
            parent::__construct();

            //審核通過的移動應用所給的AppID和AppSecret
            $this->appId = 'wx0000000000000000';
            $this->appSecret = '00000000000000000000000000000';
            $this->token = '00000000';
        }

        /**
         * 獲取jssdk所需參數的所有值
         * @return array
         */
        public function signPackage() {
            $protocol = (!empty($_SERVER['HTTPS'] && $_SERVER['HTTPS'] == 'off' || $_SERVER['port'] == 443)) ? 'https://' : 'http://';
            //當前網頁的URL
            $url = "$protocol$_SERVER['host']$_SERVER['REQUEST_URI']";
            //生成簽名的時間戳
            $timestamp = time();
            //生成簽名的隨機串
            $nonceStr = $this->createNonceStr();
            //獲取公眾號用于調用微信JS接口的臨時票據
            $jsApiTicket = $this->getJsApiTicket();
            //對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)后,
            //使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串$str。
            //這里需要注意的是所有參數名均為小寫字符
            $str = "jsapi_ticket=$jsApiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
            //對$str進行sha1簽名,得到signature:
            $signature = sha1($str);
            $signPackage = array(
                "appId"     => $this->AppId,
                "nonceStr"  => $nonceStr,
                "timestamp" => $timestamp,
                "url"       => $url,
                "signature" => $signature,
                "rawString" => $string
                );
            return $signPackage;
        }

        /**
         * 創建簽名的隨機字符串
         * @param  int $length 字符串長度
         * @return string      隨機字符串
         */
        private function createNonceStr($length == 16) {
            $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
            $str = '';
            for ($i=0; $i < $length; $i++) { 
                $str .= substr(mt_rand(0, strlen($chars)), 1);
            }
            return $str;
        }

        /**
         * 獲取公眾號用于調用微信JS接口的臨時票據
         * @return string 
         */
        private function getJsApiTicket() {
            //先查看redis里是否存了jsapi_ticket此值,假如有,就直接返回
            $jsApiTicket = $this->library->redisCache->get('weixin:ticket');
            if (!$jsApiTicket) {
                //先獲取access_token(公眾號的全局唯一票據)
                $accessToken = $this->getApiToken();
                //通過access_token 采用http GET方式請求獲得jsapi_ticket
                $result = $this->callApi("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$accessToken&type=jsapi");
                //得到了jsapi_ticket
                $jsApiTicket = $result['ticket'];
                //將jsapi_ticket緩存到redis里面,下次就不用再請求去取了
                $expire = max(1, intval($result['expire']) - 60);
                $this->library->redisCache->set('weixin:ticket', $jsApiTicket, $expire);
            }
            return $jsApiTicket;
        }

        /**
         * 獲取眾號的全局唯一票據access_token
         * @param  boolean $forceRefresh 是否強制刷新
         * @return string                返回access_token
         */
        private function getApiToken($forceRefresh = false) {
            //先查看redis是否存了accessToken,如果有了,就不用再去微信server去請求了(提高效率)
            $accessToken = $this->library->redisCache->get('weixin:accessToken');
            //強制刷新accessToken或者accessToken為空時就去請求accessToken
            if ($forceRefresh || empty($accessToken)) {
                //請求得到accessToken
                $result = $this->callApi("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}");
                $accessToken = $result['access_token'];
                $expire = max(1, intval($result['expire']) - 60);
                //將其存進redis里面去
                $this->library->redisCache->set('weixin:accessToken', $accessToken, $expire);
            }
            return $accessToken;
        }

獲取到appId、nonceStr、timestamp、signature模型

  這里要補充一些 JS-SDK使用權限簽名算法 的思路和注意點(這里我直接復制官網文檔給大家看看)

    jsapi_ticket

    生成簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是公眾號用于調用微信JS接口的臨時票據。正常情況下,jsapi_ticket的有效期為7200秒,通過access_token來獲取。由于獲取jsapi_ticket的api調用次數非常有限,頻繁刷新jsapi_ticket會導致api調用受限,影響自身業務,開發者必須在自己的服務全局緩存jsapi_ticket 。

    1、獲取access_token(有效期7200秒,開發者必須在自己的服務全局緩存access_token)

    2、用第一步拿到的access_token 采用http GET方式請求獲得jsapi_ticket(有效期7200秒,開發者必須在自己的服務全局緩存jsapi_ticket)

      https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

    成功返回如下JSON:

{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}

    獲得jsapi_ticket之后,就可以生成JS-SDK權限驗證的簽名了。

    簽名算法

    簽名生成規則如下:參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其后面部分) 。對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數名均為小寫字符。對string1作sha1加密,字段名和字段值都采用原始值,不進行URL 轉義。
    即signature=sha1(string1)。 示例:


    • noncestr=Wm3WZYTPz0wzccnW

    • jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg

    • timestamp=1414587457

    • url=http://mp.weixin.qq.com?params=value

    步驟1. 對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1:

      jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://www.php.cn/

    步驟2. 對string1進行sha1簽名,得到signature:

      0f9de62fce790f9a083d5c99e95740ceb90c27ed

    注意事項

      1.簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。

      2.簽名用的url必須是調用JS接口頁面的完整URL。

      3.出于安全考慮,開發者必須在服務器端實現簽名的邏輯。

  2、取到我們所需要的值后,就在js文件里面開始使用了

  uploadImg.tpl

<script>
        $(function(){
            $.util.wxMenuImage('{$wxJsApi|default:""}')
        });
</script>

  uploadImg.js

if(typeof($util)=='undefined')$util={};

$.util.wxMenuImage = function(json) {
    if (json.length == 0) return; 
    //解析json變成js對象
    wxJsApi = JSON.parse(json);

    //通過config接口注入權限驗證配置
    wx.config({
        debug: false,   //開啟調試模式,調用的所有api的返回值會在客戶端alert出來
        appId: wxJsApi.signPackage.appId,   //公眾號的唯一標識
        timestamp: wxJsApi.signPackage.timestamp,   //生成簽名的時間戳
        nonceStr: wxJsApi.signPackage.nonceStr, //生成簽名的隨機串
        signature: wxJsApi.signPackage.signature,   //簽名
        jsApiList: ['chooseImage', 'uploadImage']   //需要使用的JS接口列表 這里我用了選擇圖片和上傳圖片接口
    });

    //通過ready接口處理成功驗證,config信息驗證后會執行ready方法,所有接口調用都必須在config接口獲得結果之后
    wx.ready(function(){
        //得到上傳圖片按鈕
        document.querySelector('#uploadImage').onclick = function() {
            var images = {localId:[],serverId:[]};
            //調用 拍照或從手機相冊中選圖接口
            wx.chooseImage({
                success: function(res) {
                    if (res.localIds.length != 1) {
                        alert('只能上傳一張圖片');
                        return;
                    }
                    //返回選定照片的本地ID列表
                    iamges.localId = res.localIds;
                    images.serverId = [];
                    //上傳圖片函數
                    function upload() {
                        //調用上傳圖片接口
                        wx.uploadImage({
                            localId: images.localId[0], // 需要上傳的圖片的本地ID,由chooseImage接口獲得
                            isShowProcess: 1,   // 默認為1,顯示進度提示
                            success: function(res) {
                                //返回圖片的服務器端ID res.serverId,然后調用wxImgCallback函數進行下載圖片操作
                                wxImgCallback(res.serverId);
                            },
                            fail: function(res) {
                                alert('上傳失敗');
                            }
                        });
                    }
                    upload();
                }
            });
        }
    });
}


function wxImgCallback(serverId) {
    //將serverId傳給wx_upload.php的upload方法
    var url = 'wx_upload/upload/'+serverId;
    $.getJSON(url, function(data){
        if (data.code == 0) {
            alert(data.msg);
        } else if (data.code == 1) {
            //存儲到服務器成功后的處理
            //
        }
    });
}

圖片選擇和圖片上傳接口調用

圖片選擇和圖片上傳接口調用

  3、圖片上傳完成后會返回一個serverId,然后通過這個來下載圖片到本地服務器

  這里先補充下如何調用下載圖片接口(我直接復制官方文檔的說明了)

    公眾號可調用本接口來獲取多媒體文件。請注意,視頻文件不支持下載,調用該接口需http協議。

    接口調用請求說明

    http請求方式: GET
     http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID

    參數說明

參數是否必須說明
access_token調用接口憑證
media_id媒體文件ID

    返回說明

    正確情況下的返回HTTP頭如下:

      HTTP/1.1 200 OK
      Connection: close
      Content-Type: image/jpeg 
      Content-disposition: attachment; filename="MEDIA_ID.jpg"
      Date: Sun, 06 Jan 2013 10:20:18 GMT
      Cache-Control: no-cache, must-revalidate
      Content-Length: 339721
      curl -G "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"

    錯誤情況下的返回JSON數據包示例如下(示例為無效媒體ID錯誤)::

      {"errcode":40007,"errmsg":"invalid media_id"}


 接下來看自己寫的代碼
 wx_upload.php
/*********************圖片下載到本地服務器****************************************/
    //從微信服務器讀取圖片,然后下載到本地服務器
    public function upload($media_id) {
        //圖片文件名
        $fileName = md5($this->wxId."/$media_id");
        //調用下載圖片接口,返回路徑
        $path = $this->weixin->wxDownImg($media_id, sys_get_temp_dir()."$fileName");
        if ($path != false) {
            //將圖片的路徑插入數據庫去存儲
            if ($this->model->weixin->updateByWxid($this->wxId, array('img_path'=>$path))) {
                $this->output->_display(json_encode(
                    array(
                            'code'=>1,
                            'msg'=>'上傳成功',
                            'fileUrl' =>$path;
                        )
                ));
            } else {
                $this->output->_display(json_encode2(array('code'=>0,'msg' => '上傳失敗','err'=>'1')));
            }
        } else {
            $this->output->_display(json_encode2(array('code'=>0,'msg' => '上傳失敗','err'=>'2')));
        }
        
    }

從微信服務器下載圖片到本地存儲

//從微信服務器端下載圖片到本地服務器
        public function wxDownImg($media_id, $path) {
            //調用 多媒體文件下載接口
            $url = "https://cache.yisu.com/upload/information/20201208/260/13216', 'image/gif'=>'.gif', 'image/jpeg'=>'.jpg', 'image/png'=>'.png');
            //判斷響應首部里的的content-type的值是否是這四種圖片類型
            if (isset($types[$info['header']['content_type']])) {
                //文件的uri
                $path = $path.$types[$info['header']['content_type']];
            } else {
                return false;
            }

            //將資源寫入文件里
            if ($this->saveFile($path, $info['body'])) {
                //將文件保存在本地目錄
                $imgPath = rtrim(base_url(), '/').'/img'.date('Ymd').'/'.md5($this->controller->wxId.$media_id).$types[$info['header'['content_type']]];
                if (!is_dir($imgPath)) {
                    if(mkdir($imgPath)) {
                        if (false !== rename($path, $imgPath) {
                            return $imgPath;
                        }
                    }
                }
                return $path;
            }

            return false;

        }

        /**
         * curl請求資源
         * @param  string $url 請求url
         * @return array 
         */
        private function curl_request($url = '') {
            if ($url == '') return;
            $ch = curl_init();
            //這里返回響應報文時,只要body的內容,其他的都不要
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_NOBODY, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $package = curl_exec($ch);
            //獲取curl連接句柄的信息
            $httpInfo = curl_getinfo($ch);
            curl_close($ch);

            $info = array_merge(array($package), array($httpInfo));

            return $info;

        }

        /**
         * 將資源寫入文件
         * @param  string 資源uri
         * @param  source 資源
         * @return boolean 
         */
        private function saveFile($path, $fileContent) {
            $fp = fopen($path, 'w');
            if (false !== $localFile) {
                if (false !== fwrite($fp, $fileContent)) {
                    fclose($fp);
                    return true;
                }
            }
            return false;
        }

從微信服務器下載圖片到本地存儲接口

  到這里,已經完成了:

    先調用“拍照或從手機相冊選擇圖片接口”—>選擇成功圖片后—>調用“上傳圖片接口”—>上傳成功后(也就是圖片上傳到了微信服務器上)—>調用“下載圖片接口”—>將圖片下載到自己的服務器存儲。

  這一思路的實現。我們用到了微信的選擇圖片接口、上傳圖片接口和下載媒體資源接口。

  下面我附上這一接口開發的全部代碼:

<?php
class wx_upload extends xx_Controller {
    public function __construct() {
        parent::__construct();
    }
 
    public function wxUploadImg() {
        //在模板里引入jssdk的js文件
        $this->addResLink('http://res.wx.qq.com/open/js/jweixin-1.0.0.js');
        //取得:公眾號的唯一標識appId、生成簽名的時間戳timestamp、生成簽名的隨機串nonceStr、簽名signature這些值,并以json形式傳到模板頁面
        $this->smartyData['wxJsApi'] = json_encode(array('signPackage' => $this->model->weixin->signPackage()));
    }

    /*********************圖片下載到本地服務器****************************************/
    //從微信服務器讀取圖片,然后下載到本地服務器
    public function upload($media_id) {
        //圖片文件名
        $fileName = md5($this->wxId."/$media_id");
        //調用下載圖片接口,返回路徑
        $path = $this->weixin->wxDownImg($media_id, sys_get_temp_dir()."$fileName");
        if ($path != false) {
            //將圖片的路徑插入數據庫去存儲
            if ($this->model->weixin->updateByWxid($this->wxId, array('img_path'=>$path))) {
                $this->output->_display(json_encode(
                    array(
                            'code'=>1,
                            'msg'=>'上傳成功',
                            'fileUrl' =>$path;
                        )
                ));
            } else {
                $this->output->_display(json_encode2(array('code'=>0,'msg' => '上傳失敗','err'=>'1')));
            }
        } else {
            $this->output->_display(json_encode2(array('code'=>0,'msg' => '上傳失敗','err'=>'2')));
        }
        
    }
}



?>
<?php
    class WxModel extends ModelBase{
        public $appId;
        public $appSecret;
        public $token;

        public function __construct() {
            parent::__construct();

            //審核通過的移動應用所給的AppID和AppSecret
            $this->appId = 'wx0000000000000000';
            $this->appSecret = '00000000000000000000000000000';
            $this->token = '00000000';
        }

        /**
         * 獲取jssdk所需參數的所有值
         * @return array
         */
        public function signPackage() {
            $protocol = (!empty($_SERVER['HTTPS'] && $_SERVER['HTTPS'] == 'off' || $_SERVER['port'] == 443)) ? 'https://' : 'http://';
            //當前網頁的URL
            $url = "$protocol$_SERVER['host']$_SERVER['REQUEST_URI']";
            //生成簽名的時間戳
            $timestamp = time();
            //生成簽名的隨機串
            $nonceStr = $this->createNonceStr();
            //獲取公眾號用于調用微信JS接口的臨時票據
            $jsApiTicket = $this->getJsApiTicket();
            //對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)后,
            //使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串$str。
            //這里需要注意的是所有參數名均為小寫字符
            $str = "jsapi_ticket=$jsApiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
            //對$str進行sha1簽名,得到signature:
            $signature = sha1($str);
            $signPackage = array(
                "appId"     => $this->AppId,
                "nonceStr"  => $nonceStr,
                "timestamp" => $timestamp,
                "url"       => $url,
                "signature" => $signature,
                "rawString" => $string
                );
            return $signPackage;
        }

        /**
         * 創建簽名的隨機字符串
         * @param  int $length 字符串長度
         * @return string      隨機字符串
         */
        private function createNonceStr($length == 16) {
            $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
            $str = '';
            for ($i=0; $i < $length; $i++) { 
                $str .= substr(mt_rand(0, strlen($chars)), 1);
            }
            return $str;
        }

        /**
         * 獲取公眾號用于調用微信JS接口的臨時票據
         * @return string 
         */
        private function getJsApiTicket() {
            //先查看redis里是否存了jsapi_ticket此值,假如有,就直接返回
            $jsApiTicket = $this->library->redisCache->get('weixin:ticket');
            if (!$jsApiTicket) {
                //先獲取access_token(公眾號的全局唯一票據)
                $accessToken = $this->getApiToken();
                //通過access_token 采用http GET方式請求獲得jsapi_ticket
                $result = $this->callApi("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$accessToken&type=jsapi");
                //得到了jsapi_ticket
                $jsApiTicket = $result['ticket'];
                //將jsapi_ticket緩存到redis里面,下次就不用再請求去取了
                $expire = max(1, intval($result['expire']) - 60);
                $this->library->redisCache->set('weixin:ticket', $jsApiTicket, $expire);
            }
            return $jsApiTicket;
        }

        /**
         * 獲取眾號的全局唯一票據access_token
         * @param  boolean $forceRefresh 是否強制刷新
         * @return string                返回access_token
         */
        private function getApiToken($forceRefresh = false) {
            //先查看redis是否存了accessToken,如果有了,就不用再去微信server去請求了(提高效率)
            $accessToken = $this->library->redisCache->get('weixin:accessToken');
            //強制刷新accessToken或者accessToken為空時就去請求accessToken
            if ($forceRefresh || empty($accessToken)) {
                //請求得到accessToken
                $result = $this->callApi("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}");
                $accessToken = $result['access_token'];
                $expire = max(1, intval($result['expire']) - 60);
                //將其存進redis里面去
                $this->library->redisCache->set('weixin:accessToken', $accessToken, $expire);
            }
            return $accessToken;
        }

        //從微信服務器端下載圖片到本地服務器
        public function wxDownImg($media_id, $path) {
            //調用 多媒體文件下載接口
            $url = "https://cache.yisu.com/upload/information/20201208/260/13216', 'image/gif'=>'.gif', 'image/jpeg'=>'.jpg', 'image/png'=>'.png');
            //判斷響應首部里的的content-type的值是否是這四種圖片類型
            if (isset($types[$info['header']['content_type']])) {
                //文件的uri
                $path = $path.$types[$info['header']['content_type']];
            } else {
                return false;
            }

            //將資源寫入文件里
            if ($this->saveFile($path, $info['body'])) {
                //將文件保存在本地目錄
                $imgPath = rtrim(base_url(), '/').'/img'.date('Ymd').'/'.md5($this->controller->wxId.$media_id).$types[$info['header'['content_type']]];
                if (!is_dir($imgPath)) {
                    if(mkdir($imgPath)) {
                        if (false !== rename($path, $imgPath) {
                            return $imgPath;
                        }
                    }
                }
                return $path;
            }

            return false;

        }

        /**
         * curl請求資源
         * @param  string $url 請求url
         * @return array 
         */
        private function curl_request($url = '') {
            if ($url == '') return;
            $ch = curl_init();
            //這里返回響應報文時,只要body的內容,其他的都不要
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_NOBODY, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $package = curl_exec($ch);
            //獲取curl連接句柄的信息
            $httpInfo = curl_getinfo($ch);
            curl_close($ch);

            $info = array_merge(array($package), array($httpInfo));

            return $info;

        }

        /**
         * 將資源寫入文件
         * @param  string 資源uri
         * @param  source 資源
         * @return boolean 
         */
        private function saveFile($path, $fileContent) {
            $fp = fopen($path, 'w');
            if (false !== $localFile) {
                if (false !== fwrite($fp, $fileContent)) {
                    fclose($fp);
                    return true;
                }
            }
            return false;
        }

    }


?>
<html>
    <head>
        
    </head>
    <body>
        <button id="uploadImage">點擊上傳圖片</button>
        <script>
        $(function(){
            $.util.wxMenuImage('{$wxJsApi|default:""}')
        });
        </script>
    </body>
</html>
if(typeof($util)=='undefined')$util={};

$.util.wxMenuImage = function(json) {
    if (json.length == 0) return; 
    //解析json變成js對象
    wxJsApi = JSON.parse(json);

    //通過config接口注入權限驗證配置
    wx.config({
        debug: false,   //開啟調試模式,調用的所有api的返回值會在客戶端alert出來
        appId: wxJsApi.signPackage.appId,   //公眾號的唯一標識
        timestamp: wxJsApi.signPackage.timestamp,   //生成簽名的時間戳
        nonceStr: wxJsApi.signPackage.nonceStr, //生成簽名的隨機串
        signature: wxJsApi.signPackage.signature,   //簽名
        jsApiList: ['chooseImage', 'uploadImage']   //需要使用的JS接口列表 這里我用了選擇圖片和上傳圖片接口
    });

    //通過ready接口處理成功驗證,config信息驗證后會執行ready方法,所有接口調用都必須在config接口獲得結果之后
    wx.ready(function(){
        //得到上傳圖片按鈕
        document.querySelector('#uploadImage').onclick = function() {
            var images = {localId:[],serverId:[]};
            //調用 拍照或從手機相冊中選圖接口
            wx.chooseImage({
                success: function(res) {
                    if (res.localIds.length != 1) {
                        alert('只能上傳一張圖片');
                        return;
                    }
                    //返回選定照片的本地ID列表
                    iamges.localId = res.localIds;
                    images.serverId = [];
                    //上傳圖片函數
                    function upload() {
                        //調用上傳圖片接口
                        wx.uploadImage({
                            localId: images.localId[0], // 需要上傳的圖片的本地ID,由chooseImage接口獲得
                            isShowProcess: 1,   // 默認為1,顯示進度提示
                            success: function(res) {
                                //返回圖片的服務器端ID res.serverId,然后調用wxImgCallback函數進行下載圖片操作
                                wxImgCallback(res.serverId);
                            },
                            fail: function(res) {
                                alert('上傳失敗');
                            }
                        });
                    }
                    upload();
                }
            });
        }
    });
}


function wxImgCallback(serverId) {
    //將serverId傳給wx_upload.php的upload方法
    var url = 'wx_upload/upload/'+serverId;
    $.getJSON(url, function(data){
        if (data.code == 0) {
            alert(data.msg);
        } else if (data.code == 1) {
            //存儲到服務器成功后的處理
            //
        }
    });
}

以上是“微信JS-SDK之圖像接口開發的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梁山县| 秀山| 贵溪市| 类乌齐县| 双峰县| 玛纳斯县| 东乡族自治县| 旬邑县| 南宫市| 额尔古纳市| 崇义县| 牡丹江市| 宝清县| 柏乡县| 四川省| 盘山县| 海晏县| 固阳县| 平武县| 日土县| 萍乡市| 古浪县| 神池县| 平南县| 砚山县| 新营市| 教育| 宜兴市| 应城市| 龙山县| 察隅县| 武胜县| 灵璧县| 宁德市| 穆棱市| 葫芦岛市| 万荣县| 临夏市| 黄山市| 武汉市| 昌图县|