orcrist-wechat
Version:
for Orcrist Wechat sdk
156 lines (143 loc) • 3.89 kB
text/typescript
import OST_REQ from "orcrist-request";
import { traceLog } from "./utils/traceLog";
import API from "./api";
import {
WECHAT_REGISTER_APIS,
WECHAT_MENU_ITEMS,
REGISTER_SERVICE_URL,
} from "./constants";
const w: any = window;
const d: any = document;
const r: any = OST_REQ;
if (w.BUZZ) {
w.BUZZ.scene = `${w.BUZZ.scene}_WECHAT`;
}
/**
* 全局统一注册Wechat方法
* @param options { productCode(skuCode), shareOpt, hideMenu }
*/
export const register = (options = {}) => {
// current URL
const CURR_URL = encodeURIComponent(location.href.split("#")[0]);
r.request(REGISTER_SERVICE_URL, {
method: "POST",
body: {
url: CURR_URL,
},
})
.then(({ code, data }) => {
switch (code) {
case "0":
const {
appid: appId = "",
nonceStr = "",
sign: signature = "",
timestamp,
} = data;
configWechatJSSDK(appId, timestamp, nonceStr, signature, options);
break;
default:
traceLog({
log: encodeURIComponent(
`[ SignWechatSDKService ] Error Code: ${code}`
),
});
}
})
.catch((err) => {
traceLog({
log: encodeURIComponent(
`[ SignWechatSDKService ] Error Code: 500. ${err.message}`
),
});
throw new Error(err.message);
});
};
interface JSSDK_OPTION {
hideMenu?: boolean;
shareOpt?: any;
}
const configWechatJSSDK = (
appId,
timestamp,
nonceStr,
signature,
{ hideMenu = false, shareOpt }: JSSDK_OPTION // 注册wechat
) => {
const { config = () => {}, ready, error } = w.wx;
// * 执行注册SDK
config({
// debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId, // 必填,公众号的唯一标识
timestamp, // 必填,生成签名的时间戳
nonceStr, // 必填,生成签名的随机串
signature, // 必填,签名
jsApiList: WECHAT_REGISTER_APIS, // 必填,需要使用的JS接口列表
});
ready(function () {
// wechat local cache
localStorage.setItem(
"WX_CONFIG",
JSON.stringify({
appId,
nonceStr,
signature,
timestamp,
})
);
if (hideMenu) {
// 隐藏所有功能按钮
setOptionMenu("hideOptionMenu");
w.wx.hideMenuItems({
// !所有微信菜单项:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#64
menuList: WECHAT_MENU_ITEMS,
});
w.wx.hideAllNonBaseMenuItem();
} else {
setOptionMenu("showMenuItems");
// 设置自定义分享
if (shareOpt) {
w.wx.updateAppMessageShareData(shareOpt);
w.wx.updateTimelineShareData(shareOpt);
w.wx.onMenuShareTimeline(shareOpt); // 朋友圈
w.wx.onMenuShareAppMessage(shareOpt); // 朋友
}
w.wx.showAllNonBaseMenuItem();
}
});
error(function (res) {
// 签名会valid
traceLog({
log: encodeURIComponent(JSON.stringify(res || {})),
});
});
};
/**
* 设置是否关闭微信菜单
* @param status
*/
const setOptionMenu = (status) => {
const onBridgeReady = () => {
w.WeixinJSBridge.call(status);
};
if (status) {
if (typeof w.WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener(
"WeixinJSBridgeReady",
onBridgeReady.bind(this),
false
);
} else if (d.attachEvent) {
d.attachEvent("WeixinJSBridgeReady", onBridgeReady.bind(this));
d.attachEvent("onWeixinJSBridgeReady", onBridgeReady.bind(this));
}
} else {
onBridgeReady();
}
}
};
export default {
register,
...API,
};