步骤一:引入tS文件
npm install weixin-js-sdk-ts
步骤二:通过config接口注入权限验证配置
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,企业号的唯一标识,此处填写企业号corpid
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
步骤三:通过ready接口处理成功验证
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
1.生成签名时间戳:
createTimestamp(){
return new Date().getTime();
}
2.生成签名的随机串:
createNonceStr(){
return Math.random().toString(36).substr(2, 15);
}
3.签名:
3-1 先拿到 Access token
https请求方式: GET https://api.weixin.qq.com/cgi-bin/tokengrant_type=client_credential&appid=APPID&secret=APPSECRET
3-2 再拿 ticket
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
3-3 jsapi_ticket
如:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
这里说下url: 路由hash模式 url用这个就可以window.location.href.split("#")[0]
3-4 sha1 加密
getsignature(str:string ){ //把jsapi_ticket 传进来
var signature = hexSha1(str);
return signature;
}
sha1 文件如下:
const hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
// const b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
const chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
// let binb2hex;
// function b64_sha1(s: string): string { return binb2b64(coreSha1(str2binb(s), s.length * chrsz)); }
// function str_sha1(s: string): string { return binb2str(coreSha1(str2binb(s), s.length * chrsz)); }
// function hex_hmac_sha1(key: string, data: string): string { return binb2hex(core_hmac_sha1(key, data)); }
// function b64_hmac_sha1(key: string, data: string): string { return binb2b64(core_hmac_sha1(key, data)); }
// function str_hmac_sha1(key: string, data: string): string { return binb2str(core_hmac_sha1(key, data)); }
/*
* Perform a simple self-test to see if the VM is working
*/
// function sha1_vm_test(): boolean {
// return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
// }
/*
* Calculate the SHA-1 of an array of big-endian words, and a bit length
*/
function rol(num: number, cnt: number): number {
return (num << cnt) | (num >>> (32 - cnt));
}
function safeAdd(x: number, y: number): number {
const lsw = (x & 0xFFFF) + (y & 0xFFFF);
const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function sha1Ft(t: number, b: number, c: number, d: number): number {
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 sha1Kt(t: number): number {
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
(t < 60) ? -1894007588 : -899497514;
}
function coreSha1(x: number[], len: number): number[] {
/* append padding */
x[len >> 5] |= 0x80 << (24 - len % 32);
x[((len + 64 >> 9) << 4) + 15] = len;
const w = Array(80);
let a = 1732584193;
let b = -271733879;
let c = -1732584194;
let d = 271733878;
let e = -1009589776;
for (let i = 0; i < x.length; i += 16) {
const olda = a;
const oldb = b;
const oldc = c;
const oldd = d;
const olde = e;
for (let 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);
const t = safeAdd(safeAdd(rol(a, 5), sha1Ft(j, b, c, d)),
safeAdd(safeAdd(e, w[j]), sha1Kt(j)));
e = d;
d = c;
c = rol(b, 30);
b = a;
a = t;
}
a = safeAdd(a, olda);
b = safeAdd(b, oldb);
c = safeAdd(c, oldc);
d = safeAdd(d, oldd);
e = safeAdd(e, olde);
}
return [a, b, c, d, e];
}
/*
* Perform the appropriate tripconst combination function for the current
* iteration
*/
/*
* Calculate the HMAC-SHA1 of a key and some data
*/
// function core_hmac_sha1(key: string, data: string): number[] {
// let bkey = str2binb(key);
// if (bkey.length > 16) bkey = coreSha1(bkey, key.length * chrsz);
// const ipad = Array(16), opad = Array(16);
// for (const i = 0; i < 16; i++) {
// ipad[i] = bkey[i] ^ 0x36363636;
// opad[i] = bkey[i] ^ 0x5C5C5C5C;
// }
// const hash = coreSha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
// return coreSha1(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.
*/
/*
* Bitwise rotate a 32-bit number to the left.
*/
/*
* 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: string): number[] {
const bin: number[] = [];
const mask = (1 << chrsz) - 1;
for (let i = 0; i < str.length * chrsz; i += chrsz)
bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i % 32);
return bin;
}
/*
* Convert an array of big-endian words to a string
*/
// function binb2str(bin: number[]): string {
// const str = "";
// const mask = (1 << chrsz) - 1;
// for (const i = 0; i < bin.length * 32; i += chrsz)
// str += String.fromCharCode((bin[i >> 5] >>> (32 - chrsz - i % 32)) & mask);
// return str;
// }
/*
* Convert an array of big-endian words to a hex string.
*/
function binb2hex(binarray: number[]): string {
const hexTab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
let str = "";
for (let i = 0; i < binarray.length * 4; i++) {
str += hexTab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) +
hexTab.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: number[]): string {
// const tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// const str = "";
// for (const i = 0; i < binarray.length * 4; i += 3) {
// const tripconst = (((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 (const j = 0; j < 4; j++) {
// if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
// else str += tab.charAt((tripconst >> 6 * (3 - j)) & 0x3F);
// }
// }
// return str;
// }
export function hexSha1(s: string): string { return binb2hex(coreSha1(str2binb(s), s.length * chrsz)).toUpperCase(); }
export function hexSha2(s: string): string { return binb2hex(coreSha1(str2binb(s), s.length * chrsz)); }
// 字符串加密成 hex 字符串
完整代码:
import { Observable, observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { Injectable, OnInit } from '@angular/core';
import wx from 'weixin-js-sdk-ts';
import { hexSha1 } from './utils/sha1';
@Injectable({
providedIn: 'root'
})
export class WxconfigservicesService {
constructor(public http: HttpClient) { }
access_token: any = {}
jsapi_ticket: any = {};
date: number = this.createTimestamp();
appid: string = "xxx";
secret: string = "xxxx";
noncestr: string = this.createNonceStr();
getjsapi_ticket(value: any) {
return new Observable((observable) => {
this.http.get("/cgi-bin/ticket/getticket", {
params: {
access_token: value.access_token,
type: "jsapi"
}
}).subscribe((res) => {
this.jsapi_ticket = res;
observable.next(res)
})
})
}
actionwx(url: string, object: any) {
let that = this;
that.getaccess_token().subscribe((res) => {
that.getjsapi_ticket(res).subscribe((reponse) => {
var value = "jsapi_ticket=" + this.jsapi_ticket.ticket + "&noncestr=" + this.noncestr + "×tamp=" + this.date + "&url=" + encodeURI(url)
var signature = this.getsignature(value);
wx.config({
debug: true,
appId: this.appid,
timestamp: this.date,
nonceStr: this.noncestr,
signature: signature,
jsApiList: ["updateAppMessageShareData", "updateTimelineShareData", "onMenuShareAppMessage", "onMenuShareTimeline"],
openTagList: []
});
wx.checkJsApi({
jsApiList: ["updateAppMessageShareData", "updateTimelineShareData", "onMenuShareAppMessage", "onMenuShareTimeline"],
success: function (res) {
},
fail: function () {
},
complete: function () {
}
})
wx.ready(function () {
let shareData = {
title: object.title,
desc: object.desc,
link: object.link, //这里的link 我用 的是 window.location.href
imgUrl: object.imgUrl,
success: function () {
},
cancel: function () { },
}
wx.onMenuShareAppMessage(shareData)
wx.onMenuShareTimeline(shareData)
wx.updateAppMessageShareData(shareData)
wx.updateTimelineShareData(shareData)
})
wx.error(function (err) {
// console.log("err")
})
})
});
}
getsignature(str: string) {
var signature = hexSha1(str);
return signature;
}
getaccess_token() {
return new Observable((observable) => {
this.http.get("/cgi-bin/token", {
params: {
grant_type: "client_credential",
appid: this.appid,
secret: this.secret,
}
}).subscribe((res) => {
this.access_token = res;
observable.next(res)
})
})
}
createNonceStr() {
return Math.random().toString(36).substr(2, 15);
}
createTimestamp() {
return new Date().getTime();
}
}