使用全局的access_token用来获取jsapi_ticket,并通过微信多媒体接口下载图片到自己的服务器。jsapi_ticket是公众号用于调用微信JS接口的临时票据,用来前端页面调取微信的拍照、选图、上传服务器功能。此过程之前文章已说明,不做详细介绍。
附连接: 微信开发中的access_token和jsapi_ticket
参与签名的字段包括
noncestr(随机字符串),
jsapi_ticket
timestamp(时间戳)
url(当前网页的URL,不包含#及其后面部分)
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);
}
在需要调用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>
权限验证配置完成后,通过ready接口处理成功验证。
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);
}
});
}
});
});
调用微信下载多媒体文件接口下载图片到自己服务器: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);