微信js初始化时需要签名,先获取签名(java代码):

1.获取jsapi_ticket,此数据自己保存,有效时长为7200秒
private String getJsticket(String token){
String result = null;
try{
String urlStr = String.format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi", token);
String data = HttpClientUtil.httpGetRequest(urlStr);
//{"errcode":0,"errmsg":"ok","ticket":"sM4AOVdWfPE4DxkXGEs8VPvFTRqUU89uimy3w_HNh2xVgtI4VJEKLqlcLjLswb1UpNA94FtOzhhzKZSBUqc8gA","expires_in":7200}
JSONObject jsonObj = JSONObject.fromObject(data);
result = jsonObj.getString("ticket");
}catch(Exception e){
logger.error("==tokenjob getJsticket error==>" + e.getMessage());
}
return result;
}
2.获取签名相关数据
@GetMapping("/getticket")
public Result getTicket(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException{
WechatToken wechatToken = wechatTokenService.selectByType(WechatConstant.APPTYPE); String ticket = wechatToken.getJsticket();
String thisUrl = request.getParameter("url");
if(StringUtils.isNotBlank(thisUrl) && thisUrl.indexOf("#") >0){
thisUrl = thisUrl.substring(0, thisUrl.indexOf("#"));
}
Map<String, String> signMap = sign(ticket, thisUrl);
return super.result(signMap);
} private Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = ""; //注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"&timestamp=" + timestamp +
"&url=" + url;
System.out.println(string1); try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
} ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
ret.put("appId", WechatConstant.APPID);
return ret;
} private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
} private static String create_nonce_str() {
return UUID.randomUUID().toString();
} private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}

接着就是前端签名认证,我是使用angularjs的新手不知道如何入手,写在了run中代码如下

var localhostUrl = window.location.href.split('#')[0];
$http({method:'GET',url:'/rest/v1/wechat/getticket',params:{'url':localhostUrl}}).success(function(response){
console.log(response);
wx.config({
// debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId : response.data.appId + '', // 必填,公众号的唯一标识
timestamp : response.data.timestamp, // 必填,生成签名的时间戳
nonceStr : response.data.nonceStr + '', // 必填,生成签名的随机串
signature : response.data.signature + '',// 必填,签名,见附录1
jsApiList : [ 'checkJsApi', 'hideMenuItems', 'showMenuItems',
'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem',
'chooseImage', 'previewImage', 'uploadImage',
'downloadImage', 'getNetworkType', 'openLocation',
'getLocation', 'hideOptionMenu', 'showOptionMenu',
'closeWindow', 'scanQRCode', 'openCard' ]
// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
})

接下来就是使用代码微信js了,看了文档,图片可以使用本地的localId,羡慕的要死,然而我用了并没有显示出来,所以后台返回了上传的图片地址,把src展示位后台返回的服务器访问地址

//图片start
$scope.form = { //用于绑定提交内容,图片或其他数据
image:{},
};
$scope.thumb = {}; //用于存放图片的base64
$scope.thumb_default = { //用于循环默认的‘加号’添加图片的框
1111:{}
}; $scope.getGuid = function() {
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
} /* 引入微信js**/
function wxUploadImage(localId){
var guid = $scope.getGuid(); //通过时间戳创建一个随机数,作为键名使用
$scope.$apply(function(){
$scope.thumb[guid] = {
guid : guid,
}
});
wx.uploadImage({
localId: localId.toString(), // 需要上传的图片的本地ID,由chooseImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回图片的服务器端ID var data = new FormData(); //以下为像后台提交图片数据
// console.log(file);
data.append('imgServerId', serverId);
// files[i]
data.append('guid',guid);
$http({
method: 'post',
url: '/rest/v1/image/upload',
data:data,
headers: {'Content-Type': undefined},
transformRequest: angular.identity
}).success(function(result) {
if (result.message == 'ok') { $scope.form.image[result.data.param1] = result.data.param1;
$scope.thumb[result.data.param1].status = 'SUCCESS';
$scope.thumb[result.data.param1].img = result.data.fileName;
$scope.thumb[result.data.param1].imgSrc = "server img host/"+result.data.fileName;
// console.log($scope.form);
}else{
console.log(result);
}
if(result.message == 'file is null'){
console.log(result);
}
});
}
});
}
$scope.chooseImg = function($event){
console.log($event);
wx.chooseImage({
count : 9, // 默认9
//sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sizeType : [ 'compressed' ], // 指定是压缩图
sourceType : [ 'album', 'camera' ], // 可以指定来源是相册还是相机,默认二者都有
success : function(res) {
var localIds = res.localIds;// 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
for(var i = 0; i < localIds.length; i++){
//上传图片接口
wxUploadImage(localIds[i]); }
},
fail : function(res) {
alterShowMessage("操作提示", JSON.stringify(res), "1", "确定","", "", "");
}
});
}

补一点页面代码

<label class=" control-label">上传图片:</label>
<div class="dropzone" ng-click="chooseImg($event)">
<!-- <div id="uploadDiv"></div> -->
<div ng-repeat="item in thumb" style="width: 45%; margin: 0 10px 10px 0; float:left;" ng-click="clearChoose($event)">
<!-- 采用angular循环的方式,对存入thumb的图片进行展示 -->
<label>
<img ng-src="{{item.imgSrc}}" width="100%" />
</label><br>
<span ng-if="item.imgSrc" ng-click="img_del($index,$event)">删除图片</span>
</div> </div>

接着是布局的一点点有必要记录下

$scope.img_del = function(key,$event) {    //删除,删除的时候thumb和form里面的图片数据都要删除,避免提交不必要的
var guidArr = [];
for(var p in $scope.thumb){
guidArr.push(p);
}
delete $scope.thumb[guidArr[key]];
delete $scope.form.image[guidArr[key]];
$event.stopPropagation();
}; $scope.clearChoose = function($event){
$event.stopPropagation();
} 提交时的image
var images = [];
angular.forEach($scope.thumb, function (data) {
if(data && data.img)
images.push(data.img);
});
angular.forEach($scope.uploadImg, function (data) {
if(data && data.img)
images.push(data.img);
});
if (images.length > 0) {
$scope.ticket.images = images.join(',');
}

  

以上是使用angularjs的新手写的,现在使用jquery的应该蛮多,我觉得修改为jquery 看上面代码应该也蛮简单去实现的,直接去append hmtl就好。如果有不懂的可以联系QQ 64221292  记录第一篇

关于使用微信js上传图片 笔记的更多相关文章

  1. md笔记——微信JS接口

    微信js接口 隐藏微信中网页右上角按钮 document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { Weix ...

  2. 微信JS接口

      微信JS接口 分享到朋友圈 分享给朋友 分享到QQ 拍照或从手机相册中选图 识别音频并返回识别结果 使用微信内置地图查看位置来源:http://www.cnblogs.com/txw1958/p/ ...

  3. 微信js SDK接口

    微信JS-SDK说明文档 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 一.微信登录功能 在进行微信OAut ...

  4. node.js系列笔记之node.js初识《一》

    node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...

  5. 微信JS接口汇总及使用详解

    这篇文章主要介绍了微信JS接口汇总及使用详解,十分的全面.详尽,包含分享到朋友圈,分享给朋友,分享到QQ,拍照或从手机相册中选图,识别音频并返回识别结果,使用微信内置地图查看位置等接口,有需要的小伙伴 ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. 微信js框架第二篇(创建完整界面布局)

    接着昨天的继续谈关于微信新出的这个js框架,今天主要谈一个页面的创建到布局的详细步骤. 一.创建一个完整页面       页面你可以创建在项目的任何节点,只要你在入口文件正确引入创建该页面的路径就可使 ...

  8. 微信JS SDK配置授权,实现分享接口

    微信开放的JS-SDK面向网页开发者提供了基于微信内的网页开发工具包,最直接的好处就是我们可以使用微信分享.扫一扫.卡券.支付等微信特有的能力.7月份的时候,因为这个分享的证书获取问题深深的栽了一坑, ...

  9. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

随机推荐

  1. 如何迅速成为Java高手

    很多网友朋友问我学习Java有没有什么捷径,我说“没有,绝对没有!”.但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛!         要想学好Java,首先要知 ...

  2. 怎样看paper 最有效率

    thinking more after reading. Don't just read the papers.in addition, at begining, you'd better focus ...

  3. Java经典案例之-判断兔子的数量(斐波那契数列)

    /** * 描述:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子, * 假如兔子都不死,问每个兔子总数为多少? * 分析:根据题目条件可以推断 * 兔子的规律 ...

  4. Unity 5 Stats窗口

    Unity5的 Statistics上的统计信息和Unity4 有一些区别, Statistics窗口,全称叫做 Rendering Statistics Window,即渲染统计窗口(或渲染数据统计 ...

  5. Delphi中String类型原理介绍

    Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...

  6. Thinkphp代码生成工具 ThinkphpHelper

    支持MySQL 和 sqlite数据库,快速构建项目原型,直接生成前后台CRUD代码片段,还可根据需要自行定制代码模板,减少重复劳动. 写这个东西的原因是因为我最近沮丧的发现很多时候我都在做重复的事情 ...

  7. apache的工作模式 和 最大连接数设置

    经过测试 效果明显 (1)首选查看apache的工作模式 windows下的查看apache的工作模式命令:httpd -l 如果列出mod_win32.c,则表示是 win32.c 工作方式. 列出 ...

  8. Spring的IOC原理[通俗解释一下]

    Spring的IOC原理[通俗解释一下] 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图 ...

  9. C++写时钟表

    time函数的运用,输出是没输换行,在流中,就什么的输不出,可以用清流函数,fflush(stdout) 代码 #include<iostream>#include<cstdio&g ...

  10. 基于监听的事件处理——Activity本身作为事件监听器

    这种形式使用Activity本身作为监听器类,可以直接在Activity类中定义事件处理方法,这种形式非常简洁.但这种做法有两个缺点: 这种形式可能造成程序结构混乱,Activity的主要职责应该是完 ...