jfinal框架增加微信jsapi支持
部分手機在圖片上傳的時候,調(diào)取不到sd卡相冊或其他圖片,為了解決這個兼容性問題,同一個頁面使用了兩種圖片上傳方案。
html5 :圖片編碼成base64 ,發(fā)送到后臺,解碼存儲。這種方法用于解決非微信瀏覽器的上傳問題。
jsapi:用于解決微信瀏覽器的上傳問題。
思路:
首先判斷是否是微信瀏覽器(微信js接口提供方法),然后調(diào)用上面不同的方法。
這里記下jfinal整合jsapi的關(guān)鍵代碼和流程 。
前端頁面需要一段javascript ,官方文檔有詳細說明,以下我的config
以下是前端頁面對應(yīng)的ctrl ,慣例只是關(guān)鍵部分
//微信ApiConfig?ac?=?new?ApiConfig();String?token?=?ConfigUtil.get("weixinToken");String?appid?=?ConfigUtil.get("weixinAppId");String?secret?=?ConfigUtil.get("weixinSecret");//?配置微信?API?相關(guān)常量ac.setToken(token);ac.setAppId(appid);ac.setAppSecret(secret);/***??是否對消息進行加密,對應(yīng)于微信平臺的消息加解密方式:*??1:true進行加密且必須配置?encodingAesKey*??2:false采用明文模式,同時也支持混合模式*/ac.setEncryptMessage(false);ac.setEncodingAesKey(ConfigUtil.get("weixinEncodingAESKey"));ApiConfigKit.setThreadLocalApiConfig(ac);?//必須JssdkTicket?jssdkTicket?=?JssdkTicketUtil.getJssdkTicket();if?(!jssdkTicket.getErrmsg().equals("ok")){setAttr("errormsg","如需使用圖片上傳功能,請刷新頁面重試");}else?{String?fuckU=?DateUtil.getCurMis().toString().substring(0,10);String?tempStr?=?new?StringBuilder().append("jsapi_ticket="?+?jssdkTicket.getTicket()?+?"&noncestr=t8bI2mW5Mma0I20Y×tamp="?+?fuckU?+?"&url="?+?getRequest().getRequestURL()+"").toString();System.out.println("string1="+tempStr);tempStr?=?EncryptionKit.sha1Encrypt(tempStr);System.out.println("加密后="+tempStr);setAttr("timestamp",?fuckU);setAttr("signature",tempStr);}createToken("blogToken",?30?*?60);render(AppConst.PATH_WAP_PC+"/abc.ftl");以下是JssdkTicketUtil ,該util用于緩存jsapi_ticket,也是微信官方文檔中一再強調(diào)的東西
public?class?JssdkTicketUtil?{private?static?JssdkTicket?jssdkTicket;public?static?JssdkTicket?getJssdkTicket()?{if(jssdkTicket?!=?null?&&?jssdkTicket.isAvailable())?{return?jssdkTicket;}?else?{refreshAccessToken();return?jssdkTicket;}}private?static?void?refreshAccessToken()?{jssdkTicket?=?requestJssdkTicket();}private?static?synchronized?JssdkTicket?requestJssdkTicket()?{JssdkTicket?result?=?null;AccessToken?accessToken?=?AccessTokenApi.getAccessToken();String?json?=?HttpKit.get("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="?+?accessToken.getAccessToken()?+?"&type=jsapi");result?=?new?JssdkTicket(json);if(!result.isAvailable())?{refreshAccessToken();}return?result;}}以下是jssdkTicket ,用于存儲信息
public?class?JssdkTicket?{private?String?jsapi?;//服務(wù)器返回private?Long?expiredTime?;?//過期時間private?Integer?errcode;??//錯誤碼private?String?errmsg;?//錯誤信息private?String?ticket;?//票據(jù)private?Integer?expires_in;?//public?JssdkTicket(String?jsapiStr){this.jsapi?=?jsapiStr;try?{Map?e?=?(Map)(new?ObjectMapper()).readValue(jsapiStr,?Map.class);this.expires_in?=?(Integer)e.get("expires_in");this.errcode?=?(Integer)e.get("errcode");this.errmsg?=?(String)e.get("errmsg");this.ticket?=?(String)e.get("ticket");if(this.expires_in?!=?null)?{this.expiredTime?=?Long.valueOf(System.currentTimeMillis()?+?(long)((this.expires_in.intValue()?-?5)?*?1000));}}?catch?(Exception?var3)?{throw?new?RuntimeException(var3);}}public?boolean?isAvailable()?{return?this.expiredTime?==?null???false?:?(this.errcode?!=?0???false?:?(this.expiredTime.longValue()?<?System.currentTimeMillis()???false?:?this.ticket?!=?null));}public?String?getJsapi()?{return?jsapi;}public?Long?getExpiredTime()?{return?expiredTime;}public?Integer?getErrcode()?{return?errcode;}public?String?getErrmsg()?{return?errmsg;}public?String?getTicket()?{return?ticket;}public?Integer?getExpires_in()?{return?expires_in;} }以上兩個類完成參照jfinal-weixin-1.2中對access_token的處理方式 。感謝jfinal作者 ?@jfinal
:::::::::::::::::::::::::::::::::::::::::::::::::::
2015-05-29 16:29:58 更新
圖片上傳完成后,需要從微信服務(wù)器下載圖片并保存到本地服務(wù)器
PS:savePath是本地服務(wù)器的保存路徑
getFileAndSave方法的關(guān)鍵代碼如下(需要引入commons-httpclient.jar):
/***?從微信服務(wù)器取圖片并保存到服務(wù)器指定路徑*?@param?url?微信服務(wù)器路徑*?@return?本地服務(wù)器路徑*/public?static?String?getFileAndSave(String?url)?{String?result?=?"";SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyyMMdd");String?ymd?=?sdf.format(new?Date());String?savePath?=?PathKit.getWebRootPath()?+?"/photo/"+ymd+"/";File?uploadDir?=?new?File(savePath);if?(!uploadDir.exists())?{uploadDir.mkdirs();}if?(!uploadDir.isDirectory())?{return?"1";?//上傳目錄不存在。}if?(!uploadDir.canWrite())?{return?"2";?//上傳目錄沒有寫權(quán)限}SimpleDateFormat?df?=?new?SimpleDateFormat("yyyyMMddHHmmss");?//?時間戳String?newFileName?=?df.format(new?Date())?+?"_"+?new?Random().nextInt(1000)?+?".jpg";?//?拼文件名savePath?+=?newFileName;result?=?"/photo/"+ymd+"/"?+?newFileName;HttpClient?client?=?new?HttpClient();GetMethod?get?=?new?GetMethod(url);//????????String?filePath?=?FileKit.getSaveRealPath("jpg");try?{File?storeFile?=?new?File(savePath);FileOutputStream?output?=?null;client.executeMethod(get);output?=?new?FileOutputStream(storeFile);output.write(get.getResponseBody());output.close();}?catch?(HttpException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}return?result;}轉(zhuǎn)載于:https://my.oschina.net/wanily/blog/422121
總結(jié)
以上是生活随笔為你收集整理的jfinal框架增加微信jsapi支持的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scala目录
- 下一篇: hdu5246 超级赛亚ACMer (百