jfinalフレームワークによる微信jsapiサポートの追加
7272 ワード
一部の携帯電話では、画像をアップロードする際にsdカードのアルバムや他の画像を呼び出すことができず、この互換性の問題を解決するために、同じページに2つの画像アップロード案が使用されています. html 5:ピクチャはbase 64に符号化され、バックグラウンドに送信され、復号記憶される.この方法は,非微信ブラウザのアップロード問題を解決するために用いられる. jsapi:微信ブラウザのアップロードの問題を解決するために使用されます.
考え方:
まず、微信ブラウザ(微信jsインタフェース提供方法)であるかどうかを判断し、上記の異なる方法を呼び出す.
ここでは、jfinal統合jsapiのキーコードとプロセスについて説明します.
フロントエンドページにはjavascriptが必要です.公式ドキュメントには詳細な説明があります.以下、私のconfig
以下はフロントエンドページに対応するctrlですが、慣例はキー部分にすぎません
jsapi_をキャッシュするJssdkTicketUtilを次に示します.ticketは、微信の公式文書で何度も強調されているものでもあります.
次はjssdkTicketです.情報を格納します.
以上の2つのクラス完了参照jfinal-weixin-1.2のaccess_tokenの処理方式.jfinal作者@jfinal
:::::::::::::::::::::::::::::::::::::::::::::::::::
2015-05-29 16:29:58更新
画像のアップロードが完了したら、微信サーバーから画像をダウンロードしてローカルサーバーに保存する必要があります.
PS:savePathはローカルサーバの保存パスです
getFileAndSaveメソッドのキーコードは次のとおりです(commons-httpclient.jarを導入する必要があります).
考え方:
まず、微信ブラウザ(微信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×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");
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;
}