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

来源:互联网 发布:贵州大数据峰会 马云 编辑:程序博客网 时间:2024/05/29 04:26

根据微信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 +                  "×tamp=" + 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;     }

阅读全文
1 0
原创粉丝点击