部分手机在图片上传的时候,调取不到sd卡相册或其他图片,为了解决这个兼容性问题,同一个页面使用了两种图片上传方案。

  1. html5 :图片编码成base64 ,发送到后台,解码存储。这种方法用于解决非微信浏览器的上传问题。

  2. jsapi:用于解决微信浏览器的上传问题。

思路:

首先判断是否是微信浏览器(微信js接口提供方法),然后调用上面不同的方法。

这里记下jfinal整合jsapi的关键代码和流程 。

前端页面需要一段javascript ,官方文档有详细说明,以下我的config

  1.     wx.config({debug: true,appId: 'wx23eeb004xxxx8ecb', // 必填,公众号的唯一标识timestamp:'${timestamp}', // 必填,生成签名的时间戳nonceStr: 't8bI2mW5Mxxxx20Y', // 必填,生成签名的随机串signature: '${signature}',jsApiList: ['chooseImage']});

以下是前端页面对应的ctrl ,惯例只是关键部分

//微信ApiConfig ac = new ApiConfig();String token = ConfigUtil.get("weixinToken");String appid = ConfigUtil.get("weixinAppId");String secret = ConfigUtil.get("weixinSecret");// 配置微信 API 相关常量ac.setToken(token);ac.setAppId(appid);ac.setAppSecret(secret);/***  是否对消息进行加密,对应于微信平台的消息加解密方式:*  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,也是微信官方文档中一再强调的东西

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 ;//服务器返回private Long expiredTime ; //过期时间private Integer errcode;  //错误码private String errmsg; //错误信息private String ticket; //票据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 更新

图片上传完成后,需要从微信服务器下载图片并保存到本地服务器

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

PS:savePath是本地服务器的保存路径

getFileAndSave方法的关键代码如下(需要引入commons-httpclient.jar):

/*** 从微信服务器取图片并保存到服务器指定路径* @param url 微信服务器路径* @return 本地服务器路径*/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"; //上传目录没有写权限}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;}

转载于:https://my.oschina.net/wanily/blog/422121

jfinal框架增加微信jsapi支持相关推荐

  1. php接入微信JSAPI支付,微信内拉起支付,基于thinkPHP框架 WeChatDeveloper支付类包

    文章:php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南 文章:php快速接入支付宝即时支付,PC网站支付和手机网站支付 ...

  2. Evento 易语言web服务框架 微信小程序 微信支付 微信JSAPI调用

    Evento 易语言web服务框架使用说明 前言: 为什么要有这个东西,C/S构架在十多年前就已经开始向主流的B/S构架转型,其中在易语言WEB应用也不泛优秀的例程和应用.官方出了针对IIS开发的IS ...

  3. 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示

    微信公众号开发系列-13.基于RDIFramework.NET框架整合微信开发应用效果展示 1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为 ...

  4. 微信jsApI及微信分享对应在手机浏览器的调用总结。

    摘录自别人的博客: 第一篇:微信内置浏览器的JsAPI(WeixinJSBridge续) 之前有写过几篇关于微信内置浏览器(WebView)中特有的Javascript API(Javascript ...

  5. WebAPI增加Area以支持无限层级同名Controller

    原文:WebAPI增加Area以支持无限层级同名Controller 微软的WebAPI默认实现逻辑 默认实现中不支持同名Controller,否则在访问时会报HttpError,在网上找到了各种路由 ...

  6. oracle19c方言,JFinal框架操作oracle数据库

    JFinal框架操作oracle数据库,需要在configPlugin()方法中配置链接oracle数据库的相关配置 配置JFinal数据库操作插件,configPlugin方法 这里我加载jdbc. ...

  7. 微信公众号php提交表单,PHP教程:使用YII2框架实现微信公众号中表单提交功能...

    <PHP教程:使用YII2框架实现微信公众号中表单提交功能>要点: 本文介绍了PHP教程:使用YII2框架实现微信公众号中表单提交功能,希望对您有用.如果有疑问,可以联系我们. 相关主题: ...

  8. jfinal html5,Jfinal框架整合webSocket技术功能实现

    技术难度:简单 在这里我会用最简单的方法实现JFinal框架结合webSocket最基础的功能,以至于后续业务的拓展需要小伙伴们依据实际情况去实现相应的开发! 废话不多说,直接上代码! 1.编写web ...

  9. 微信开发php插件下载图片,微信开发之微信jsapi选择图片,上传图片,预览和下载图片方法...

    参数描述 appId公众号的唯一标识 应用id timestamp生成签名的时间戳 nonceStr生成签名的随机串 signature签名 上述表格中的四个参数是初始化调用微信jsapi的凭证,咱们 ...

最新文章

  1. PlayMaker的特殊事件FINISHED
  2. HL7 ADT Message Sample
  3. WinForm创建系统托盘以及操作注册表
  4. Ubuntu上安装TensorFlow(python2.7版)
  5. eclipse导入github项目提示没有发现项目_eclipse clone克隆github远程库工程到本地
  6. 飞流直下三千尺的acd看图软件下载
  7. python import 错误 TypeError: 'module' object is not callable
  8. android开发界面 淡出,Android 界面淡出 淡入效果
  9. 那些汽车搭载鸿蒙,首台搭载鸿蒙OS的汽车要来了?
  10. DevExpress DXperience 的ASPxFilterControl 不显示 Like 菜单的方法
  11. azure上传excel_使用MS Excel访问Azure中的关系SQL数据库
  12. MySQL filesort优化案例一则
  13. 记录一下树莓派使用qBittorrent做种走弯路
  14. 手机上好用的java编译器_手机上好用的java编译器
  15. 模拟微博登陆,获取微博cookie
  16. 连接数据库查询数据的工具类(底层实现)——以查询Phoenix为例
  17. 宇宙机器人超级计算机,宇宙机器人无线控制器使用指南白金攻略[多图]
  18. c语言字符码,C语言字符转ASII码
  19. 网络安全绝地求生-面试题
  20. [元带你学NVMe协议] ] 插槽接口(M.2 / mSATA / SATA )、总线(PCIE / SATA )、传输协议(NVME / AHCI) 图解

热门文章

  1. android 入门
  2. oracle em登陆不了,账户密码过期
  3. 算法导论——动态规划:0-1背包问题(完全解)
  4. 文档生产工具 Doxygen
  5. [转]ANT技术研究--与VSS整合自动获取源码进行编译
  6. jvm类加载机制_面试:对于JVM类加载机制深度解析
  7. python求1到n的乘积_Python简单实现两个任意字符串乘积的方法示例
  8. 【转载】YOLOV详解
  9. 为什么不能在init和dealloc函数中使用accessor方法
  10. 作业二:了解流行的软件