微信公众号开发:调用微信扫一扫功能

根据微信api,整理了一下调用微信扫一扫功能。如有问题请指正:

以下是具体步骤:

  1. 1、绑定域名(很关键
  2. 2、引入JS文件(很简单)<scriptsrc="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
  3. 3、通过config接口注入权限验证配置(很重要
  4. 4、通过ready接口处理成功验证(还没用到)
  5. 5、通过error接口处理失败验证(还没用到)
绑定域名(第一步):


以下是通过config接口注入权限验证配置(第三步):

下面是js代码:

$.ajax({
            type : "post",
            url : "/weixin/open/weixinOAuthCallback_sign.action",
            data : {
                "url" : location.href.split('#')[0]
            },
            dataType : "json",
            success : function(data) {
                wx.config({ 
                    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。   
                    appId: data.appId, // 必填,公众号的唯一标识
                    timestamp: data.timestamp, // 必填,生成签名的时间戳
                    nonceStr: data.nonceStr, // 必填,生成签名的随机串
                    signature: data.signature,// 必填,签名,见附录1
                    jsApiList: [
                                  'checkJsApi',
                                  'startRecord',
                                  'stopRecord',
                                  'translateVoice',
                                  'scanQRCode',// 微信扫一扫接口
                                  'openCard'
                               ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 
                }); 
                wx.error(function(res) {
                    alert("出错了:" + res.errMsg);//这个地方的好处就是wx.config配置错误,会弹出窗口哪里错误,然后根据微信文档查询即可。
                });

                wx.ready(function() {
                    wx.checkJsApi({
                         jsApiList : ['scanQRCode'],
                         success : function(res) {

                         }
                    });
                });
                //点击按钮扫描二维码
                $("#scanQRCode").click(function(){
                    wx.scanQRCode({
                        needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                        scanType : [ "qrCode"], // 可以指定扫二维码还是一维码,默认二者都有
                        success : function(res) {
                            var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                            window.location.href = result;//因为我这边是扫描后有个链接,然后跳转到该页面
                        },
                        error : function(){
                            console.log('123');
                        }
                    });
                });
            }
        });

下面是后台java代码,用于 获取sign签名 AppID:微信公众号应用的唯一标识,AppSecret微信公众号的私匙(相当于密码)

/**
       * 得到jsApi-ticket
       * @return
       */
      @SuppressWarnings({ "static-access", "unused" })
      private String getJsapiTicket(){
            HttpServletRequest request = ServletActionContext.getRequest();
            String code = request.getParameter("code");
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?"; 
        String params = "grant_type=client_credential&appid=" + APPID + "&secret=" + APP_SECRET + ""; 
        String result = this.httpGet(requestUrl+params); 
        String accessToken = com.alibaba.fastjson.JSONObject.parseObject(result).getString("access_token"); 
       
        requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?"; 
        params = "access_token=" + accessToken + "&type=jsapi"; 
        result = this.httpGet(requestUrl+params); 
        String jsapi_ticket = com.alibaba.fastjson.JSONObject.parseObject(result).getString("ticket"); 
        return jsapi_ticket;
    }
      /**
       * 获取sign签名
       * @return
       */
      public String sign() {
            HttpServletRequest request = ServletActionContext.getRequest();
        Map ret = new HashMap();
        String url = request.getParameter("url");
        String jsapi_ticket= getJsapiTicket();
        String nonce_str = create_nonce_str();
        String timestamp = create_timestamp();
        String string1;
        String signature = "";
        int length=url.indexOf("#");
            String uri = url;
            if(length > 0){
                  uri=url.substring(0,length);//当前网页的URL,不包含#及其后面部分
            }
        //注意这里参数名必须全部小写,且必须有序
        string1 = "jsapi_ticket=" + jsapi_ticket +
                  "&noncestr=" + nonce_str +
                  "&timestamp=" + timestamp +
                  "&url=" + url;
        System.out.println(string1);
        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        ret.put("appId", APPID);
        ret.put("url", uri);
        ret.put("jsapi_ticket", jsapi_ticket);
        ret.put("nonceStr", nonce_str);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);
        System.out.println(signature);
        this.setJsonString(JsonUtil.toJSONString(ret));
        return "json";
    }
    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;
    }
    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }
    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
      /**
     * 发送get请求
     * @param url    路径
     * @return
     */ 
    public static String httpGet(String url){ 
        //get请求返回结果 
         String strResult = null; 
        try { 
            DefaultHttpClient client = new DefaultHttpClient(); 
            //发送get请求 
            HttpGet request = new HttpGet(url); 
            HttpResponse response = client.execute(request); 
  
            /**请求发送成功,并得到响应**/ 
            if (response.getStatusLine().getStatusCode() == org.apache.http.HttpStatus.SC_OK) { 
                /**读取服务器返回过来的json字符串数据**/ 
                  strResult = EntityUtils.toString(response.getEntity()); 
            } else { 
                logger.error("get请求提交失败:" + url); 
            } 
        } catch (IOException e) { 
            logger.error("get请求提交失败:" + url, e); 
        } 
        return strResult; 
    }

猜你喜欢

转载自blog.csdn.net/yanzi920403/article/details/78184813