npm install weixin-js-sdk
import wx from 'weixin-js-sdk'
(网上查找的关于sha1的npm包种类繁多。导致编码生成的签名不能使用。此处直接在入口文件 index.html中引入)
以上准备工作已经就绪,如何使用呢? 建议先查看官网文档
由官网可见需要以下几个参数:
时间戳timestamp、签名 signature、随机字符串nonceStr、appid、jsApiList,其中appId是公众号所属的,jsApiList 内部去存放需要引入的api分享接口。时间戳和随机字符串直接可以前端本地生成:
jsapi_ticket参数需要后台配合返回,
url直接通过location.href.split('#')[0] 截图得到当前网页的域名,
nonceStr:
createCode () {
this.nonceStr = ''
var codeLength = 16 // 验证码的长度
// 所有候选组成验证码的字符,当然也可以用中文的
var selectChar = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'l', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'Y', 'Z']
for (var i = 0; i < codeLength; i++) {
var charIndex = Math.floor(Math.random() * 60)
this.nonceStr += selectChar[charIndex]
}
},
签名 signature 通过以下方法生成 (其中的hex_sha1()方法在index.html中引入的sha1js):
var timestamp1 = Date.parse(new Date())
this.signature = 'jsapi_ticket=' + ticket + '&noncestr=' + this.nonceStr + '×tamp=' + timestamp1 + '&url=' + this.pageurl
this.signature = hex_sha1(this.signature)
好了,到此为止,微信分享所需要的配置以及参数已经好了。下面就可以直接进行调用了。
1、直接屏幕右上角三个点进行分享。
2、网页自定义分享按钮,拿到需要分享的数据,通过引导层引导用户通过右上角分享(不支持自定义分享按钮直接分享)
通过以上步骤,实现了微信分享,在开发工具中测试正常。但是在手机中测试发现,设置的分享标题描述和图片失效了。经过半天的捣鼓发现,应该是因为分享的商品图不符合微信分享图标的规格导致分享图片失效,而我开发时还没有订好分享的链接,因此分享的链接当时设置的也是图片的路径,所以导致了分享的失效。
于是更换了小例子中的最上面的代码对图片路径和分享链接重新定义(见上图中imgUrlWX和linkWX),解决了问题。
附件:sha1.js
/*
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
* in FIPS PUB 180-1
* Version 2.1-BETA Copyright Paul Johnston 2000 - 2002.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for details.
*/
/*
* Configurable variables. You may need to tweak these to be compatible with
* the server-side, but the defaults work in most cases.
*/
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 */
/*
* These are the functions you'll usually want to call
* They take string arguments and return either hex or base-64 encoded strings
*/
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';
}
/*
* Calculate the SHA-1 of an array of big-endian words, and a bit length
*/
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)
}
/*
* Perform the appropriate triplet combination function for the current
* iteration
*/
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
}
/*
* Determine the appropriate additive constant for the current iteration
*/
function sha1_kt (t) {
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514
}
/*
* Calculate the HMAC-SHA1 of a key and some data
*/
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)
}
/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
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))
}
/*
* Convert an 8-bit or 16-bit string to an array of big-endian words
* In 8-bit function, characters >255 have their hi-byte silently ignored.
*/
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
}
/*
* Convert an array of big-endian words to a string
*/
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
}
/*
* Convert an array of big-endian words to a hex string.
*/
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
}
/*
* Convert an array of big-endian words to a base-64 string
*/
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
}