最近有一个需求,用公众号调用本地相册,并将图片上传到本地服务器(不是微信服务器)。
步骤一:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js
如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。
步骤二:
在调用本地相册页面加入以下代码:
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: ‘’, // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: ‘’, // 必填,生成签名的随机串
signature: ‘’,// 必填,签名
jsApiList: [‘chooseImage’, ‘uploadImage’] // 必填,需要使用的JS接口列表,
});
下面通过java代码获取timestamp、nonceStr、signature
//获得jsapi_ticket,noncestr,timestamp
requestUrl:为jsp所在目录(这里一定要弄对,不然一直报签名错误)
public static Map<String ,String> getJSSDKData(String requestUrl,String appid,String appsecret){
log.info("=================getJSSDKData-start");
//1)获取access_token
AccessToken accessToken = getAccessToken(appid, appsecret,false);
String token = accessToken.getToken();
log.info("accessToken:"+accessToken);
//2)获取jsapi_ticket(有效期7200秒
String jsapi_ticket = getJsapi_ticket_cache(token);
log.info("jsapi_ticket:"+jsapi_ticket);
//3)获取//随机字符串
String noncestr = Double.toString(Math.random()).substring(2, 15);//随机字符串
//4)获取 随机时间戳
String timeStamp =((int)(new Date().getTime()/1000))+"";//随机时间戳
//5)获取签名
String str = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + noncestr + "×tamp="+ timeStamp +"&url=" + requestUrl;
String signature = SHA1Util.Sha1(str);
Map<String ,String> map = new HashMap<String, String>();
map.put("appid", appid);
map.put("noncestr", noncestr);
map.put("timestamp", timeStamp);
map.put("signature", signature);
map.put("url", requestUrl);
log.info("=================getJSSDKData-end");
return map;
}
public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
public static AccessToken getAccessToken(String appid, String appsecret,boolean flag) {
log.info("=============getAccessToken-start");
long now = System.currentTimeMillis();
if( (!flag) && (accessToken != null) && ( now <= (accessToken.getCreateTime() + accessToken.getExpiresIn() * 1000) ) ){
log.info("读取缓存accessToken"+accessToken);
return accessToken;
}else{
//不在有效期内 重新获取, 并且存到缓存中去
String requestUrl = access_token_url.replace(“APPID”, appid).replace(“APPSECRET”, appsecret);
JSONObject jsonObject = httpRequest(requestUrl, “GET”, null);
// 如果请求成功
if (null != jsonObject) {
try {
accessToken = new AccessToken();
accessToken.setCreateTime(now);
accessToken.setToken(jsonObject.getString(“access_token”));
accessToken.setExpiresIn(jsonObject.getInt(“expires_in”) - 300);
CacheInstance.getCacheInterface().set( Md5Util.MD5Encode(“AccessToken”) ,accessToken);
log.info("重新获取accessToken成功"+accessToken);
} catch (JSONException e) {
accessToken = null;
// 获取token失败
log.info(“获取token失败 errcode:{} errmsg:{}”+jsonObject.getInt(“errcode”)+jsonObject.getString(“errmsg”));
e.printStackTrace();
}
}
}
log.info("=================getAccessToken-end");
return accessToken;
}
至此微信接口初始化完毕。
调用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: localId.toString(), // 需要上传的图片的本地ID,由chooseImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回图片的服务器端ID
//以下逻辑上传本地服务器
uploadServe(serverId);
}
}
});
//一下逻辑上传本地服务器
function uploadServe(serverId){
$.ajax({
type: "POST",
url: "uploadImage.action",
data: {
serverId:serverId
},
dataType: "json",
success: function (data) {
id+=data.info+",";
$("#attachIds").val(id);
//alert($("#attachIds").val());
}
})
}
public static String uploadImageByWX = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=serverId";获取图片二进制流的接口
其中ACCESS_TOKEN可以上面方法获得
serverId 从前台传过来
然后获得图片二进制流
然后将二进制流保存到服务器即可