微信 扫一扫JSSDK

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+"&timestamp="+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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值