微信调用照相拍照等 js 接口的权限配置 和 照片上传和下载实现

直接上代码:

1. 前端调试代码:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>调用微信相机</title>
<link rel="stylesheet" href="css/weui.min.css"/>
</head>
<body>
<br/><br/>
<div>
	<div class="hd">
        <h1 class="page_title" ><span id="current_user"></span></h1>
    </div>
     	<br/>
	<div class="page slideIn button">
	    <div class="bd spacing">
	    	<br/><br/><br/><br/>
	        <a class="weui_btn weui_btn_primary" href="javascript:;" onclick="take_a_photo()">调用微信相机</a>
	    </div>
	</div>
</div>

<br/><br/><br/><br/>
<div>
	  appId:<span id="appId"></span><br/>
	  timestamp:<span id="timestamp"></span><br/>
	  nonceStr:<span id="nonceStr"></span><br/>
	  jsapi_ticket:<span id="jsapi_ticket"></span><br/>
	  signature:<span id="signature"></span><br/>

	  originalStr:<span id="originalStr"></span><br/>
	  scan_result:<span id="result"></span><br/>
</div>	

<script type=‘text/javascript‘ src=‘js/jquery.min.js‘></script>
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript" src="js/weixin_util.js"></script>
<script type="text/javascript">
// 通过config接口注入权限验证配置
$(function(){
	debugger;
	get_wx_config();
})

function get_wx_config(){
	debugger;
	//url(当前网页的URL,不包含#及其后面部分)
	var url = window.location.href.split(‘#‘)[0];
	var indata = {"url":url};
	//$.post("http://wwww.axxx.cn/xxx/weixin/getConfigInfo.json", indata, function(data){
	$.post("http://localhost:8080/xxx/weixin/getConfigInfo.json", indata, function(data){
		debugger;
        if(data.rs == ‘f‘){
        	alert("系统错误");
        }else{
        	var result = data.body;
        	$("#appId").text(result.appId);
        	$("#timestamp").text(result.timestamp);
        	$("#nonceStr").text(result.nonceStr);
        	$("#jsapi_ticket").text(result.jsapi_ticket);
        	$("#signature").text(result.signature);
        	$("#originalStr").text(result.originalStr);

        	//步骤三:通过config接口注入权限验证配置
        	wx.config({
        	    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        	    appId: result.appId,   // 必填,公众号的唯一标识
        	    timestamp: result.timestamp, // 必填,生成签名的时间戳
        	    nonceStr: result.nonceStr, // 必填,生成签名的随机串
        	    signature: result.signature,// 必填,签名,见附录1
        	    jsApiList: ["chooseImage", "previewImage", "uploadImage", "downloadImage"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        	    // 基本思路是,上传图片到微信服务器->下载多媒体接口讲图片下载到服务器->返回服务器存储路径->前台显示
        	});

        	// 步骤四:通过ready接口处理成功验证
        	wx.ready(function(){
				alert("wx.config success.");
        	});

        	wx.error(function(res){
        		alert("wx.config failed.");
				//alert(res);
        	    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,
        	    // 也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
        	});

			// {"errMsg":"config:invalid signature"}
        }
      },‘json‘);
}

// 图片接口
// 拍照、本地选图
var images = {
	localId: [],
	serverId: []
};	

// 拍照或者选择照片
function take_a_photo(){
	wx.chooseImage({
		count: 1, // 默认9,这里每次只处理一张照片
		sizeType: [‘original‘, ‘compressed‘], 	// 可以指定是原图还是压缩图,默认二者都有
	    sourceType: [‘album‘, ‘camera‘], 		// 可以指定来源是相册还是相机,默认二者都有
        success: function (res) {
            images.localId = res.localIds; 		// 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片

            var i = 0, length = images.localId.length;
            function upload() {
                wx.uploadImage({
                    localId: images.localId[i],
                    success: function(res) {
                        i++;
                        alert(‘已上传:‘ + i + ‘/‘ + length);
                        images.serverId.push(res.serverId); 

                        // res.serverId 就是 media_id,根据它去微信服务器读取图片数据:
                        var indata = {"media_id":res.serverId};
                        $.post("/weixin/getPhoto.json", indata, function(data){
					        if(data.rs == ‘f‘){
					        	alert("系统错误");
					        }else{
					        	alert(data.body);	// 返回 图片在我们自己的服务器的url
					        }
					      },‘json‘);

                        if (i < length) {
                            upload();
                        }
                    },
                    fail: function(res) {
                        alert(JSON.stringify(res));
                    }
                });
            }
            upload();
        }
    });
}
</script>
</body>
</html>

前端这里

var url = window.location.href.split(‘#‘)[0];是比较容易犯错的地方。

2. 后端接口:

@NoLogin
    @RequestMapping(value="/getConfigInfo.json", method=RequestMethod.POST)
    @ResponseBody
    public Object getConfigInfo(String url) throws NoSuchAlgorithmException{
    	String noncestr = "dsfww";
    	JsapiTicket ticket = AccessTokenJsapiTicketThread.getTicket();

    	logger.debug("ticket::::::;" + JSON.toJSONString(ticket));
    	System.out.println("ticket::::::;" + JSON.toJSONString(ticket));

    	if(ticket != null){
    		long timestamp = new Date().getTime();
    		StringBuilder sb = new StringBuilder("jsapi_ticket=");
    		sb.append(ticket.getTicket()).append("&noncestr=").append(noncestr)
    		.append("&timestamp=").append(timestamp).append("&url=").append(url);

    		MessageDigest md = MessageDigest.getInstance("SHA-1");
			// 对接后的字符串进行sha1加密
			byte[] digest = md.digest(sb.toString().getBytes());
			String signature = SignUtil.byteToStr(digest).toLowerCase();

	    	Map<String, String> map = new HashMap<String, String>();
	    	map.put("jsapi_ticket", ticket.getTicket());
	    	map.put("appId", WxPayConfPub.APPID);
	    	map.put("timestamp", String.valueOf(timestamp));
	    	map.put("nonceStr", noncestr);
	    	map.put("signature", signature);
	    	map.put("originalStr", sb.toString());
	    	logger.debug(JSON.toJSONString(map));
	    	System.out.println(JSON.toJSONString(map));
	    	return JsonConvertor.convertSuccessResult(map);
    	}

    	return JsonConvertor.convertFailResult(ErrorCodeEnum.SYSTEM_ERROR);
    }

    @NoLogin
    @RequestMapping(value="/getPhoto.json", method=RequestMethod.POST)
    @ResponseBody
    public Object getPhoto(String media_id) throws NoSuchAlgorithmException{
    	//http请求方式: GET,https调用
//        var url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID";
    	AccessToken token = AccessTokenJsapiTicketThread.accessToken;
    	String url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=" + token.getAccess_token() + "&media_id=" + media_id;
    	HttpsURLConnection httpsUrl = null;
    	InputStream inputStream = null;
    	Date now = new Date();
    	String saveFileName = null;
    	try {
    		httpsUrl = HttpUtil.initHttpsConnection(url, "GET");
    		int responseCode = httpsUrl.getResponseCode();
    	    if (responseCode == 200) {
    	        // 从服务器返回一个输入流
    	        inputStream = httpsUrl.getInputStream();

    	        byte[] data = new byte[1024];
    	        int len = 0;
    	        FileOutputStream fileOutputStream = null;

    	        saveFileName = DateUtil.convertYMDH(now) + RandomStringUtils.random(6, true, true) + ".jpg";;

    	        // 绝对路径
    	        String path = imageRootPath + DateUtil.convertYMD(now) + "/" + saveFileName;

    	        File dir = new File(imageRootPath + DateUtil.convertYMD(now) + "/");
                if (!dir.exists()) {
                    FileUtils.forceMkdir(dir);
                }

    	        try {
    	        	fileOutputStream = new FileOutputStream(path);
    	        	while ((len = inputStream.read(data)) != -1) {
    	        		fileOutputStream.write(data, 0, len);
    	        	}
    	        	fileOutputStream.flush();
    	        } catch (IOException e) {
    	          e.printStackTrace();
    	        } finally {
    	        	 if (inputStream != null) {
	        	        try {
	        	          inputStream.close();
	        	        } catch (IOException e) {
	        	        }
	        	     }
	        	      if (fileOutputStream != null) {
	        	        try {
	        	          fileOutputStream.close();
	        	        } catch (IOException e) {
	        	        }
	        	    }
    	        }
    	    }
		} catch (IOException e) {
			e.printStackTrace();
		}
    	// 返回图片路径
    	return JsonConvertor.convertSuccessResult(DateUtil.convertYMD(now) + "/" + saveFileName);
    }

/getConfigInfo.json 接口是配置 jsapi 权限认证。

/getPhoto.json 是从 微信服务器下载照片,保存到我们自己的服务器上。然后将我们自己服务器的地方返回给前端使用。

  

 

时间: 2024-10-01 07:51:44

微信调用照相拍照等 js 接口的权限配置 和 照片上传和下载实现的相关文章

微信开发-业务域名、JS接口安全域名、网页授权域名

1.业务域名:在微信浏览器中点击文本框,会弹出提示,很不爽,通过配置业务域名可以将该提示去掉 比如密码输入不安全这类的 2.JS接口安全域名:分享到朋友圈(js-sdk)时用上,此接口要求将当前的界面url加密后,才可以分享到朋友圈.采用前后端分离开发时,js-sdk的验证参数通过php接口获得时,会报invalid signature错误.解决方法:前端将当前的window.location.href传到php接口,php代码中将下图中的$url换成前端传过来的url,生成验证相应参数,再返回

微信web开发的上传图片js接口

$('.chooseImage').click(function(){ wx.chooseImage({ count: pic_num, // 默认9,大于9也是显示9 sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有 'original', success: function (res) { images.localId = res.localIds; alert('已选择 ' + res.localIds.length + ' 张图片'); v

facebook页面种简单测试js调用flash开放的js接口的方法

无意间折腾出来的,此方法很triky,但是很简单有效. 背景说明: facebook种内嵌的iframe无法直接访问. 解决方法: chrome浏览器为例 1.右键查看iframe源代码,此时进入iframe的源代码页面,例如得到如下页面:view-source:https://farm-us.funplusgame.com/# 如果直接去掉view-source:并回车是无法访问对应页面的,去掉https相关,只保留farm-us.funplusgame.com便可以顺利进入游戏. 之后选中对

android: 调用摄像头拍照

很多应用程序都可能会使用到调用摄像头拍照的功能,比如说程序里需要上传一张图片 作为用户的头像,这时打开摄像头拍张照是最简单快捷的.下面就让我们通过一个例子来学 习一下,如何才能在应用程序里调用手机的摄像头进行拍照. 新建一个 ChoosePicTest 项目,然后修改 activity_main.xml 中的代码,如下所示: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro

C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

原文:C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 第四,第五章已经讲了怎么处理用户发送的消息,本章就来讲讲怎么响应用户的

使用微信js接口的方法 ,以调用相机为例

protected string GetTimeStamp_Str=""; protected string nonceStr_Str = ""; protected string signature_Str = ""; protected void Page_Load(object sender, EventArgs e) { GetTimeStamp_Str = GetTimeStamp(); //nonceStr_Str = new Gui

微信分享JS接口

没想到微信接口的突破口实在JS分享这里,今天搞定了这个分享. 1)PHP端需要获取signature的值,因接口调用次数有限制,所以加入了mem存入取出的值,7100秒后过期: $shaMem = 'shaTicket'; //!$strMem = MemHelper::Get($shaMem) if(!$strMem = MemHelper::Get($shaMem)){ //获取相关数据star $str = curl_https("https://api.weixin.qq.com/cgi

微信分享JS接口失效说明及解决方案

关键字:微信分享 JS 失效  分享到朋友圈 微信分享JS接口目前已失效,以前可以自定义分享的标题.描述.图片.链接地址在微信6.0.2版本中失效. 官方回复如下: 旧版的获取分享状态及设置分享内容的JS接口一直用于内部业务,并未对外开放,在微信公开的开放文档里面并没有此接口. 某些第三方借助微信客户端漏洞在未获得权限的情况下使用接口,微信6.0.2版本对此漏洞做了修复以确保用户分享内容的准确性,避免诱导分享. 另外,不久将向广大公众号开放正式分享接口供开发者使用. 临时解决方案: 标题:修改<

【课程分享】深入浅出微信公众平台实战开发(微网站、LBS云、Api接口调用、服务号高级接口)

深入浅出微信公众平台实战开发(微网站.LBS云.Api接口调用.服务号高级接口) 课程下载地址:链接:http://pan.baidu.com/share/link?shareid=2214724072&uk=3611155194 密码:glvc 一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 微信公众平台的火热程度已经不用多言,无论是个人还是企业,政府还是商家,都已经开始搭建微信公众平台,微信的作用已经被各界人士认可.微信公众平台的技术需求市场缺口巨大. 1.2.课程内容简介 本