我這裡借助微信JSSDK的圖像介面對其進行開發實現圖片上傳的功能,為何我選擇此介面?第一,目前的專案是在微信中打開的網頁,利用此接口,性能肯定是好一點的啦,畢竟是微信自己的東西;第二,用此接口,開發效率更高嘛;第三,最重要的一點,就是它能對圖片進行壓縮,假如一張2M的圖片,透過微信圖片上傳介面可以將圖片壓縮成幾百K的大小,這對網站的效能是很有幫助的。
一、我的想法是:
先呼叫「拍照或從手機相簿選擇圖片介面」—>選擇成功圖片後—>呼叫「上傳圖片介面」—>上傳成功後(也就是圖片上傳到了微信伺服器上)—>呼叫「下載圖片介面」—>將圖片下載到自己的伺服器儲存。
二、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 });
wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 });
wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 });
所有介面透過wx物件(也可使用jWeixin物件)來調用,參數是一個對象,除了每個介面本身需要傳的參數之外,還有以下通用參數:
success:介面呼叫成功時執行的回呼函數。
fail:介面呼叫失敗時執行的回呼函數。
complete:在介面呼叫完成時執行的回呼函數,無論成功或失敗都會執行。
cancel:使用者點擊取消時的回呼函數,只有部分有使用者取消操作的api才會用到。
trigger: 監聽Menu中的按鈕點擊時觸發的方法,該方法僅支援Menu中的相關介面。
備註:不要嘗試在trigger中使用ajax非同步要求修改本次分享的內容,因為客戶端分享操作是一個同步操作,這時候使用ajax的回包會還沒有返回。
以上幾個函數都帶有一個參數,類型為對象,其中除了每個接口本身返回的資料之外,還有一個通用屬性errMsg,其值格式如下:
呼叫成功時:"xxx:ok" ,其中xxx為呼叫的介面名稱
使用者取消時:"xxx:cancel" ,其中xxx為呼叫的介面名稱
呼叫失敗時:其值為具體錯誤訊息
# 三、開發及程式碼分析詳解(用的是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×tamp=$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是公眾號碼用於使用微信的簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是公眾號碼用於使用微信正常情況下,jsapi_ticket的有效期限為7,200秒,透過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×tamp=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://api.weixin.qq.com/cgi-bin/media/get?access_token={$this->model->weixin->_getApiToken()}&media_id=$media_id"; //用curl请求,返回文件资源和curl句柄的信息 $info = $this->curl_request($url); //文件类型 $types = array('image/bmp'=>'.bmp', '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×tamp=$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://api.weixin.qq.com/cgi-bin/media/get?access_token={$this->model->weixin->_getApiToken()}&media_id=$media_id"; //用curl请求,返回文件资源和curl句柄的信息 $info = $this->curl_request($url); //文件类型 $types = array('image/bmp'=>'.bmp', '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之图像接口开发相关文章请关注PHP中文网!