微信支付搞完以後,也開始了微信其餘功能,不得不說,微信寫得接口都比較齊全和標準,附上微信公衆號開發文檔連接,仔細閱讀,必須嚴格按照其規則,才能調用微信的接口。前端
最近作了一個手機端調用微信接口打開攝像頭進行掃描二維碼功能和調用上傳下載圖片的接口,注意,在微信公衆號配置要注意,【開發】-【接口權限】 查看對應的接口權限是開通了沒有?最主要的是,還要在【公衆號設置】-【功能設置】-【JS接口安全域名】配置,切記,必定是備案過的,一級二級均可以。web
附上圖片:json
配置完此項以後,還有個地方須要配置的,須要特別注意的是這邊的配置,【開發】-【基本配置】api
須要注意的是,該配置是微信驗證該域名是不是用於請求的正確性,說白了,就是微信要確認這個是能夠通訊的域名服務器,那麼規則是寫一個驗證(固然,驗證這步能夠跳過),微信會請求該Url,傳參數echoStr,咱們只要原樣返回該參數便可安全
附上源碼:服務器
public class GetEchoStrController : Controller { [AllowAnonymous] [HttpGet] public string GetEchoStr(string echostr) { return echostr; } }
這樣,微信就經過了,而後就能夠配置Token(自定義),EncodingAESKey(自定義),消息加密方式,暫時選擇【明文模式】。微信
完成以上的配置以後,即可以進行微信接口的調用了。微信開發
調用接口前,要先獲取下相關的配置,仔細詳讀微信開發文檔app
獲取必要的參數:GetConfig() ,要獲取Token以後獲取Tiket,經過簽名,將參數傳到前端,調用微信接口。dom
public class WechatController : BaseAPIController { #region 微信端圖片上傳配置
/// <summary> /// 獲取Token /// </summary> /// <returns></returns> public static string GetToken(WechatConfig entity,ref long tokenOverTime,ref long tokenCreatTime) { //過時 if (IsOverdue(entity.TokenOverTime, entity.TokenCreateTime)) { string getUrl = @"https://api.weixin.qq.com/cgi-bin/token?"; WebUtils webser = new WebUtils(); IDictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("grant_type", "client_credential"); dic.Add("appid", entity.Appkey); dic.Add("secret", entity.AppSecret); var token = webser.DoGet(getUrl, dic); JavaScriptSerializer json = new JavaScriptSerializer(); Token tok = json.Deserialize<Token>(token); tokenOverTime =tok.expires_in; tokenCreatTime = (long)DateTime.UtcNow.Subtract(DateTime.Parse("1970-01-01 00:00:00")).TotalMilliseconds; return tok.access_token; } else { tokenOverTime = entity.TokenOverTime; return entity.Token; } } /// <summary> /// 更新參數 /// </summary> /// <param name="entity"></param> private static void UpdateWechatConfig(WechatConfig entity) { } /// <summary> /// 實體轉Json /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jsonObject"></param> /// <returns></returns> private static string Model2Json<T>(T jsonObject) { using (var ms = new MemoryStream()) { new DataContractJsonSerializer(typeof(T)).WriteObject(ms, jsonObject); return Encoding.UTF8.GetString(ms.ToArray()); } } /// <summary> /// 獲取Tiket /// </summary> /// <param name="token"></param> /// <returns></returns> private string GetTiket(WechatConfig entity) { if (IsOverdue(entity.TiketOverTime, entity.TiketCreateTime)) { string getUrl = @"https://api.weixin.qq.com/cgi-bin/ticket/getticket?"; WebUtils webser = new WebUtils(); IDictionary<string, string> dic = new Dictionary<string, string>(); long tokenOverTime = entity.TokenOverTime; long tokenCreateTime = entity.TokenCreateTime; var token = GetToken(entity,ref tokenOverTime,ref tokenCreateTime); dic.Add("access_token", token); dic.Add("type", "jsapi"); var tiket = webser.DoGet(getUrl, dic); JavaScriptSerializer json = new JavaScriptSerializer(); Ticket tic = json.Deserialize<Ticket>(tiket); entity.Tiket = tic.ticket; entity.TiketCreateTime = (long)DateTime.UtcNow.Subtract(DateTime.Parse("1970-01-01 00:00:00")).TotalMilliseconds; entity.TiketOverTime = tic.expires_in; entity.Token = token; entity.TokenOverTime = tokenOverTime; entity.TokenCreateTime = tokenCreateTime; UpdateWechatConfig(entity); return tic.ticket; } else { return entity.Tiket; } } /// <summary> /// 獲取配置 /// </summary> /// <returns></returns> public static WechatConfig GetConfigParams() {
var entity=GetParams(); var param = entity.Params; JavaScriptSerializer json = new JavaScriptSerializer(); var config = json.Deserialize<WechatConfig>(param); return config; } /// <summary> /// Token參數 /// </summary> public class Token { public string access_token { get; set; } public long expires_in { get; set; } } /// <summary> /// Ticket參數 /// </summary> public class Ticket { public int errcode { get; set; } public string errmsg { get; set; } public long expires_in { get; set; } public string ticket { get; set; } } /// <summary> /// 配置 /// </summary> public class Config { public string appId { get; set; } public string timestamp { get; set; } public string nonceStr { get; set; } public string signature { get; set; } } /// <summary> /// 獲取十位的時間戳 /// </summary> /// <param name="dt"></param> /// <returns></returns> private static string GenerateTimeStamp(DateTime dt) { // Default implementation of UNIX time of the current UTC time TimeSpan ts = dt.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds).ToString(); } /// <summary> /// 給請求籤名 /// </summary> /// <param name="parameters">全部字符型的請求參數</param> /// <param name="secret">簽名密鑰</param> /// <param name="qhs">是否先後都加密進行簽名</param> /// <returns></returns> private static string SignRequest(IDictionary<string, string> parameters) { // 第一步:把字典按Key的字母順序排序 IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters); IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator(); // 第二步:把全部參數名和參數值串在一塊兒 StringBuilder query = new StringBuilder(); while (dem.MoveNext()) { string key = dem.Current.Key; string value = dem.Current.Value; if (!string.IsNullOrWhiteSpace(key))//!string.IsNullOrWhiteSpace(value) 空值也加入計算?? { query.Append(key + "=").Append(value + "&"); } } var str = query.ToString(); if (str.Length > 0) { str = str.Substring(0, str.Length - 1); } // 第三部:使用sha1 var result = Utils.EncryptToSHA1(str); return result; } /// <summary> /// 隨機數 /// </summary> /// <returns></returns> private string Random() { return Guid.NewGuid().ToString().Replace("-", ""); } public class HttpParams { public string url { get; set; } public TimeSpan timestamp { get; set; } public string signature { get; set; } public string nonce { get; set; } public string echostr { get; set; } } /// <summary> /// 獲取配置 /// </summary> /// <returns></returns> [HttpPost] public Result<Config> ErpGetConfig(HttpParams httpParams) { WechatConfig wechatconfig = GetConfigParams(); if (wechatconfig == null) { return new Result<Config>(); } var nonceStr = Random(); var timestamp = GenerateTimeStamp(DateTime.Now); IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("jsapi_ticket", GetTiket(wechatconfig)); parameters.Add("noncestr", nonceStr.ToLower()); parameters.Add("timestamp", timestamp); parameters.Add("url", HttpUtility.UrlDecode(httpParams.url)); var signature = SignRequest(parameters); Config config = new Config(); config.appId = wechatconfig.Appkey; config.timestamp = timestamp; config.nonceStr = nonceStr; config.signature = signature; return new Result<Config>(config); } /// <summary> /// 檢查Tiket是否過時 /// </summary> /// <returns></returns> private static bool IsOverdue(long overTime, long createTime) { long spanNow = (long)DateTime.UtcNow.Subtract(DateTime.Parse("1970-01-01 00:00:00")).TotalMilliseconds; long spanCreate = createTime; return (spanNow - spanCreate > overTime * 1000); } /// <summary> /// 下載保存多媒體文件,返回多媒體保存路徑 /// </summary> /// <param name="ACCESS_TOKEN"></param> /// <param name="MEDIA_ID"></param> /// <returns></returns> public static string GetMultimedia(string serverId,Guid id) { Utils.WriteLog(DateTime.Now+":The Pic's Serverid:"+serverId); WechatConfig wechatConfig = GetConfigParams(); if (wechatConfig == null) { return string.Empty; } if (string.IsNullOrEmpty(serverId)) { return null; } Result r = new Result(); string strpath = string.Empty; string savepath = string.Empty; string file = string.Empty; long overtime = 0; long date = 0; string stUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=" + GetToken(wechatConfig, ref overtime, ref date) + "&media_id=" + serverId; HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(stUrl); req.Method = "GET"; using (WebResponse wr = req.GetResponse()) { HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse(); strpath = myResponse.ResponseUri.ToString(); WebClient mywebclient = new WebClient(); savepath = System.Web.Hosting.HostingEnvironment.MapPath(WebConfigUtils.GetAppSettingsInfo("ImagePath")) + "UploadImages\\" + id; if (!Directory.Exists(savepath)) { Directory.CreateDirectory(savepath); } savepath = Path.Combine(savepath, id + ".jpg"); try { mywebclient.DownloadFile(strpath, savepath); file = Path.Combine(WebConfigUtils.GetAppSettingsInfo("ImagePath") + "UploadImages\\" + id, id + ".jpg"); } catch (Exception ex) { r.ErrorMessage = ex.Message; r.OperationTime = DateTime.Now; r.ResultCode = ResultCode.Error; Utils.WriteLog(ex); } } return file; }
#endregion }
public class WechatConfig { public long TokenOverTime { get; set; } public long TiketOverTime { get; set; } public string Token { get; set; } public string Tiket { get; set; } public long TokenCreateTime { get; set; } public long TiketCreateTime { get; set; } public string Appkey { get; set; } public string AppSecret { get; set; } public Guid InfOauthDetailID { get; set; } }
主要是獲取須要的參數,而後去獲取須要的Token和Tiket(微信調接口所須要),以後,組織成須要的,拋給前端處理調用微信接口,對了,這裏還忘了,token跟tiket不只要檢查是否是過時了,還要檢查是否失效了,233333,這裏少了個檢查是否失效,後面補上。前端的東西,就看微信開發文檔,很仔細。
以爲寫得能夠,幫忙頂一下。
QQ交流羣:523490820