文档章节

jfinal框架增加微信jsapi支持

YangTao
 YangTao
发布于 2015/05/29 10:01
字数 904
阅读 1221
收藏 11

部分手机在图片上传的时候,调取不到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;
    }


© 著作权归作者所有

YangTao
粉丝 5
博文 44
码字总数 8265
作品 0
长沙
架构师
私信 提问
JFinal Weixin的Access_token是以什么形式缓存的

我在微信的文档中看到,获取的Access_token建议能缓存起来,我查了JFinal Weixin的源码,没看出来是怎么缓存的,莫非只是个全局变量么?在JFinal启动的时候初始化了这个变量,每次需要的时候...

木川瓦兹
2015/02/05
1K
2
JFinal Weixin 1.5 发布,微信极速 SDK

JFinal Weixin 1.5 大幅完善了对微信公众平台API的支持,以便满足更多开发者的需求。主要添加了微信摇一摇、微信支付、素材管理MediaApi,分布式Token存储等实用功能。 本次版本所有功能来源...

JFinal
2015/11/12
12K
137
JFinal Weixin 1.7发布,用 JFinal 开发,就这么定了

JFinal Weixin 1.7 增加了 Wap支付功能,改进jackson,支持用户信息中含有特殊字符时的json转换,并且修复了一个支付模块中的一个 bug,建议升级。 maven 升级坐标: 最新的 jar 包已经在 jf...

JFinal
2016/01/12
8.2K
35
在集成的 jfinal weixin 中如何将access_token和jsapi_ticket的有效时间提供给第三方接口

@JFinal 你好,想跟你请教个问题:现在我的项目是在 jfinal weixin demo 上开发的 但存在一个问题 就是access_token和jsapi_ticket 的获取 是分装好的 但没有将 获取的时间给 开放出来 这样的...

成长之路n
2016/04/28
318
1
JFinal Weixin 2.3 发布,支持微信小程序开发

jfinal weixin 项目早在五年前就发布了第一个版本,是老牌的微信公众号开发 SDK,已稳定、可靠服役多年。因为极简设计、良好的开发体验,所以深受开发者的喜爱。 五年来 jfinal weixin 一直紧...

JFinal
02/01
2.3K
6

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
12
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部