微信开发今天产品设计了一个非常恶心的功能,手机端H5点击按钮调用扫一扫,去识别二维码。
不过有微信的开发文档,一步一个代码来的整。
大概分为几步:
1.首先得有appid和secret——>获取access_token值(可谓是得access_token得半壁江山啊)
2.根据access_token以GET方式获取jsapi_ticket(jsapi_ticket有过期时间,2小时必须缓存处理)
3.权限签名见文档详细得很! 微信签名算法文档 4.引入官方jweixin-1.6.0.js文件,以及注意大小写 注意大小写 驼峰写法!!!!
5.开发平台记得配置域名,因为扫一扫需要页面完全的url,记得添加。
6.签名错误的话,可以去这验证查看:验证签名 上代码:

//get方式拼接 获取token
	$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
   	$res = json_decode($this->httpGet($url));

   	$access_token = $res->access_token;
 	//获取ticket
 	$ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$access_token";
    $ticket_res = json_decode($this->httpGet($ticket_url ));
    if ($ticket_res->errcode == '0') {
        $ticket = $res->ticket;
    }
    //PHP获取链接
    $url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    //jq获取url
	sign_url=location.href.split('#')[0];
    //时间戳
    $timestamp = time();
    //随机数
    $nonceStr = $this->createNonceStr();
    
    // 这里参数的顺序要按照 key 值 ASCII 码升序排序
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
    $signature = sha1($string);
    $signPackage = array(
        "appId" => $this->appId,
        "nonceStr" => $nonceStr,
        "timestamp" => $timestamp,
        "url" => $url,
        "signature" => $signature,
        "rawString" => $string
    );

JQ代码 页面

<script type="text/javascript" src="/static/js/jweixin-1.6.0.js?v=<{$js_version}>"></script>
<script>

//判断是否是微信浏览器的函数
    function isWeiXin(){
        //window.navigator.userAgent属性包含了浏览器类型、版本、操作系统类型、浏览器引擎类型等信息,这个属性可以用来判断浏览器类型
        var ua = window.navigator.userAgent.toLowerCase();
        //通过正则表达式匹配ua中是否含有MicroMessenger字符串
        if(ua.match(/MicroMessenger/i) == 'micromessenger'){
            return true;
        }else{
            return false;
        }
    }

    $("#scan").click(function(){
        var sign_url=location.href.split('#')[0];

        var is_wx = isWeiXin();
        if(!is_wx){
            alert('请选择微信进行操作!');
        }
        $.ajax({
            url:'/sale/wxConfigScan/',
            type:"GET",
            data:{sign_url:sign_url},
            dataType:"json",
            async:false,
            success:function (res) {
                sign=res.Data;
            },
            error:function () {
    //            alert('服务器出错了!');
            }
        });
        wx.config({
            debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: sign.appId, // 必填,公众号的唯一标识
            timestamp:sign.timestamp, // 必填,生成签名的时间戳
            nonceStr: sign.nonceStr, // 必填,生成签名的随机串
            signature: sign.signature,// 必填,签名,见附录1
            jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        });
        wx.error(function(res){
            // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
        });
        wx.scanQRCode({
            needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
            scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
            success: function (res) {
              var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
            }
        });
    })
    </script>

其他:

public function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
        // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }
	public function createNonceStr($length = 16)
    {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }