原创

Java微信签名,前端微信扫一扫集成示例

温馨提示:
本文最后更新于 2022年08月29日,已超过 600 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

Java后端微信签名

package com.feiprc.utils.wechat;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

import com.feiprc.utils.UUIDUtil;

/** 
 * @author 作者 92cxy.cn 
 * @describe 类说明 
 */
public class JsSignUtil {
	/**
	 * 签名工具
	 * 
	 * @param url
	 * @return
	 */
	public static Map<String, String> sign(String url) {
		Map<String, String> ret = new HashMap<String, String>();
		if (TokenManager.getAccessToken().equals("")
				|| TokenManager.isTokenExpired()) {
			try {
				TokenManager.init();
				TicketManager.init();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		String jsApiTicket = TicketManager.getApiTicket();
		String nonceStr = create_nonce_str();
		String timeStamp = create_timestamp();
		String signature = "";
		// 注意这里参数名必须全部小写,且必须有序
		String str = "jsapi_ticket=" + jsApiTicket + "&noncestr=" + nonceStr
				+ "&timestamp=" + timeStamp + "&url=" + url;
		Logger.getLogger(TokenManager.class.getName()).info(str);
		try {
			MessageDigest crypt = MessageDigest.getInstance("SHA-1");
			crypt.reset();
			crypt.update(str.getBytes("UTF-8"));
			signature = byteToHex(crypt.digest());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException 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", AppString.APPID);
		Logger.getLogger(TokenManager.class.getName()).info(ret.toString());
		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 create_nonce_str() {
		return UUIDUtil.getUUID();
	}
 
	/**
	 * 由程序自己获取当前时间
	 * 
	 * @return
	 */
	private static String create_timestamp() {
		return Long.toString(System.currentTimeMillis() / 1000);
	}
 
}

前端集成示例

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/wechathtml/taglib.jsp"%>    
<!doctype html>
<html>

<head>
	<meta charset="UTF-8">
	<title>扫描二维码</title>
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
	<link rel="stylesheet" href="${ctxStatic}/css/common.css" />
	<link href="${static}/css/weui.min.css" rel="stylesheet" type="text/css" />
</head>

<body>

	<div>
		<a href="#" onclick="scanQRCode()">
			<img src="${ctxStatic}/images/scan.png" style="width: 40%;height: 50%;margin-left: 30%;margin-top: 70%;" />
			<p class="weui-grid__label" style="font-size: 30px;">巡检扫码</p>
		</a> 
	</div>

<script src="${ctxStatic}/js/jquery-1.9.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"> </script>
<script type="text/javascript">
	$(function() {
		sign();
	});
	
	function sign(){
	    //获取签名
	    $.ajax({
	        url: '/sign.action',
	        type: 'post',
	        dataType: 'json',
	        async: false,
//	         data: {url:document.URL},
	        data: {url:"http://www.***.com/scanQRCode.action"},
	        success:function(res){
// 	            console.log(res);
	            //获得签名之后传入配置中进行配置
	            wxConfig(res.appId,res.timestamp,res.nonceStr,res.signature);
	        }
	    })
	}

	function wxConfig(_appId,_timestamp, _nonceStr, _signature) {
// 	    console.log('获取数据:' + _timestamp +'\n' + _nonceStr +'\n' + _signature);
	    wx.config({
	        debug:false,// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
	        appId: _appId,// 必填,公众号的唯一标识
	        timestamp: _timestamp,// 必填,生成签名的时间戳
	        nonceStr: _nonceStr,// 必填,生成签名的随机串
	        signature: _signature,// 必填,签名,见附录1
	        jsApiList: ['checkJsApi','scanQRCode']
	        // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
	    });
	}
	
	function scanQRCode(){
	    wx.scanQRCode({
	        desc: 'scanQRCode desc',
	        needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
	        scanType : [ "qrCode", "barCode" ], // 可以指定扫二维码还是一维码,默认二者都有
	        success : function(res) {
// 	            console.log("调用扫描成功",res);
// 	            var result = window.atob(res.resultStr); // 当needResult 为 1 时,扫码返回的结果
	            var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
// 	            alert("扫码结果为:" + result);
	            if (result.indexOf("jf=") != -1) {
	            	window.location="../xungeng/xungeng_form.action?"+result;
				}else{
					alert("无效二维码!");
				}
	        },
	        error:function(res){
// 	            console.log(res)
	        }
	    });
	}
	
</script>
</body>

</html>
正文到此结束
该篇文章的评论功能已被站长关闭
本文目录