日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jfinal框架增加微信jsapi支持

發(fā)布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jfinal框架增加微信jsapi支持 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

部分手機在圖片上傳的時候,調(diào)取不到sd卡相冊或其他圖片,為了解決這個兼容性問題,同一個頁面使用了兩種圖片上傳方案。

  • html5 :圖片編碼成base64 ,發(fā)送到后臺,解碼存儲。這種方法用于解決非微信瀏覽器的上傳問題。

  • jsapi:用于解決微信瀏覽器的上傳問題。

  • 思路:

    首先判斷是否是微信瀏覽器(微信js接口提供方法),然后調(diào)用上面不同的方法。

    這里記下jfinal整合jsapi的關(guān)鍵代碼和流程 。


    前端頁面需要一段javascript ,官方文檔有詳細說明,以下我的config

  • ????wx.config({debug:?true,appId:?'wx23eeb004xxxx8ecb',?//?必填,公眾號的唯一標識timestamp:'${timestamp}',?//?必填,生成簽名的時間戳nonceStr:?'t8bI2mW5Mxxxx20Y',?//?必填,生成簽名的隨機串signature:?'${signature}',jsApiList:?['chooseImage']});
  • 以下是前端頁面對應(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&timestamp="?+?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ù)器

    savePath?=?HttpClientKit.getFileAndSave("http://file.api.weixin.qq.com/cgi-bin/media/get?access_token="?+?ss.getAccessToken()?+?"&media_id="?+?list.get(i));

    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。