1、扫一扫的jsp页面中,点击按钮扫一扫
function clickWx(){
var urld = encodeURIComponent(window.location.href.split('#')[0]);
$.ajax({
type: "post",
dataType: 'json',
url: '../wx/ScanAction.do',
data: {
url: urld
},
success: function(conf) {
var data=conf.rows;
wx.config({
debug: false,
appId: data.appId,
timestamp:data.timestamp,
nonceStr:data.nonceStr,
signature:data.signature,
jsApiList : [ 'checkJsApi', 'scanQRCode' ]
});//end_config
wx.error(function(res) {
alert("出错了:" + res.errMsg);
});
wx.ready(function() {
wx.checkJsApi({
jsApiList : ['checkJsApi','scanQRCode'],
success : function(res) {
}
});
wx.scanQRCode({
needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType : [ "qrCode", "barCode" ], // 可以指定扫二维码还是一维码,默认二者都有
success : function(res) {
var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
alert(result);
}
});
});//end_ready
},
error: function(event, XMLHttpRequest, ajaxOptions, thrownError) {
}
});
}
2、java后台
java方法中url获取转码url=URLDecoder.decode(url,"UTF-8");
public static Map<String, String> sign(String url) {
String accessToken="";
String jsapi_ticket="";
//1、获取AccessToken
accessToken=WeixinUtil.getAccessToken().getToken();
//2、获取Ticket
jsapi_ticket= WeixinUtil.getJsapiTicket(accessToken).getTicket();
//3、时间戳和随机字符串
String noncestr = create_nonce_str();//随机字符串
String timestamp = create_timestamp();//时间戳
System.out.println("accessToken:"+accessToken+"\njsapi_ticket:"+jsapi_ticket+"\n时间戳:"+timestamp+"\n随机字符串:"+noncestr+"\nurl:"+url);
/*根据JSSDK上面的规则进行计算,这里比较简单,我就手动写啦 */
String[] ArrTmp = {"noncestr="+noncestr,"jsapi_ticket="+jsapi_ticket,"timestamp="+timestamp,"url="+url};
Arrays.sort(ArrTmp);
StringBuffer sf = new StringBuffer();
for(int i=0;i<ArrTmp.length;i++){
sf.append(ArrTmp[i]+"&");
}
String str =sf.toString().substring(0,sf.length()-1);
//5、将参数排序并拼接字符串
// String str = "jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url;
//6、将字符串进行sha1加密
String signature =SHA1(str);
String signature1 =DigestUtils.shaHex(str);
System.out.println("参数:"+str+"\n签名:"+signature+"\n签名1:"+signature1);
Map<String, String> ret = new HashMap<String, String>();
ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", noncestr);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
ret.put("appId", Constants.appId);
return ret;
}
/**
* 产生随机串--由程序自己随机产生
* @return
*/
private static String create_nonce_str() {
return RandomStringUtils.randomAlphanumeric(16);
}
/**
* 由程序自己获取当前时间
* @return
*/
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
public static String SHA1(String decript) {
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.reset();
try {
digest.update(decript.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
// 获取access_token的接口地址(GET) 限200(次/天)
public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
public static AccessToken getAccessToken(String appid, String appsecret) {
AccessToken accessToken = null;
synchronized(a){
String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
// 如果请求成功
if (null != jsonObject) {
try {
accessToken = new AccessToken();
accessToken.setToken(jsonObject.getString("access_token"));
accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
access_token=jsonObject.getString("access_token").toString();
access_token_date=new Date().getTime()/1000;
} catch (JSONException e) {
accessToken = null;
// 获取token失败
log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
}
}
return accessToken;
}
public final static String js_api_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
public static JsapiTicket getJsapiTicket(String accessToken){
JsapiTicket ticket=null;
synchronized(a){
String requestUrl = js_api_ticket_url.replace("ACCESS_TOKEN",accessToken);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
// 如果请求成功
if (null != jsonObject) {
try {
ticket = new JsapiTicket();
ticket.setTicket(jsonObject.getString("ticket"));
ticket.setExpiresIn(jsonObject.getString("expires_in"));
ticket_str=jsonObject.getString("ticket").toString();
ticket_date=new Date().getTime()/1000;
} catch (JSONException e) {
accessToken = null;
// 获取token失败
log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
}
}
return ticket;
}