微信开发 --- 调用微信扫码接口

调用微信扫码接口

步骤一:绑定域名

微信公众号绑定域名

步骤二:引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

请注意,如果你的页面启用了https,务必引入 https://res.wx.qq.com/open/js/jweixin-1.0.0.js ,否则将无法在iOS9.0以上系统中成功使用JSSDK

步骤三:通过config接口注入权限验证配置

这个是调用微信的重要凭证,你想要掉用微信的接口 必须先得把签名通过,这个方法直接放到javascript里

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

步骤四:通过error接口处理失败验证

wx.error(function(res){

    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。

});

步骤五:通过ready接口处理成功验证

wx.ready(function(){

    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
}); 

基础接口
判断当前客户端版本是否支持指定JS接口

wx.checkJsApi({
    jsApiList: ['chooseImage'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
    success: function(res) {
        // 以键值对的形式返回,可用的api值true,不可用为false
        // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
    }
});

微信扫一扫
调起微信扫一扫接口

扫描二维码关注公众号,回复: 4121077 查看本文章
wx.scanQRCode({
    needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
    scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
    success: function (res) {
    var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
}
});

上边就是调用微信扫一扫接口的必要条件了
下边就要放干货了

js

<script  type="text/javascript">
  
	 $.ajax({
         type : "post",
         url : "weixinList/sys.do",
         data : {
             "url" : location.href.split('#')[0]
         },
         dataType : "json",
         success : function(data) {
             wx.config({
                 debug: false, // 开启调试模式   
                 appId:data.data.appId,
                 timestamp:data.data.timestamp,
                 nonceStr:data.data.nonceStr,
                 signature:data.data.signature,
                 jsApiList: [
                               'checkJsApi',
                               'scanQRCode'// 微信扫一扫接口
                            ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 
             }); 
             //wx.config 调不通 执行的方法
              wx.error(function(res) {
                 alert("出错了:" + res.errMsg);//这个地方的好处就是wx.config配置错误,会弹出窗口哪里错误,然后根据微信文档查询即可。
             });
            //wx.config 调通 执行的方法
             wx.ready(function() {
                 wx.checkJsApi({
                      jsApiList : ['scanQRCode'],
                      success : function(res) {

                      }
                 });
             });
             //点击按钮扫描二维码
             $("#scanQRCode").click(function(){
                 wx.scanQRCode({
                     needResult : 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                     scanType : [ "qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
                     success : function(res) {
                    	 var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                     },
                 });
             });

             
         }
     });

</script>

页面加载时 执行ajax方法 获取到wx.config 需要的参数

jsp

<button  id="scanQRCode" >点我 ! 扫描二维码</button>

utils

package xxx.utils;
 
/**
 * 官方给的使用js的验证工具
 * @author Administrator
 *
 */
 //url很重要 一定要从前台获取  要不然 生成片名不一致
public class JsSignUtil {
	    public static Map<String, String> sign(String url) throws IOException {
	    //通过AccessToken获取到ticket   AccessToken怎么获取就不粘了
	        JSONObject jsapiTicketObject = AuthUtil.doGetJson("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + WeiXinUtils.getAccessToken() + "&type=jsapi");
	        String jsapiTicket = (String) jsapiTicketObject.get("ticket");
       
       //下边的就不用看了  直接粘就行

	        System.out.println("微信返回jsapiTicketObject"+jsapiTicketObject);
	        Map<String, String> ret = new HashMap<String, String>();
	        String nonce_str = create_nonce_str();
	        String timestamp = create_timestamp();
	        String string1;
	        String signature = "";
	 
	        //注意这里参数名必须全部小写,且必须有序
	        string1 = "jsapi_ticket=" + jsapiTicket +
	                "&noncestr=" + nonce_str +
	                "&timestamp=" + timestamp +
	                "&url=" + url;
	        System.out.println("string1="+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("url", url);
	        ret.put("jsapi_ticket", jsapiTicket);
	        ret.put("nonceStr", nonce_str);
	        ret.put("timestamp", timestamp);
	        ret.put("signature", signature);
	        ret.put("appId", "wxca42d473ba246dd9");
	 
	        System.out.println("url="+ret.get("url"));
	        System.out.println("jsapi_ticket="+ret.get("jsapi_ticket"));
	        System.out.println("nonceStr="+ret.get("nonceStr"));
	        System.out.println("signature="+ret.get("signature"));
	        System.out.println("timestamp="+ret.get("timestamp"));
	 
	        return ret;
	    }
	 
	 
	    /**
	     * 随机加密
	     * @param hash
	     * @return
	     */
	    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;
	    }
	 
	    /**
	     * 产生随机串--由程序自己随机产生
	     * @return
	     */
	    private static String create_nonce_str() {
	        return UUID.randomUUID().toString();
	    }
	 
	    /**
	     * 由程序自己获取当前时间
	     * @return
	     */
	    private static String create_timestamp() {
	        return Long.toString(System.currentTimeMillis() / 1000);
	    }
	}

Controller

@ResponseBody
@RequestMapping(value="sys")
	public JsonBean sys(String url) throws IOException {
		Map<String, String> ret = JsSignUtil.sign(url);
		return new JsonBean(0,ret,"");
	}

到现在如果你们运气好的话,点一下按钮应该就行了
但是
肯定会遇到这样那样的问题
比如:invalid signature invalid url domain 这些
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
毕竟我也是找了两天三夜

老天保佑你 阿门!!!

猜你喜欢

转载自blog.csdn.net/weixin_41695965/article/details/82870870