java-微信公众号h5调起扫一扫

目录

准备工作

需要一个微信公众号-服务号

微信公众号

公众号设置==>功能设置

java-微信公众号h5调起扫一扫_第1张图片

 

.txt文件下载放在项目根目录

域名为h5的访问域名 列如 www.baidu.com

java-微信公众号h5调起扫一扫_第2张图片

java代码

appId 写自己公众号的appId

access_token为当前公众号的access_token,不知道怎么获取access_token的朋友可以看https://blog.csdn.net/u013008827/article/details/89085133

在这里我是把access_token放到了redis中,access_token的有效期为两个小时,起个定时任务,一个半小时更新一次

package com.kj.utils.wxQRCode;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.kj.common.Constants;
import com.kj.util.RedisCache;
import com.kj.utils.PropertiesUtil;
import com.kj.utils.SpringContextUtils;

import net.sf.json.JSONObject;


public class WxShare {
	
	private static Log logger = LogFactory.getLog(WxShare.class);
	@Autowired
	private static RedisCache redisCache;	
	@Autowired
	private static PropertiesUtil propertiesUtil;
	
	 static{
		if(redisCache==null){
			redisCache = (RedisCache)SpringContextUtils.getBean("redisCache");
		}
		if(propertiesUtil==null){
			propertiesUtil = (PropertiesUtil)SpringContextUtils.getBean("proUtil");
		}
	 }
	 
	 /**
    * 方法名:httpRequest
    * 详述:发送http请求
    * 开发人员:zjw 
    * 创建时间:2016-1-5  
    * @param requestUrl
    * @param requestMethod
    * @param outputStr
    * @return 说明返回值含义
    * @throws 说明发生此异常的条件
     */
    public static JSONObject httpRequest(String requestUrl,String requestMethod, String outputStr) {
        JSONObject jsonObject = null;
        StringBuffer buffer = new StringBuffer();
        try {
        	TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom()); 
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            URL url = new URL(requestUrl);
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
            httpUrlConn.setSSLSocketFactory(ssf);
            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
            httpUrlConn.setUseCaches(false);
            httpUrlConn.setRequestMethod(requestMethod);
            if ("GET".equalsIgnoreCase(requestMethod))
                httpUrlConn.connect();
            if (null != outputStr) {
                OutputStream outputStream = httpUrlConn.getOutputStream();
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            httpUrlConn.disconnect();
            jsonObject = JSONObject.fromObject(buffer.toString());
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

    /**
    * 方法名:byteToHex
    * 详述:字符串加密辅助方法 
    * 开发人员:zjw  
    * 创建时间:2016-1-5  
    * @param hash
    * @return 说明返回值含义
    * @throws 说明发生此异常的条件
     */
    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;

    }

    
    public static Map getWxConfig(HttpServletRequest request, String reqUrl){
    	logger.info("进入微信配置信息,开始获取参数"+request.getParameterMap());
    	Map map = new HashMap();
    	
    	String appId = propertiesUtil.getAppId(); // 必填,公众号的唯一标识
    	String access_token = (String) redisCache.select(Constants.REDISKEY_ACCESS_TOKEN);
        String jsapi_ticket = "";
        
        String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成签名的时间戳
        String nonceStr = UUID.randomUUID().toString(); // 必填,生成签名的随机串
       
        if (access_token != null) {
            String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token + "&type=jsapi";
            JSONObject json = httpRequest(url, "GET", null);
            if (json != null) {
                jsapi_ticket = json.getString("ticket");
                logger.info("进入微信分享接口,参数jsapi_ticket为:"+jsapi_ticket);
            }
        }
        String signature = "";
        // 注意这里参数名必须全部小写,且必须有序
        String sign = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr+ "×tamp=" + timestamp + "&url=" + reqUrl;
        
        logger.info("请求路径:"+sign);
        
        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(sign.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        map.put("appId", appId);
        map.put("timestamp", timestamp);
        map.put("nonceStr", nonceStr);
        map.put("signature", signature);
    	
    	return map;
    }
}

h5代码

引入js文件







 

口令支付




口令支付
输入口令
请输入您获得的口令字符,立即使用,即可支付

?

确定

 

最终效果

java-微信公众号h5调起扫一扫_第3张图片

java-微信公众号h5调起扫一扫_第4张图片


你可能感兴趣的:(JAVA,spring-boot,微信公众号开发,第三方)