微信調用照相拍照等 js 介面的許可權配置 和 照片上傳和下載實現

来源:http://www.cnblogs.com/digdeep/archive/2016/08/06/5743378.html
-Advertisement-
Play Games

直接上代碼: 1. 前端調試代碼: 前端這裡 2. 後端介面: /getConfigInfo.json 介面是配置 jsapi 許可權認證。 /getPhoto.json 是從 微信伺服器下載照片,保存到我們自己的伺服器上。然後將我們自己伺服器的地方返回給前端使用。 ...


直接上代碼:

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 是從 微信伺服器下載照片,保存到我們自己的伺服器上。然後將我們自己伺服器的地方返回給前端使用。

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對Web API新手來說,不要忽略了ApiController 在web API中,方法的返回值如果是實體的話實際上是自動返回JSON數據的例如: 他的返回值就是這樣的: 這是定義的Response類 在web API還有一個問題,可能是我自己太大意了,新建的控制器如果沒有仔細看就會預設選擇了MVC ...
  • 一、什麼是VSTO? VSTO = Visual Studo Tools for Office,是.net平臺下的Office開發技術。相對於傳統的VBA(Visual Basic Application)開發,VSTO為中高級開發人員提供了更加強大的開發平臺和語言,並部分解決了傳統Office開發 ...
  • 為什麼要創造Taurus.MVC:記得被上一家公司忽悠去負責公司電商平臺的時候,情況是這樣的:項目原版是外包給第三方的,使用:WebForm+NHibernate,代碼不堪入目,Bug無限,經常點著點著就掛了。一開始招了幾個實習的大學生在那玩,搞不定了,終於忽悠的我了,哈哈。。。當時進去的第一感覺是... ...
  • public static void InsertWithLob(OracleConnection conn) { if (conn!= null && conn.State == ConnectionState.Open) { try { string sqlText = "insert into ...
  • Insert測試,只測試1000條的情況,多了在實際的項目中應該就要另行處理了。 using System; using System.Collections.Generic; using System.Configuration; using System.Data.Entity; using S ...
  • 相信每一個開發的框架都會有一個工具類,工具類的作用有很多,通常我會將最常用的方法放在工具類里 當然每個開發框架的工具類都會不同,這裡我只收錄了這些方法,希望有更多需求的小伙伴也可以收錄進工具類里 1.取得用戶IP 做Web開發的一定會遇到獲取用戶IP的需求的,無論是用來記錄登錄時間,還是日誌的記錄, ...
  • ...
  • 參考: http://www.pythondoc.com/flask-restful/first.html 什麼是Rest Client-Server:伺服器端與客戶端分離。 Stateless(無狀態):每次客戶端請求必需包含完整的信息,換句話說,每一次請求都是獨立的。 Cacheable(可緩存 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...