天天看點

微信 掃一掃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);  

    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;

}

private static String create_nonce_str() {

    return RandomStringUtils.randomAlphanumeric(16);

}

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;

}

繼續閱讀