<body> <div> <input type="button" value="頭像" onclick="chooseImage()"/> <div > <input type="button" value="重選" onclick="chooseImage()"/> <input type="button" value="上傳" onclick="Upload()"/> </div> </div> </body> <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript"> $(function () { var url = location.href.split('#')[0]; var date = "url=" + url; //get中url指後臺處理的url,生成簽名返回給前端 $.get(url",date, function (data) { var da = $.parseJSON(data); wx.config({ debug: false, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。 appId: da.appid, // 必填,公衆號的惟一標識 timestamp: da.timeStamp, // 必填,生成簽名的時間戳 nonceStr: da.nonceStr, // 必填,生成簽名的隨機串 signature: da.signature,// 必填,簽名,見附錄1 jsApiList: ["chooseImage", "uploadImage", "downloadImage"] // 必填,須要使用的JS接口列表,全部JS接口列表見附錄2 }); wx.ready(function () { //alert("wx.config success."); // config信息驗證後會執行ready方法,全部接口調用都必須在config接口得到結果以後,config是一個客戶端的異步操做,因此若是須要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則能夠直接調用,不須要放在ready函數中。 }); wx.error(function (res) { alert("wx.config failed."); // config信息驗證失敗會執行error函數,如簽名過時致使驗證失敗,具體錯誤信息能夠打開config的debug模式查看, // 也能夠在返回的res參數中查看,對於SPA能夠在這裏更新簽名。 }); }) }) var images; function chooseImage() { wx.chooseImage({ count: 1, // 默認9 sizeType: ['original', 'compressed'], // 能夠指定是原圖仍是壓縮圖,默認兩者都有 sourceType: ['album', 'camera'], // 能夠指定來源是相冊仍是相機,默認兩者都有 success: function (res) { var localIds = res.localIds; // 返回選定照片的本地ID列表,localId能夠做爲img標籤的src屬性顯示圖片 } }); } function uploadImage(localId) { wx.uploadImage({ localId: localId, // 須要上傳的圖片的本地ID,由chooseImage接口得到 isShowProgressTips: 1, // 默認爲1,顯示進度提示 success: function (res) { var serverId = res.serverId; // 返回圖片的服務器端ID var data="serverId="+serverId; //get中url指後臺處理的url,生成簽名返回給前端 $.get("url",data,function(r){ if(r>0){ alert("成功"); }else alert("系統異常!,聯繫管理員"); }) } }); } function Upload(){ uploadImage(images); } </script>
//後端接收方法,生成簽名的後臺 [HttpGet] public ActionResult XXXX(string url) { string timeStamp = getTimestamp();//時間 string nonceStr = getNoncestr();//隨機數 string signature = Weixinjsapi_ticket(timeStamp, nonceStr, url); string appid = appid; String json = "{"; json += "\"timeStamp\":" + "\"" + timeStamp + "\","; json += "\"nonceStr\":" + "\"" + nonceStr + "\","; json += "\"signature\":" + "\"" + signature + "\","; json += "\"appid\":" + "\"" + appid + "\""; json += "}"; return Content(json); } //後端接收方法,下載圖片 [HttpGet] public ActionResult XXXX(string mediaId) { try{ if(mediaId!=null&&mediaId!=""){ xxxxx(圖片的名稱,mediaId); return Content("1"); } } catch(){} return Content("0"); } /// <summary> /// 隨機串 /// </summary> public static string getNoncestr() { Random random = new Random(); return MD5Util.GetMD5(random.Next(1000).ToString(), "GBK").ToLower().Replace("s", "S"); } /// <summary> /// 時間截,自1970年以來的秒數 /// </summary> public static string getTimestamp() { TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds).ToString(); } /// <summary> /// 保存憑證 /// </summary> public static string Asscess { set; get; } /// <summary> /// jsp_api 簽名參數 /// </summary> public static string jsapi_ticket{set;get;} /// <summary> /// 保存憑證時間 /// </summary> public static DateTime Asscess_Time { set; get; } /// <summary> /// 保存jsp_api時間 /// </summary> public static DateTime Jsp_Api_Time { set; get; } /// <summary> /// 獲取signature /// </summary> /// <returns></returns> public string Weixinjsapi_ticket(string timeStamp, string nonceStr,string url) { if (Asscess == null) { string token = GetToken(appid, secret); Asscess = token; Asscess_Time = DateTime.Now; } else { DateTime time = DateTime.Now; if ((time - Asscess_Time).TotalSeconds > 7000) { string token =GetToken(appid, secret); Asscess = token; Asscess_Time = DateTime.Now; } } if (jsapi_ticket == null) { jsapi_ticket = getjsapi_ticket(Asscess); Jsp_Api_Time = DateTime.Now; } else { DateTime time = DateTime.Now; if ((time - Jsp_Api_Time).TotalSeconds > 7000) { jsapi_ticket = getjsapi_ticket(Asscess); Jsp_Api_Time = DateTime.Now; } } string string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr + "×tamp=" + timeStamp + "&url="+url; string signature = sha1(string1); return signature; } #region 獲取Token /// <summary> /// 獲取Token /// </summary> public static string GetToken(string appid, string secret) { var strJson = HttpRequestutil.RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret),"get"); JavaScriptSerializer json = new JavaScriptSerializer(); token tk = json.Deserialize<token>(strJson); return tk.access_token; } /// <summary> /// 獲取jsapi_ticket /// </summary> /// <returns></returns> public static string getjsapi_ticket(string Asscess) { var strJson = RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", Asscess), "get"); JavaScriptSerializer json = new JavaScriptSerializer(); token tk = json.Deserialize<token>(strJson); return tk.ticket; } /// <summary> /// 請求Url,不發送數據 /// Method 發送類型(post,get) /// </summary> public static string RequestUrl(string url, string method) { // 設置參數 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = method; request.ContentType = "text/html"; request.Headers.Add("charset", "utf-8"); //發送請求並獲取相應迴應數據 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序纔開始向目標網頁發送Post請求 Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); //返回結果網頁(html)代碼 string content = sr.ReadToEnd(); return content; } [Serializable] public class token { /// <summary> /// 憑證 /// </summary> public string access_token { set; get; } /// <summary> /// 有效時間 /// </summary> public string expires_in { set; get; } /// <summary> /// jsp_api簽到憑證 /// </summary> public string ticket { set; get; } } /// <summary> /// SHA1加密 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string sha1(string str) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "sha1"); } /// <summary> /// 下載微信頭像圖片 /// </summary> private void xxxxx(string PatnName,string media) { if (Asscess == null) { string token = GetToken(appid, secret); Asscess = token; Asscess_Time = DateTime.Now; } else { DateTime time = DateTime.Now; if ((time - Asscess_Time).TotalSeconds > 7000) { string token =GetToken(appid, secret); Asscess = token; Asscess_Time = DateTime.Now; } } string url = string.Format("https://api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}", Asscess , media) WebRequest request = WebRequest.Create(url); WebResponse response = request.GetResponse(); Stream reader = response.GetResponseStream(); FileStream writer = new FileStream(GetPath(PatnName), FileMode.OpenOrCreate, FileAccess.Write); byte[] buff = new byte[512]; int c = 0; //實際讀取的字節數 while ((c = reader.Read(buff, 0, buff.Length)) > 0) { writer.Write(buff, 0, c); } writer.Close(); writer.Dispose(); reader.Close(); reader.Dispose(); response.Close(); } /// <summary> /// 保存圖片地址 /// </summary> /// <param name="fileName"></param> /// <returns></returns> private string GetPath(string fileName) { string path = "";//寫上地址 path = Server.MapPath(path); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } path += fileName + ".jpg"; return path; } public const string appid = "";//公衆號ID public const string secret = "";//微信公衆號的secret 相關代碼地址:https://gitee.com/qq-w/wechat.git