首先利用微信JS-SDK接口,借助微信高效地使用拍照、选图,上传至微信服务器,然后通过微信多媒体接口下载图片到自己的服务器。
1、获取全局的access_token和jsapi_ticket以作备用
使用全局的access_token用来获取jsapi_ticket,并通过微信多媒体接口下载图片到自己的服务器。jsapi_ticket是公众号用于调用微信JS接口的临时票据,用来前端页面调取微信的拍照、选图、上传服务器功能。此过程之前文章已说明,不做详细介绍。
附连接: 微信开发中的access_token和jsapi_ticket
2、使用jsapi_ticket生成SDK权限验证JS-权限签名
参与签名的字段包括
noncestr(随机字符串),
jsapi_ticket
timestamp(时间戳)
url(当前网页的URL,不包含#及其后面部分)
- 1、对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1,这里需要注意的是所有参数名均为小写字符。
- 2、对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
注意事项:
1、签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
2、签名用的url必须是调用JS接口页面的完整URL。
3、出于安全考虑,开发者必须在服务器端实现签名的逻辑
protected function shareConfig(){
$time=time();
//获取当前页面的连接
$localUrl='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
//按照字典序拼接字符串
$str="jsapi_ticket=".getAccessToken('jsapi_ticket')."&noncestr=".$time."×tamp=".$time."&url=".$localUrl;
//选择前台要调用的js接口列表
//【chooseImage】 【uploadImage】 【previewImage】
$this->assign('share_function',json_encode(['onMenuShareTimeline', 'onMenuShareAppMessage','getLocation','chooseImage','uploadImage','downloadImage','previewImage']));
//做sha1加密,生成签名
$this->assign('share_signature',sha1($str));
$this->assign('share_time',$time);
$this->assign('share_appid',$this->appid);
}
3、通过config接口注入权限验证配置(所有需要使用JS-SDK的页面必须先注入配置信息)
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js
当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。
当debug模式,出现错误时,具体查看【微信调用config 接口,开启debug模式,常见错误及解决方法】
<script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
wx.config({
debug: true, //false:关闭调试 开启调试模式,调用的所有api的返回值会在客户端alert出来
appId: "{$share_appid}", // 必填,公众号的唯一标识
timestamp: "{$share_time}", // 必填,生成签名的时间戳
nonceStr: "{$share_time}", // 必填,生成签名的随机串
signature: "{$share_signature}", // 必填,签名
jsApiList:{$share_function} // 必填,需要使用的JS接口列表
});
//error接口,失败时用来查找具体原因
wx.error(function (res) {
if (res.errMsg = 'config:invalid signature') {
//alert("转发接口失效,请联系管理员");
}
});
</script>
4、选择图片并上传到微信服务器
权限验证配置完成后,通过ready接口处理成功验证。
- 1、调用【chooseImage】拍照或从手机相册中选图接口,挑选要上传的图片
- 2、调用【uploadImage】上传图片接口,把图片上传到微信服务器。
- 注:【uploadImage】上传图片有效期3天,此处获得的 serverId 即 media_id
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
wx.uploadImage({
localId: localIds[0], // 需要上传的图片的本地ID,由chooseImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回图片的服务器端ID
//此处将取得的图片服务器id写入form表单中,等待提交至后台处理
$("input[name='image']").val(serverId);
}
});
}
});
});
5、后台调用微信多媒体接口,下载并保存图片到自己的服务器
调用微信下载多媒体文件接口下载图片到自己服务器:https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
注意:
1、临时素材media_id是可复用的。
2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
3、上传临时素材的格式、大小限制与公众平台官网一致。
图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
视频(video):10MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式
//此处的$image为前台上传的图片的serverId
$url = 'https://api.weixin.qq.com/cgi-bin/media/get?access_token=' . $this->access_token . '&media_id=' . $image;
//读取微信服务器图片
$image = file_get_contents($url);
//图片存放的路径
$img_url = '/Public/wx/image/';
if (!is_dir('.' . $img_url)) {
mkdir('.' . $img_url, 0777, true);
}
$img_url .= date('Y_m_d') . '_' . time() . '.png';
//写入图片
file_put_contents('.' . $img_url, $image);