摘要:拍照获取从手机相册选择图片也是移动端比较常用的一个功能,前面已经通过JS-SDK实现了分享接口,接下来就来通过JS-SDK实现拍照或者从手机相册选择照片的功能。
拍照获取从手机相册选择图片也是移动端比较常用的一个功能,前面已经通过JS-SDK实现了分享接口,接下来就来通过JS-SDK实现拍照或者从手机相册选择照片的功能。
拍照/手机相册选图接口的实现步骤,跟前面分享的分享功能其实是差不多的,这里唯一的区别是,前面分享接口是进入页面后自动触发的,而本次分享的教程里是通过按钮来触发拍照/手机相册选图功能的。
下面把代码放出来:
视图页面代码:(主要用到的接口:chooseImage)
<!DOCTYPE html> <html> <head> <title>公众号JS-SDK 拍照/手机相册选图</title> <meta charset="utf-8"> <mate name="viewpoint" content="inital-scale=1.0;width=device-width"> <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script> </head> <body> <!-- <p>{$title}</p> <p>{$description}</p> <p>{$url}</p> <p><img src="{$thumb}"></p> --> <script type="text/javascript"> wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '{$appid}', // 必填,公众号的唯一标识 timestamp: {$time}, // 必填,生成签名的时间戳 nonceStr: '{$nonceStr}', // 必填,生成签名的随机串 signature: '{$signature}',// 必填,签名 jsApiList: [ 'chooseImage', ] // 必填,需要使用的JS接口列表 }); wx.ready(function(){ }); //因为这里 拍照/相册选择图片 功能是通过按钮点击来触发的 //所以 wx.chooseImage 要放在 wx.ready 外面,以便点击按钮时可以触发事件函数 function show(){ //相册 wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: function (res) { var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片 } }); } wx.error(function(res){ }); </script> <button onclick="show();">选择相册图片</button> </body> </html>
控制器代码:
public function album() { $timestamp = time(); $ticket = $this->getTicket(); $nonceStr = $this->getRCode(); $url = '###'; //当前控制器方法的完整访问路径 $signature = "jsapi_ticket={$ticket}&noncestr={$nonceStr}×tamp={$timestamp}&url={$url}"; $signature = sha1($signature); $this->assign([ 'time' => $timestamp, 'appid' =>$this->appid, 'nonceStr' => $nonceStr, 'signature' => $signature, 'ticket' => $ticket, ]); return $this->fetch(); } //获取 js_api_ticket private function getTicket() { if (Session::get('ticket') && Session::get('ticket_expire_time')>time() ) { return Session::get('ticket'); }else{ $accessToken = $this->_getAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$accessToken}&type=jsapi"; $res = $this->ch($url); //url请求 $ticket = $res['ticket']; Session::set('ticket',$ticket); Session::set('ticket_expire_time',time()+7200); return $ticket; } } //获取 nonceStr 随机字符串 private function getRCode($length = 16) { $arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z')); $arrLen = count($arr); $str = ''; for ($i=0; $i<$length; $i++) { $str .= $arr[mt_rand(0, ($arrLen-1))]; } return $str; } //url请求 private function ch($url, $type='get', $res='json', $arr='') { $ch = curl_init(); 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); } $cnt = curl_exec($ch); if (curl_errno($ch)) { return; } curl_close($ch); if ($res == 'json') { return json_decode($cnt, true); } return $cnt; }
从上面控制器的代码上来看,可以发现几乎和之前实现分享接口时控制器里的代码一样
下面来看看效果截图(需要用公众号扫码来访问控制器 album 方法:用二维码生成工具生成二维码,然后打开微信扫描)
点击相册选择按钮后成功调出手机相册列表界面:
确定选择图片后的提示:
取消选择图片的提示:
拍照/相册选择图片的接口到这也就实现了,JS-SDK中还有很多其他的接口,大多都可以参照这样的方式来实现。