微信网页二维码扫描
2016-12-06 15:08
417 查看
微信扫一扫文档
1先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”
备注:登录后可在“开发者中心”查看对应的接口权限。
2在页面中引入js: https://res.wx.qq.com/open/js/jweixin-1.0.0.js
3配置wx
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
注意:signature的生成最为关键
1)获取token https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=公众号id&secret=公众号秘钥 2)获取ticket https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=上一步获取的token&type=jsapi
3)生成nature function
getsignature(ticket) {
var nonceStr
= "1564sdf2s1d2f5";
Var timeStamp =
parseInt(new
Date().getTime() /
1000)
+ "";
var signatrue
= 'jsapi_ticket=' +
ticket +
'&noncestr=' +
nonceStr +
'×tamp=' +
timeStamp +
'&url=本网页的网络地址';
hex_sha1(signature);//进行sha1加密
}
sha1加密算法见附录1
4调用扫一扫接口
wx.scanQRCode({
desc:
'scanQRCode desc',
needResult:
0,
// 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType:
["qrCode",
"barCode"],
// 可以指定扫二维码还是一维码,默认二者都有
success:
function(res) {
alert("scan:" +
JSON.stringify(res));
var result
= res.resultStr;
// 当needResult 为 1 时,扫码返回的结果
},
fail:function(res){
alert("fail:" +
JSON.stringify(res));
}
});
附录1
var hexcase
= 0;
/* hex output format. 0 - lowercase; 1 - uppercase */
var b64pad
= "";
/* base-64 pad character. "=" for strict RFC compliance */
var chrsz
= 8;
/* bits per input character. 8 - ASCII; 16 - Unicode */
function hex_sha1(s) {
return binb2hex(core_sha1(str2binb(s), s.length
* chrsz));
}
function b64_sha1(s) {
return binb2b64(core_sha1(str2binb(s), s.length
* chrsz));
}
function str_sha1(s) {
return binb2str(core_sha1(str2binb(s), s.length
* chrsz));
}
function hex_hmac_sha1(key,
data) {
return binb2hex(core_hmac_sha1(key, data));
}
function b64_hmac_sha1(key,
data) {
return binb2b64(core_hmac_sha1(key, data));
}
function str_hmac_sha1(key,
data) {
return binb2str(core_hmac_sha1(key, data));
}
/*
* Perform a simple self-test to see if the VM is working
*/
function sha1_vm_test() {
return hex_sha1("abc")
== "a9993e364706816aba3e25717850c26c9cd0d89d";
}
function core_sha1(x, len)
{
/* append padding */
x[len >>
5]
|= 0x80
<< (24
- len
% 32);
x[((len +
64 >>
9)
<< 4)
+ 15]
= len;
var w
= Array(80);
var a
= 1732584193;
var b
= -271733879;
var c
= -1732584194;
var d
= 271733878;
var e
= -1009589776;
for(var
i =
0; i
< x.length; i
+= 16) {
var olda
= a;
var oldb
= b;
var oldc
= c;
var oldd
= d;
var olde
= e;
for(var
j =
0; j
< 80; j++) {
if(j
< 16) w[j]
= x[i
+ j];
else w[j]
= rol(w[j
- 3]
^ w[j
- 8]
^ w[j
- 14]
^ w[j
- 16],
1);
var t
= safe_add(safe_add(rol(a,
5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
e =
d;
d =
c;
c =
rol(b, 30);
b =
a;
a =
t;
}
a =
safe_add(a, olda);
b =
safe_add(b, oldb);
c =
safe_add(c, oldc);
d =
safe_add(d, oldd);
e =
safe_add(e, olde);
}
return Array(a, b, c, d, e);
}
function sha1_ft(t,
b,
c,
d) {
if(t
< 20)
return(b
& c)
| ((~b)
& d);
if(t
< 40)
return b
^ c
^ d;
if(t
< 60)
return(b
& c)
| (b
& d)
| (c
& d);
return b
^ c
^ d;
}
function sha1_kt(t) {
return(t
< 20)
? 1518500249
: (t <
40)
? 1859775393
: (t <
60)
? -1894007588
: -899497514;
}
function core_hmac_sha1(key,
data) {
var bkey
= str2binb(key);
if(bkey.length
> 16) bkey
= core_sha1(bkey,
key.length
* chrsz);
var ipad
= Array(16),
opad =
Array(16);
for(var
i =
0; i
< 16; i++) {
ipad[i] =
bkey[i] ^
0x36363636;
opad[i] =
bkey[i] ^
0x5C5C5C5C;
}
var hash
= core_sha1(ipad.concat(str2binb(data)),
512 +
data.length *
chrsz);
return core_sha1(opad.concat(hash),
512 +
160);
}
function safe_add(x,
y) {
var lsw
= (x
& 0xFFFF)
+ (y
& 0xFFFF);
var msw
= (x
>> 16)
+ (y
>> 16)
+ (lsw
>> 16);
return(msw
<< 16)
| (lsw
& 0xFFFF);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
function rol(num,
cnt) {
return(num
<< cnt)
| (num
>>> (32
- cnt));
}
function str2binb(str) {
var bin
= Array();
var mask
= (1
<< chrsz)
- 1;
for(var
i =
0; i
< str.length
* chrsz; i
+= chrsz)
bin[i >>
5]
|= (str.charCodeAt(i
/ chrsz)
& mask)
<< (24
- i
% 32);
return bin;
}
function binb2str(bin) {
var str
= "";
var mask
= (1
<< chrsz)
- 1;
for(var
i =
0; i
< bin.length
* 32; i
+= chrsz)
str +=
String.fromCharCode((bin[i >>
5]
>>> (24
- i
% 32))
& mask);
return str;
}
function binb2hex(binarray) {
var hex_tab
= hexcase
? "0123456789ABCDEF" : "0123456789abcdef";
var str
= "";
for(var
i =
0; i
< binarray.length
* 4; i++) {
str +=
hex_tab.charAt((binarray[i >>
2]
>> ((3
- i
% 4)
* 8
+ 4))
& 0xF)
+ hex_tab.charAt((binarray[i
>> 2]
>> ((3
- i
% 4)
* 8))
& 0xF);
}
return str;
}
function binb2b64(binarray) {
var tab
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var str
= "";
for(var
i =
0; i
< binarray.length
* 4; i
+= 3) {
var triplet
= (((binarray[i
>> 2]
>> 8
* (3
- i
% 4))
& 0xFF)
<< 16)
| (((binarray[i
+ 1
>> 2]
>> 8
* (3
- (i
+ 1)
% 4))
& 0xFF)
<< 8)
| ((binarray[i
+ 2
>> 2]
>> 8
* (3
- (i
+ 2)
% 4))
& 0xFF);
for(var
j =
0; j
< 4; j++) {
if(i
* 8
+ j
* 6
> binarray.length
* 32) str
+= b64pad;
else str
+= tab.charAt((triplet
>> 6
* (3
- j))
& 0x3F);
}
}
return str;
}
1先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”
备注:登录后可在“开发者中心”查看对应的接口权限。
2在页面中引入js: https://res.wx.qq.com/open/js/jweixin-1.0.0.js
3配置wx
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
注意:signature的生成最为关键
1)获取token https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=公众号id&secret=公众号秘钥 2)获取ticket https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=上一步获取的token&type=jsapi
3)生成nature function
getsignature(ticket) {
var nonceStr
= "1564sdf2s1d2f5";
Var timeStamp =
parseInt(new
Date().getTime() /
1000)
+ "";
var signatrue
= 'jsapi_ticket=' +
ticket +
'&noncestr=' +
nonceStr +
'×tamp=' +
timeStamp +
'&url=本网页的网络地址';
hex_sha1(signature);//进行sha1加密
}
sha1加密算法见附录1
4调用扫一扫接口
wx.scanQRCode({
desc:
'scanQRCode desc',
needResult:
0,
// 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType:
["qrCode",
"barCode"],
// 可以指定扫二维码还是一维码,默认二者都有
success:
function(res) {
alert("scan:" +
JSON.stringify(res));
var result
= res.resultStr;
// 当needResult 为 1 时,扫码返回的结果
},
fail:function(res){
alert("fail:" +
JSON.stringify(res));
}
});
附录1
var hexcase
= 0;
/* hex output format. 0 - lowercase; 1 - uppercase */
var b64pad
= "";
/* base-64 pad character. "=" for strict RFC compliance */
var chrsz
= 8;
/* bits per input character. 8 - ASCII; 16 - Unicode */
function hex_sha1(s) {
return binb2hex(core_sha1(str2binb(s), s.length
* chrsz));
}
function b64_sha1(s) {
return binb2b64(core_sha1(str2binb(s), s.length
* chrsz));
}
function str_sha1(s) {
return binb2str(core_sha1(str2binb(s), s.length
* chrsz));
}
function hex_hmac_sha1(key,
data) {
return binb2hex(core_hmac_sha1(key, data));
}
function b64_hmac_sha1(key,
data) {
return binb2b64(core_hmac_sha1(key, data));
}
function str_hmac_sha1(key,
data) {
return binb2str(core_hmac_sha1(key, data));
}
/*
* Perform a simple self-test to see if the VM is working
*/
function sha1_vm_test() {
return hex_sha1("abc")
== "a9993e364706816aba3e25717850c26c9cd0d89d";
}
function core_sha1(x, len)
{
/* append padding */
x[len >>
5]
|= 0x80
<< (24
- len
% 32);
x[((len +
64 >>
9)
<< 4)
+ 15]
= len;
var w
= Array(80);
var a
= 1732584193;
var b
= -271733879;
var c
= -1732584194;
var d
= 271733878;
var e
= -1009589776;
for(var
i =
0; i
< x.length; i
+= 16) {
var olda
= a;
var oldb
= b;
var oldc
= c;
var oldd
= d;
var olde
= e;
for(var
j =
0; j
< 80; j++) {
if(j
< 16) w[j]
= x[i
+ j];
else w[j]
= rol(w[j
- 3]
^ w[j
- 8]
^ w[j
- 14]
^ w[j
- 16],
1);
var t
= safe_add(safe_add(rol(a,
5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
e =
d;
d =
c;
c =
rol(b, 30);
b =
a;
a =
t;
}
a =
safe_add(a, olda);
b =
safe_add(b, oldb);
c =
safe_add(c, oldc);
d =
safe_add(d, oldd);
e =
safe_add(e, olde);
}
return Array(a, b, c, d, e);
}
function sha1_ft(t,
b,
c,
d) {
if(t
< 20)
return(b
& c)
| ((~b)
& d);
if(t
< 40)
return b
^ c
^ d;
if(t
< 60)
return(b
& c)
| (b
& d)
| (c
& d);
return b
^ c
^ d;
}
function sha1_kt(t) {
return(t
< 20)
? 1518500249
: (t <
40)
? 1859775393
: (t <
60)
? -1894007588
: -899497514;
}
function core_hmac_sha1(key,
data) {
var bkey
= str2binb(key);
if(bkey.length
> 16) bkey
= core_sha1(bkey,
key.length
* chrsz);
var ipad
= Array(16),
opad =
Array(16);
for(var
i =
0; i
< 16; i++) {
ipad[i] =
bkey[i] ^
0x36363636;
opad[i] =
bkey[i] ^
0x5C5C5C5C;
}
var hash
= core_sha1(ipad.concat(str2binb(data)),
512 +
data.length *
chrsz);
return core_sha1(opad.concat(hash),
512 +
160);
}
function safe_add(x,
y) {
var lsw
= (x
& 0xFFFF)
+ (y
& 0xFFFF);
var msw
= (x
>> 16)
+ (y
>> 16)
+ (lsw
>> 16);
return(msw
<< 16)
| (lsw
& 0xFFFF);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
function rol(num,
cnt) {
return(num
<< cnt)
| (num
>>> (32
- cnt));
}
function str2binb(str) {
var bin
= Array();
var mask
= (1
<< chrsz)
- 1;
for(var
i =
0; i
< str.length
* chrsz; i
+= chrsz)
bin[i >>
5]
|= (str.charCodeAt(i
/ chrsz)
& mask)
<< (24
- i
% 32);
return bin;
}
function binb2str(bin) {
var str
= "";
var mask
= (1
<< chrsz)
- 1;
for(var
i =
0; i
< bin.length
* 32; i
+= chrsz)
str +=
String.fromCharCode((bin[i >>
5]
>>> (24
- i
% 32))
& mask);
return str;
}
function binb2hex(binarray) {
var hex_tab
= hexcase
? "0123456789ABCDEF" : "0123456789abcdef";
var str
= "";
for(var
i =
0; i
< binarray.length
* 4; i++) {
str +=
hex_tab.charAt((binarray[i >>
2]
>> ((3
- i
% 4)
* 8
+ 4))
& 0xF)
+ hex_tab.charAt((binarray[i
>> 2]
>> ((3
- i
% 4)
* 8))
& 0xF);
}
return str;
}
function binb2b64(binarray) {
var tab
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var str
= "";
for(var
i =
0; i
< binarray.length
* 4; i
+= 3) {
var triplet
= (((binarray[i
>> 2]
>> 8
* (3
- i
% 4))
& 0xFF)
<< 16)
| (((binarray[i
+ 1
>> 2]
>> 8
* (3
- (i
+ 1)
% 4))
& 0xFF)
<< 8)
| ((binarray[i
+ 2
>> 2]
>> 8
* (3
- (i
+ 2)
% 4))
& 0xFF);
for(var
j =
0; j
< 4; j++) {
if(i
* 8
+ j
* 6
> binarray.length
* 32) str
+= b64pad;
else str
+= tab.charAt((triplet
>> 6
* (3
- j))
& 0x3F);
}
}
return str;
}