import {JsApiSignature} from './jsapi-signature'; import {M2Entrance} from '../../core/services/m2-entrance'; import {ApiAnon} from '../../core/services/http/apiAnon'; import {Injectable, OnInit} from '@angular/core'; import { LazyService } from '../../common/tools/lazy.service'; @Injectable({ providedIn: 'root' }) export class M2Wechat { constructor(private m2plat: M2Entrance, private lazyLoad: LazyService, private anon: ApiAnon) { } private async _init() { if (!window["wx"]) { console.log("判断jsapi 微信没有加载,开始懒加载……"); const result = await this.lazyLoad.load(["assets/jweixin-1.6.0.js"]); console.log(result); if (result[0].status === "error") { throw new Error("微信jsapi加载失败"); } } else { console.log("微信jsapi已经加载!"); } } async ready() { try { return await this.wxConfig(); } catch (err) { throw err; } } private async wxConfig() { await this.m2plat.ready(); await this._init(); // 暂时测试微信jsapi签名,是否与登陆有关 const query = { "url": location.href }; // @ts-ignore:下面的属性是微信js给动态注入的,微信js是懒加载的,关闭静态检查提示 if (window.__wxjs_is_wkwebview) { // 如果是wkwebview则需要按照ios的怪癖来修正 query.url = this.m2plat.getLandingPage(); } const resp = await this.anon.get("wx/jsapisignature", query).toPromise(); const jsSigunature: JsApiSignature = resp["result"]; await wx.config({ debug: true, appId: jsSigunature.appId, // 必填,公众号的唯一标识 timestamp: jsSigunature.timestamp, // 必填,生成签名的时间戳 nonceStr: jsSigunature.nonceStr, // 必填,生成签名的随机串 signature: jsSigunature.signature, // 必填,签名 jsApiList: ["openLocation", "getLocation" , "updateAppMessageShareData", "onMenuShareAppMessage", "hideOptionMenu", "showOptionMenu", "hideMenuItems", "showMenuItems"] // 必填,需要使用的JS接口列表 }); return await new Promise((resolve, reject) => { wx.ready( () => { // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 console.log("wechat config 成功!"); // 在配置完成之前,要隐藏分享按钮 wx.hideMenuItems({ menuList: ['menuItem:share:timeline', 'menuItem:share:qq', 'menuItem:favorite', 'menuItem:share:QZone', 'menuItem:share:weiboApp'] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3 }); resolve(true); }); wx.error(function(res) { // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 console.log("wx.config出错了,错误信息是:" + JSON.stringify(res)); reject(false); }); }); } }