Web app(angluar) 微信分享 应用

概述 | 微信开放文档

步骤一:引入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&timestamp=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 + "&timestamp=" + 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();

  }

}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容