jfinalフレームワークによる微信jsapiサポートの追加

7272 ワード

一部の携帯電話では、画像をアップロードする際にsdカードのアルバムや他の画像を呼び出すことができず、この互換性の問題を解決するために、同じページに2つの画像アップロード案が使用されています.
  • html 5:ピクチャはbase 64に符号化され、バックグラウンドに送信され、復号記憶される.この方法は,非微信ブラウザのアップロード問題を解決するために用いられる.
  • jsapi:微信ブラウザのアップロードの問題を解決するために使用されます.

  • 考え方:
    まず、微信ブラウザ(微信jsインタフェース提供方法)であるかどうかを判断し、上記の異なる方法を呼び出す.
    ここでは、jfinal統合jsapiのキーコードとプロセスについて説明します.
    フロントエンドページにはjavascriptが必要です.公式ドキュメントには詳細な説明があります.以下、私のconfig
  •     
        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");

    jsapi_をキャッシュするJssdkTicketUtilを次に示します.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;
        }
    }

    以上の2つのクラス完了参照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;
        }