微信授权(三)微信调用摄像头和相机

 

涉及到了微信获取图片 在这记录一下:

首页H5 会调用jsdk 会用到下面这些参数 ,大部分由java后端提供.

微信授权(三)微信调用摄像头和相机_第1张图片

一: H5 通过接口从后台获取这些数据首先获取access_token,通过access_token获取jsapi_ticket,通过jsapi_ticket获取上面要的数据

具体可以参考一下 :https://www.jianshu.com/p/67a9d703fd99  我也是根据这里面改吧改吧实现的

二: 上代码:

1.接口:

@PostMapping("/config")
    @ResponseBody
    public Map config(@RequestBody JSONObject json) throws UnsupportedEncodingException {
		//获取H5页面地址 进行加密
        String signUrl = json.getString("signUrl");
        Map ret = new HashMap<>();
        TokenSingleton tokenSingleton = TokenSingleton.getInstance();
        Map map = tokenSingleton.getMap();
        String jsapi_ticket = map.get("jsapi_ticket");
        ret = WechatUtil.generateWxTicket(jsapi_ticket, signUrl);
        return ret;
    }

这里面写了一个单例,通过单例获取access_token;

2.获取jsapi_ticket

package com.web.wx.utils;

import com.alibaba.fastjson.JSONObject;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 使用单例模式access_token全局缓存
 */
public class TokenSingleton {

    private Map map = new HashMap<>(); // 缓存accessToken的Map, map中包含一个accessToken和缓存的时间戳

    private  TokenSingleton() {
    }

    private static TokenSingleton single = new TokenSingleton();

    public static TokenSingleton getInstance() {
        if (single == null) {
            single = new TokenSingleton();
        }
        return single;
    }

    public Map getMap() {
        String time = map.get("time");
        String accessToken = map.get("access_token");
        long nowDate = System.currentTimeMillis();

        if (accessToken != null && time != null && nowDate - Long.parseLong(time) < 1799 * 1000) {
            System.out.println("access_token存在,尚未超时,返回单例!");
        } else {
            System.out.println("access_token超时或者不存在,重新获取!");
            JSONObject jsonObject = WechatUtil.getAccessToken();
            String newAccessToken = jsonObject.getString("access_token");
            System.out.println("new access_token = " + newAccessToken);
            String jsApiTicket = getJsApiTicket(newAccessToken);
            map.put("time", System.currentTimeMillis() + "");
            map.put("access_token", newAccessToken);
            map.put("jsapi_ticket", jsApiTicket);
        }

        return map;
    }

    public String getJsApiTicket(String accessToken) {
        String apiTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
        String requestUrl = apiTicketUrl.replace("ACCESS_TOKEN", accessToken);

        JSONObject result = WebUtil.doGet(requestUrl);

        String jsApiTicket = null;
        if (null != result) {
            jsApiTicket = result.getString("ticket");
        }
        return jsApiTicket;
    }
}

package com.web.wx.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/**
 * Web相关工具类
 */
public class WebUtil {

    /**
     * 发起http get请求
     */
    public static JSONObject doGet(String requestUrl) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String responseContent = null;
        JSONObject result = null;

        try {
            HttpGet httpGet = new HttpGet(requestUrl);
            response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            responseContent = EntityUtils.toString(entity, "UTF-8");
            result = JSON.parseObject(responseContent);
        } catch (IOException e) {
            System.out.println("HTTP请求异常:" + e.getMessage());
        }
        System.out.println("result======="+result.toString());
        return result;
    }
}

WechatUtil:

package com.web.wx.utils;

import java.security.MessageDigest;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import com.alibaba.fastjson.JSONObject;

public class WechatUtil {
	//测试
	/*private static String appId = "wxabc670e3c404adf9";
    private static String appSecret = "6ea4288771aee716f483a040e7f83fc0";*/
	
    public static JSONObject getAccessToken() {
        String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appId=APPID&secret=APPSECRET";
        String requestUrl = accessTokenUrl.replace("APPID", appId).replace("APPSECRET", appSecret);
        return WebUtil.doGet(requestUrl);
    }
    //url为H5传入地址
    public static Map generateWxTicket(String jsApiTicket, String url) {
        Map ret = new HashMap<>();
        String nonceStr = createNonceStr();
        String timestamp = createTimestamp();
        String string1;
        String signature = "";

        string1 = "jsapi_ticket=" + jsApiTicket +
                "&noncestr=" + nonceStr +
                "×tamp=" + timestamp +
                "&url=" + url;

        System.out.println("string1 ====> " + string1);

        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
            System.out.println("signature ====> " + signature);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ret.put("url", url);
        ret.put("jsapi_ticket", jsApiTicket);
        ret.put("nonceStr", nonceStr);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);
        ret.put("appid", appId);

        return ret;
    }

    /**
     * 字节数组转换为十六进制字符串
     *
     * @param hash 字节数组
     * @return 十六进制字符串
     */
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }

    /**
     * 生成随机字符串
     *
     * @return 随机字符串
     */
    private static String createNonceStr() {
        return UUID.randomUUID().toString();
    }

    /**
     * 生成时间戳
     *
     * @return 时间戳
     */
    private static String createTimestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
}
    
    

3.通过jsapi_ticket获取参数:

微信授权(三)微信调用摄像头和相机_第2张图片

 

微信授权(三)微信调用摄像头和相机_第3张图片

到这H5就能拿到这些参数了, 返回Base64位 解析图片保存到本地即可

注意的地方是:

access_token 在微信官方上有效时间是2个小时, 但是偶尔会失效, 通过百度找出最佳时间是30分钟,所以单例时间可以设置成29分钟获取一次access_token ,这样就能保证access_token 不会失效

你可能感兴趣的:(JAVA)