zoukankan      html  css  js  c++  java
  • 使用微信JSSDK实现图片上传

    近期做的一个项目,刚好用到了JSSDK,把用到的东西整理下。

    先附上微信开发人员文档链接:微信开发人员文档

    主要用到了:

    引入JS文件

    在须要调用JS接口的页面引入例如以下JS文件。(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js


    我们须要获取微信js-sdk參数

    		/**
    		 * 获取access_token
    		 * 
    		 * @param appid
    		 *            凭证
    		 * @param appsecret
    		 *            密钥
    		 * @return
    		 */
    		public static WxAccessToken getAccessToken() {
    			WxAccessToken accessToken = null;
    
    			String requestUrl = access_token_url.replace("APPID", Setting.getSetting("WX_PL_APP_ID")).replace(
    					"APPSECRET", Setting.getSetting("APP_SECRET"));
    			JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
    			// 假设请求成功
    			if (null != jsonObject) {
    				try {
    					accessToken = new WxAccessToken();
    					accessToken.setToken(jsonObject.getString("access_token"));
    					accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
    				} catch (JSONException e) {
    					accessToken = null;
    					// 获取token失败
    					log.error("获取token失败 errcode:{} errmsg:{}",
    							jsonObject.getInt("errcode"),
    							jsonObject.getString("errmsg"));
    				}
    			}
    			return accessToken;
    		}
    		public static String jsapiTicket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
    		
    		/**
    		 * 获取JsTicket
    		 * 
    		 * @param accessToken
    		 *            accessToken
    		 * @return
    		 */
    		public static WxJsTicket getJsTicket(String accessToken) {
    			WxJsTicket jsTicket = null;
    
    			String url = jsapiTicket.replaceAll("ACCESS_TOKEN", accessToken);
    			JSONObject jsonObject = httpRequest(url, "GET", null);
    			// 假设请求成功
    			if (null != jsonObject) {
    				try {
    					jsTicket = new WxJsTicket();
    					jsTicket.setTicket(jsonObject.getString("ticket"));
    					jsTicket.setExpiresIn(jsonObject.getInt("expires_in"));
    				} catch (JSONException e) {
    					jsTicket = null;
    					// 获取token失败
    					log.error("获取jsapiTicket失败 errcode:{} errmsg:{}",
    							jsonObject.getInt("errcode"),
    							jsonObject.getString("errmsg"));
    				}
    			}
    			return jsTicket;
    		}

    须要注意接口的调用次数是有限制的。须要控制好。


    页面的配置

    	wx.config({
    	      debug: false, // 开启调试模式,调用的全部api的返回值会在clientalert出来。若要查看传入的參数,能够在pc端打开。參数信息会通过log打出,仅在pc端时才会打印。

    appId: "$!{wxsign.get('appId')}", // 必填,公众号的唯一标识 timestamp: "$!{wxsign.get('timeStamp')}", // 必填,生成签名的时间戳 nonceStr: "$!{wxsign.get('nonceStr')}", // 必填,生成签名的随机串 signature: "$!{wxsign.get('signature')}",// 必填,签名,见附录1 jsApiList: ['checkJsApi', 'chooseImage', 'previewImage', 'uploadImage'] // 必填,须要使用的JS接口列表,全部JS接口列表见附录2 }); var images = { localId: [], serverId: [] };


    拍照或从手机相冊中选图接口

    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: '', // 须要上传的图片的本地ID,由chooseImage接口获得
        isShowProgressTips: 1, // 默觉得1,显示运行进度提示
        success: function (res) {
            var serverId = res.serverId; // 返回图片的服务器端ID
        }
    });

    微信返回的serverid我们须要通过微信api获取真实的图片二进制数据。

    		/**
    		 * 获取媒体文件
    		 * 
    		 * @param accessToken
    		 *            接口訪问凭证
    		 * @param media_id
    		 *            媒体文件id
    		 * */
    		public static String downloadMedia(String mediaId,HttpServletRequest request) {
    			String requestUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID";
    			requestUrl = requestUrl.replace("ACCESS_TOKEN", WxTokenThread.accessToken.getToken()).replace(
    					"MEDIA_ID", mediaId);
    			HttpURLConnection conn = null;
    			try {
    				URL url = new URL(requestUrl);
    				conn = (HttpURLConnection) url.openConnection();
    				conn.setDoInput(true);
    				conn.setRequestMethod("GET");
    				conn.setConnectTimeout(30000);
    				conn.setReadTimeout(30000);
    				BufferedInputStream bis = new BufferedInputStream(
    						conn.getInputStream());
    				ByteArrayOutputStream swapStream = new ByteArrayOutputStream();  
    			    byte[] buff = new byte[100];  
    		        int rc = 0;  
    		        while ((rc = bis.read(buff, 0, 100)) > 0) {  
    		            swapStream.write(buff, 0, rc);  
    		        }  
    		        byte[] filebyte = swapStream.toByteArray();  
    				return PictureStore.getInstance().getImageServerUrl() + PictureStore.getInstance().store(filebyte);
    			} catch (Exception e) {
    				e.printStackTrace();
    			} finally {
    				if(conn != null){
    					conn.disconnect();
    				}
    			}
    			return "";
    		}


    总体上做这个功能还是比較简单的,仅仅只是曾经没有接触过微信api。

    做的过程中还參考了微信JS SDK Demo 官方案例



  • 相关阅读:
    iOS 自动续期订阅 恢复购买
    iOS内购恢复购买
    iOS内购自动续订
    iOS苹果内购服务端技术方案
    Spring4.x体系架构
    Linux下MySQL主从复制(Binlog)的部署过程
    Linux下MySQL多实例部署记录
    Linux下MySQL基础及操作语法
    Linux下Nginx基础应用
    Linux下Apache(HTTP)基础知识梳理-运维笔记
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6907383.html
Copyright © 2011-2022 走看看