微信开发今天产品设计了一个非常恶心的功能,手机端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;
}