提交 ff9a1c46 作者: 王进

更新用户授权接口

1. 增加getUserProfile兼容
2. 优化getUserInfo代码
上级 ade6972a
...@@ -7,744 +7,749 @@ ...@@ -7,744 +7,749 @@
* *
*/ */
class WechatSDK { class WechatSDK {
private sdkVersion: string = '3.0.3' private sdkVersion: string = '3.0.3'
public LaunchOptions: Object; // 启动参数对象 public LaunchOptions: Object; // 启动参数对象
public SystemInfo: Object; // 设备信息 public SystemInfo: Object; // 设备信息
public LoginData: Object; // 登录信息 public LoginData: Object; // 登录信息
private onlineTime: number = 0; // 在线时长(单位:分钟) private onlineTime: number = 0; // 在线时长(单位:分钟)
private actId: string = '' // 动态消息活动id private actId: string = '' // 动态消息活动id
private clickCounter = 0 // 当前用户点击次数 private clickCounter = 0 // 当前用户点击次数
private GameRecorder: any = null // 录屏对象 private GameRecorder: any = null // 录屏对象
private recorderBtn: any = null // 对局回放分享按钮对象 private recorderBtn: any = null // 对局回放分享按钮对象
constructor() { constructor() {
console.log('当前加载SDK版本号为:', this.sdkVersion); console.log('当前加载SDK版本号为:', this.sdkVersion);
this.sdkInit(); this.sdkInit();
this.timerInit(); this.timerInit();
} }
private timerInit() { // 用户在线时间 private timerInit() { // 用户在线时间
let loginTime = new Date().getTime(); // 登录时间 let loginTime = new Date().getTime(); // 登录时间
let offTime = (wx as any).getStorageSync('offlineTime'); // 离线前记录的时间点 let offTime = (wx as any).getStorageSync('offlineTime'); // 离线前记录的时间点
let offlineTime = offTime ? ((loginTime - offTime) / (1000 * 60)).toFixed(2) : 0; // 离线时长(分钟) let offlineTime = offTime ? ((loginTime - offTime) / (1000 * 60)).toFixed(2) : 0; // 离线时长(分钟)
if (offlineTime > 299) this.onlineTime = 0; if (offlineTime > 299) this.onlineTime = 0;
else this.onlineTime = (wx as any).getStorageSync('onlineMinute') || 0; else this.onlineTime = (wx as any).getStorageSync('onlineMinute') || 0;
setInterval(() => { // 每分钟记录一次 setInterval(() => { // 每分钟记录一次
this.onlineTime++; this.onlineTime++;
let curTime = new Date().getTime(); let curTime = new Date().getTime();
(wx as any).setStorageSync("onlineMinute", this.onlineTime); (wx as any).setStorageSync("onlineMinute", this.onlineTime);
(wx as any).setStorageSync("offlineTime", curTime); (wx as any).setStorageSync("offlineTime", curTime);
}, 60000); }, 60000);
} }
private sdkInit = async () => { private sdkInit = async () => {
this.LaunchOptions = await this.getOptionsInfo(); this.LaunchOptions = await this.getOptionsInfo();
this.actId = this.LaunchOptions['actId'] || ''; this.actId = this.LaunchOptions['actId'] || '';
this.SystemInfo = await this.getSystemInfo(); this.SystemInfo = await this.getSystemInfo();
this.SystemInfo['networkType'] = await this.getNetworkType(); this.SystemInfo['networkType'] = await this.getNetworkType();
this.SDKCOMMDATA['os'] = this.SystemInfo['system'].split(' ')[0].toLowerCase(); this.SDKCOMMDATA['os'] = this.SystemInfo['system'].split(' ')[0].toLowerCase();
} }
public Login = async (retry = 0) => { public Login = async (retry = 0) => {
if (retry > 2) { if (retry > 2) {
this.showMsg('登录异常,请联系客服.'); this.showMsg('登录异常,请联系客服.');
return { error: "登录超时.." } return { error: "登录超时.." }
} }
const res = await this.getWechatCode(); // 获取微信登录code const res = await this.getWechatCode(); // 获取微信登录code
if (res.code) { if (res.code) {
// 请求openid // 请求openid
const { data } = await this.sdkRequest(Links.init, { const { data } = await this.sdkRequest(Links.init, {
...this.SDKCOMMDATA, ...this.SDKCOMMDATA,
appid: SDKConfig.appid, appid: SDKConfig.appid,
code: res.code code: res.code
}); });
this.LoginData = { ...data } this.LoginData = { ...data }
this.SDKCOMMDATA['uuid'] = data.open_id; this.SDKCOMMDATA['uuid'] = data.open_id;
// SDK后台调试模式开关 // SDK后台调试模式开关
if (typeof (data.debug_mode) != "undefined" && data.debug_mode == 1) { if (typeof (data.debug_mode) != "undefined" && data.debug_mode == 1) {
(wx as any).setEnableDebug({ (wx as any).setEnableDebug({
enableDebug: true enableDebug: true
}) })
} }
this.actId != "" && this.updateShareMsgInfo({}); this.actId != "" && this.updateShareMsgInfo({});
return this.sdkActive(); return this.sdkActive();
} }
retry += 1; retry += 1;
this.Login(retry); this.Login(retry);
} }
// SDK激活 // SDK激活
private sdkActive = async () => { private sdkActive = async () => {
const { data } = await this.sdkRequest(Links.active, { ...this.SDKCOMMDATA, ...this.LoginData }); const { data } = await this.sdkRequest(Links.active, { ...this.SDKCOMMDATA, ...this.LoginData });
this.LoginData['pay_channel'] = data.default_pay_channel; this.LoginData['pay_channel'] = data.default_pay_channel;
this.ActiReport(); // 上报激活 this.ActiReport(); // 上报激活
return this.sdkLogin(); return this.sdkLogin();
} }
private async sdkLogin() { private async sdkLogin() {
delete this.LoginData['token']; // 强制清空登录toekn delete this.LoginData['token']; // 强制清空登录toekn
const { data, msg } = await this.sdkRequest(Links.login, { ...this.SDKCOMMDATA, ...this.LoginData }); const { data, msg } = await this.sdkRequest(Links.login, { ...this.SDKCOMMDATA, ...this.LoginData });
console.log("--SDK登录返回::", data); console.log("--SDK登录返回::", data);
if (Object.keys(data).length == 0) { if (Object.keys(data).length == 0) {
this.showMsg(msg); this.showMsg(msg);
return { error: msg } return { error: msg }
} }
this.LoginData = { ...this.LoginData, ...data } this.LoginData = { ...this.LoginData, ...data }
const filters = (({create_time, ip, nickname, open_id, uid, enter_game, origin_uid, origin_open_id}) => ({ create_time, ip, nickname, open_id, uid, enter_game, origin_uid, origin_open_id }))(data); const filters = (({create_time, ip, nickname, open_id, uid, enter_game, origin_uid, origin_open_id}) => ({ create_time, ip, nickname, open_id, uid, enter_game, origin_uid, origin_open_id }))(data);
return { return {
...filters, ...filters,
os: this.SDKCOMMDATA['os'], // 返回系统类型IOS或者android os: this.SDKCOMMDATA['os'], // 返回系统类型IOS或者android
session_key: this.LoginData['session_key'], // 返回session_key session_key: this.LoginData['session_key'], // 返回session_key
scene: this.LaunchOptions['scene'], // 用户来源场景值 scene: this.LaunchOptions['scene'], // 用户来源场景值
from_appid: this.LaunchOptions['appId'] || this.LaunchOptions['appid'], from_appid: this.LaunchOptions['appId'] || this.LaunchOptions['appid'],
launchOptions: this.LaunchOptions launchOptions: this.LaunchOptions
} }
} }
public payOrder = async (Params, showMessage = true) => { public payOrder = async (Params, showMessage = true) => {
this.showLoading(); this.showLoading();
// 支付前先获取用户订单状态,如果没有未完成订单则继续支付 // 支付前先获取用户订单状态,如果没有未完成订单则继续支付
const { code, data, msg } = await this.fetchUri(Links.order, this.md5_sign({ ...this.SDKCOMMDATA, ...Params, token: this.LoginData['token'], pay_channel: this.LoginData['pay_channel'] }), 'GET'); const { code, data, msg } = await this.fetchUri(Links.order, this.md5_sign({ ...this.SDKCOMMDATA, ...Params, token: this.LoginData['token'], pay_channel: this.LoginData['pay_channel'] }), 'GET');
this.hideLoading(); this.hideLoading();
if (code == 0 && data.open_customer_service) { if (code == 0 && data.open_customer_service) {
const params = { const params = {
title: '充值教程', title: '充值教程',
content: '即将跳转官方【客服会话】进行充值, 向客服回复【充值】获取充值链接', content: '即将跳转官方【客服会话】进行充值, 向客服回复【充值】获取充值链接',
showCancel: false, showCancel: false,
success: () => { success: () => {
this.Customer({ this.Customer({
sessionFrom: 'order_id=' + (data.order_num || '') + '&payload=' + (data.payload || ''), sessionFrom: 'order_id=' + (data.order_num || '') + '&payload=' + (data.payload || ''),
showMessageCard: true, showMessageCard: true,
sendMessageTitle: '回复【充值】获取充值链接', sendMessageTitle: '回复【充值】获取充值链接',
sendMessageImg: 'https://h5sdk.pthc8.com/resource/images/payTips.jpg', sendMessageImg: 'https://h5sdk.pthc8.com/resource/images/payTips.jpg',
}); });
} }
} }
this.showModal(params); this.showModal(params);
return { order_code: 2, msg: '' }; return { order_code: 2, msg: '' };
} }
if (code == 0 && data.order_type == 1) { if (code == 0 && data.order_type == 1) {
this.MidasPaymentParams['buyQuantity'] = <number>(Params.money / 100) * <number>data.weixin_proportion // 充值金额 this.MidasPaymentParams['buyQuantity'] = <number>(Params.money / 100) * <number>data.weixin_proportion // 充值金额
console.log("--米大师支付参数:", this.MidasPaymentParams); console.log("--米大师支付参数:", this.MidasPaymentParams);
// 调微信米大师支付接口 // 调微信米大师支付接口
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
(wx as any).requestMidasPayment({ (wx as any).requestMidasPayment({
...this.MidasPaymentParams, ...this.MidasPaymentParams,
success: async (response) => { success: async (response) => {
console.log("--SDK支付成功:", response); console.log("--SDK支付成功:", response);
let coinsResult = await this.getCoins({ ...this.SDKCOMMDATA, token: this.LoginData['token'], order_num: data.order_num }); let coinsResult = await this.getCoins({ ...this.SDKCOMMDATA, token: this.LoginData['token'], order_num: data.order_num });
if (coinsResult.code == 0 || coinsResult.code == 3012) { if (coinsResult.code == 0 || coinsResult.code == 3012) {
resolve({ order_code: 200, msg: '' }); resolve({ order_code: 200, msg: '' });
} }
else { else {
resolve({ order_code: 0, msg: (coinsResult.msg || '') }); resolve({ order_code: 0, msg: (coinsResult.msg || '') });
} }
}, },
fail: (err) => { fail: (err) => {
console.log("--米大师支付失败:", err); console.log("--米大师支付失败:", err);
let msg = this.MidasErrorCode[JSON.stringify(err.errCode)] || '支付异常'; let msg = this.MidasErrorCode[JSON.stringify(err.errCode)] || '支付异常';
if (showMessage) { if (showMessage) {
const params = { const params = {
title: '支付提示', title: '支付提示',
content: msg, content: msg,
showCancel: false showCancel: false
} }
this.showModal(params); this.showModal(params);
} }
resolve({ order_code: err.errCode, msg: msg }); resolve({ order_code: err.errCode, msg: msg });
this.reportPaymentError({ order_code: err.errCode, msg: msg, order_num: data.order_num }); this.reportPaymentError({ order_code: err.errCode, msg: msg, order_num: data.order_num });
} }
}); });
}); });
} }
} }
private getCoins = async (orderParams) => { // 通知服务端扣费 private getCoins = async (orderParams) => { // 通知服务端扣费
console.log('--通知扣费:', orderParams); console.log('--通知扣费:', orderParams);
return await this.sdkRequest(Links.pay, orderParams) return await this.sdkRequest(Links.pay, orderParams)
} }
public createActiveShare = async (shareInfo) => { //动态消息 public createActiveShare = async (shareInfo) => { //动态消息
let { code, data, msg } = await this.sdkRequest(Links.getActShareId, { let { code, data, msg } = await this.sdkRequest(Links.getActShareId, {
...this.SDKCOMMDATA, ...this.SDKCOMMDATA,
room_limit: shareInfo.room_limit, room_limit: shareInfo.room_limit,
target_state: 0 target_state: 0
}, 'POST'); }, 'POST');
if (code == 0) { if (code == 0) {
const actId = data.activity_id; const actId = data.activity_id;
const totalMembers = shareInfo.room_limit || '0'; const totalMembers = shareInfo.room_limit || '0';
(wx as any).updateShareMenu({ (wx as any).updateShareMenu({
withShareTicket: true, withShareTicket: true,
isUpdatableMessage: true, isUpdatableMessage: true,
activityId: this.actId, // 活动 ID activityId: this.actId, // 活动 ID
templateInfo: { templateInfo: {
parameterList: [{ parameterList: [{
name: 'member_count', name: 'member_count',
value: '1' // 设置房间初始玩家1 value: '1' // 设置房间初始玩家1
}, { }, {
name: 'room_limit', name: 'room_limit',
value: totalMembers value: totalMembers
}] }]
}, },
success: (res) => { success: (res) => {
let ShareParams = { let ShareParams = {
title: shareInfo.title ? shareInfo.title : SDKConfig.shareTitle, title: shareInfo.title ? shareInfo.title : SDKConfig.shareTitle,
imageUrl: shareInfo.image ? shareInfo.image : SDKConfig.shareImageUrl, imageUrl: shareInfo.image ? shareInfo.image : SDKConfig.shareImageUrl,
imageId: shareInfo.imageId ? shareInfo.imageId : SDKConfig.shareImageId, imageId: shareInfo.imageId ? shareInfo.imageId : SDKConfig.shareImageId,
query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&actId=' + actId query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&actId=' + actId
} }
this.share(ShareParams); this.share(ShareParams);
}, },
}); });
} else { } else {
console.log("--SDK错误::createActiveSahre", msg); console.log("--SDK错误::createActiveSahre", msg);
} }
} }
public updateShareMsgInfo = (updateInfo) => { // 更新动态消息接口 public updateShareMsgInfo = (updateInfo) => { // 更新动态消息接口
if (!updateInfo.activity_id || updateInfo.activity_id == '') { if (!updateInfo.activity_id || updateInfo.activity_id == '') {
updateInfo = { updateInfo = {
...updateInfo, ...updateInfo,
activity_id: this.actId, activity_id: this.actId,
version_type: SDKConfig.navPayEnv version_type: SDKConfig.navPayEnv
} }
} }
this.sdkRequest(Links.setActShareInfo, { ...this.SDKCOMMDATA, ...updateInfo }, 'POST') this.sdkRequest(Links.setActShareInfo, { ...this.SDKCOMMDATA, ...updateInfo }, 'POST')
} }
public getActiveShareInfo = async () => { // 查询动态消息接口 public getActiveShareInfo = async () => { // 查询动态消息接口
let { code, data } = await this.sdkRequest(Links.getActShareInfo, { let { code, data } = await this.sdkRequest(Links.getActShareInfo, {
product_code: SDKConfig.productCode, product_code: SDKConfig.productCode,
activity_id: this.actId activity_id: this.actId
}, 'POST') }, 'POST')
return !code ? data : 0; return !code ? data : 0;
} }
public async phoneCode(phoneInfo, callback?) { // 发送验证码接口 public async phoneCode(phoneInfo, callback?) { // 发送验证码接口
const { code } = await this.sdkRequest(Links.sendCode, { ...this.SDKCOMMDATA, ...phoneInfo, type: 'SDK.BIND_MOBILE' }); const { code } = await this.sdkRequest(Links.sendCode, { ...this.SDKCOMMDATA, ...phoneInfo, type: 'SDK.BIND_MOBILE' });
callback && callback(!code); callback && callback(!code);
} }
public async userPhone(phoneInfo, callback) { // 绑定手机 public async userPhone(phoneInfo, callback) { // 绑定手机
const { code } = await this.sdkRequest(Links.saveNum, { ...this.SDKCOMMDATA, open_id: this.LoginData['open_id'], ...phoneInfo, source: 'WEIXIN' }) const { code } = await this.sdkRequest(Links.saveNum, { ...this.SDKCOMMDATA, open_id: this.LoginData['open_id'], ...phoneInfo, source: 'WEIXIN' })
callback(code); callback(code);
} }
public async checkUserPhoneBind() { // 查询用户绑定状态 public async checkUserPhoneBind() { // 查询用户绑定状态
const { code } = await this.sdkRequest(Links.bindPhone, { ...this.SDKCOMMDATA, uid: this.LoginData['uid'] }); const { code } = await this.sdkRequest(Links.bindPhone, { ...this.SDKCOMMDATA, uid: this.LoginData['uid'] });
return !code; return !code;
} }
public async getUserPaymentType(roleInfo) { // 是否支持切支付 public async getUserPaymentType(roleInfo) { // 是否支持切支付
let { code } = await this.sdkRequest(Links.payType, { ...this.SDKCOMMDATA, ...roleInfo }); let { code } = await this.sdkRequest(Links.payType, { ...this.SDKCOMMDATA, ...roleInfo });
return !code; return !code;
} }
// 创建录屏对象 // 创建录屏对象
public createGameRecorder = (startEventCallBack?, stopEventCallBack?, cpCallback?) => { public createGameRecorder = (startEventCallBack?, stopEventCallBack?, cpCallback?) => {
try { try {
this.GameRecorder = (wx as any).getGameRecorder(); this.GameRecorder = (wx as any).getGameRecorder();
if (!this.GameRecorder.isFrameSupported()) { if (!this.GameRecorder.isFrameSupported()) {
if (cpCallback) cpCallback({ status: 0, msg: '设备不支持录屏功能.' }); if (cpCallback) cpCallback({ status: 0, msg: '设备不支持录屏功能.' });
return; return;
} }
this.GameRecorder.on('start', () => { this.GameRecorder.on('start', () => {
if (startEventCallBack) startEventCallBack(); if (startEventCallBack) startEventCallBack();
}); });
this.GameRecorder.on('stop', (res) => { this.GameRecorder.on('stop', (res) => {
console.log('--对局回放时长:', res.duration); console.log('--对局回放时长:', res.duration);
if (stopEventCallBack) stopEventCallBack(res); if (stopEventCallBack) stopEventCallBack(res);
}) })
if (cpCallback) cpCallback({ status: 1, msg: null }) if (cpCallback) cpCallback({ status: 1, msg: null })
} catch (err) { } catch (err) {
console.log("--录屏异常:", err); console.log("--录屏异常:", err);
if (cpCallback) cpCallback({ status: 0, msg: err }) if (cpCallback) cpCallback({ status: 0, msg: err })
} }
} }
public startGameRecorder(recorderInfo: RecorderInfo) { public startGameRecorder(recorderInfo: RecorderInfo) {
try { try {
this.GameRecorder.start({ this.GameRecorder.start({
duration: recorderInfo.duration duration: recorderInfo.duration
}); });
} catch (err) { } catch (err) {
console.log("$$SDK录屏异常::gameRecorder", err); console.log("$$SDK录屏异常::gameRecorder", err);
} }
} }
public stopGameRecorder(shareInfo) { public stopGameRecorder(shareInfo) {
try { try {
this.GameRecorder.stop(); this.GameRecorder.stop();
if (this.recorderBtn) this.recorderBtn.show(); if (this.recorderBtn) this.recorderBtn.show();
else this.createRecorderShareButton(shareInfo); else this.createRecorderShareButton(shareInfo);
} catch (err) { } catch (err) {
console.log("$$SDK录屏异常::gameRecorder", err); console.log("$$SDK录屏异常::gameRecorder", err);
} }
} }
private createRecorderShareButton(shareInfo) { private createRecorderShareButton(shareInfo) {
let recorderShareInfo = { let recorderShareInfo = {
style: { style: {
left: shareInfo.left, left: shareInfo.left,
top: shareInfo.top, top: shareInfo.top,
height: shareInfo.height, height: shareInfo.height,
iconMarginRight: shareInfo.iconMarginRight, iconMarginRight: shareInfo.iconMarginRight,
fontSize: shareInfo.fontSize, fontSize: shareInfo.fontSize,
color: shareInfo.color, color: shareInfo.color,
paddingLeft: shareInfo.paddingLeft, paddingLeft: shareInfo.paddingLeft,
paddingRight: shareInfo.paddingRight paddingRight: shareInfo.paddingRight
}, },
icon: shareInfo.icon || '', icon: shareInfo.icon || '',
image: shareInfo.image || '', image: shareInfo.image || '',
text: shareInfo.text || '', text: shareInfo.text || '',
share: { share: {
query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&' + (shareInfo.query ? shareInfo.query : ''), query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&' + (shareInfo.query ? shareInfo.query : ''),
bgm: shareInfo.bgm, bgm: shareInfo.bgm,
timeRange: shareInfo.timeRange timeRange: shareInfo.timeRange
} }
}; };
this.recorderBtn = (wx as any).createGameRecorderShareButton(recorderShareInfo); this.recorderBtn = (wx as any).createGameRecorderShareButton(recorderShareInfo);
// 当分享出现异常时才会触发点击回调 // 当分享出现异常时才会触发点击回调
this.recorderBtn.onTap(res => { this.recorderBtn.onTap(res => {
console.log('--录屏异常:', res); console.log('--录屏异常:', res);
}); });
} }
public hideGameRecorderShareButton() { public hideGameRecorderShareButton() {
if (this.recorderBtn) this.recorderBtn.hide(); if (this.recorderBtn) this.recorderBtn.hide();
} }
public async checkUserAdvised() { // 防沉迷验证 public async checkUserAdvised() { // 防沉迷验证
let time = this.onlineTime * 60; // 转成成秒 let time = this.onlineTime * 60; // 转成成秒
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
(wx as any).checkIsUserAdvisedToRest({ (wx as any).checkIsUserAdvisedToRest({
todayPlayedTime: time, todayPlayedTime: time,
success: function (res) { success: function (res) {
resolve(res.result); // 是否建议用户休息 resolve(res.result); // 是否建议用户休息
}, },
fail: function (res) { fail: function (res) {
reject(res); reject(res);
}, },
}) })
}); });
} }
// 获取用户信息 // 获取用户信息
public getUserInfo = async () => { public getUserInfo = (): Promise<any> => {
let status = await this._getSetting(); return new Promise(async (resolve, reject) => {
if (status == 1) { if ((wx as any).getUserProfile) {
// 用户已授权,可以直接调用相关 API const userInfo = await this._getUserProfile();
let userInfo = await this._getUserInfo(); resolve(userInfo);
// 上报用户授权 return;
this.ReportData({ }
userInfo: { ...userInfo, nickName: encodeURI(userInfo.nickName) }, const status = await this._getSetting();
action: 'authorize', const w = (wx as any).getSystemInfoSync().windowWidth;
}) const h = (wx as any).getSystemInfoSync().windowHeight;
return userInfo; if (status == 1) {
} const userInfo = await this._getUserInfo();
else if (status == 0) { if (userInfo.nickname) {
// 用户已拒绝授权,再调用相关 API 或者 wx.authorize 会失败,需要引导用户到设置页面打开授权开关 // 上报用户授权
const w = (wx as any).getSystemInfoSync().windowWidth; this.ReportData({
const h = (wx as any).getSystemInfoSync().windowHeight; userInfo: { ...userInfo, nickName: encodeURI(userInfo.nickName) },
let OpenSettingButton = (wx as any).createOpenSettingButton({ action: 'authorize',
type: "text", })
text: "", }
style: { resolve(userInfo);
left: 0, } else if (status == 0) {
top: 0, // 用户已拒绝授权,再调用相关 API 或者 wx.authorize 会失败,需要引导用户到设置页面打开授权开关
width: w, let OpenSettingButton = (wx as any).createOpenSettingButton({
height: h type: "text",
} text: "",
}); style: {
OpenSettingButton.onTap(async (res) => { left: 0,
let t_status = await this._getSetting(); top: 0,
console.log("--SDK点击设置按钮返回t_status=", t_status); width: w,
if (t_status == 1) { height: h
OpenSettingButton.offTap(this); }
OpenSettingButton.destroy(); });
OpenSettingButton = null; OpenSettingButton.onTap(async (res) => {
let userInfo = await this._getUserInfo(); let t_status = await this._getSetting();
// 上报用户授权 OpenSettingButton.offTap(this);
this.ReportData({ OpenSettingButton.destroy();
...userInfo, OpenSettingButton = null;
action: 'authorize', if (t_status == 1) {
nickName: encodeURI(userInfo.nickName) let userInfo = await this._getUserInfo();
}) // 上报用户授权
return userInfo; this.ReportData({
} ...userInfo,
}); action: 'authorize',
} nickName: encodeURI(userInfo.nickName)
else if (status == -1) { })
let userBtn = this.createUserInfoButton(); resolve(userInfo);
userBtn.onTap((res) => { }
if (res.userInfo) { });
//上报授权 }
userBtn.offTap(this); else if (status == -1) {
userBtn.destroy(); let userBtn = (wx as any).createUserInfoButton({
userBtn = null; type: "text",
let userInfo = res["userInfo"]; text: "",
// 上报用户授权 withCredentials: false,
this.ReportData({ style: {
...userInfo, left: 0,
action: 'authorize', top: 0,
nickName: encodeURI(userInfo.nickName) width: w,
}) height: h,
return userInfo; },
} });
}); userBtn.onTap((res) => {
} userBtn.offTap(this);
} userBtn.destroy();
private createUserInfoButton() { userBtn = null;
// 未询问过用户授权,调用相关 API 或者 wx.authorize 会弹窗询问用户 if (res.userInfo) {
let w = (wx as any).getSystemInfoSync().windowWidth; let userInfo = res["userInfo"];
let h = (wx as any).getSystemInfoSync().windowHeight; // 上报用户授权
let userBtn = (wx as any).createUserInfoButton({ this.ReportData({
type: "text", ...userInfo,
text: "", action: 'authorize',
withCredentials: false, nickName: encodeURI(userInfo.nickName)
style: { })
left: 0, resolve(userInfo);
top: 0, }
width: w, });
height: h }
}, });
}); };
return userBtn private async _getUserProfile(): Promise<any> {
} return new Promise(async function (resolve, reject) {
private async _getUserInfo(): Promise<any> { (wx as any).getUserProfile({
return new Promise(async function (resolve, reject) { desc: '完善用户资料',
(wx as any).getUserInfo({ success: (res) => {
withCredentials: false,//获取用户信息,withCredentials 为 true 时需要先调用 wx.login 接口。需要用户授权 scope.userInfo。 let userInfo = res["userInfo"];
success: (res) => { resolve(userInfo);
let userInfo = res["userInfo"]; },
resolve(userInfo); fail: (res: any) => {
}, console.log("--SDK:玩家头像等数据失败,用户未授权");
fail: (res: any) => { resolve();
console.log("--SDK:玩家头像等数据失败,用户未授权"); }
reject(); });
} });
}); }
}); private async _getUserInfo(): Promise<any> {
} return new Promise(async function (resolve, reject) {
private async _getSetting(): Promise<any> { (wx as any).getUserInfo({
return new Promise(async function (resolve, reject) { withCredentials: false,//获取用户信息,withCredentials 为 true 时需要先调用 wx.login 接口。需要用户授权 scope.userInfo。
(wx as any).getSetting({ success: (res) => {
success: function (res) { let userInfo = res["userInfo"];
let authSetting = res.authSetting; resolve(userInfo);
if (authSetting['scope.userInfo'] === true) { },
resolve(1); fail: (res: any) => {
} console.log("--SDK:玩家头像等数据失败,用户未授权");
else if (authSetting['scope.userInfo'] === false) { resolve();
resolve(0); }
} });
else { });
resolve(-1); }
} private async _getSetting(): Promise<any> {
}, return new Promise(async function (resolve, reject) {
fail: function () { (wx as any).getSetting({
reject(); success: function (res) {
}, let authSetting = res.authSetting;
}); if (authSetting['scope.userInfo'] === true) resolve(1);
}); else if (authSetting['scope.userInfo'] === false) resolve(0);
} else resolve(-1);
public addShareEvent = (shareInfo: shareInfo, callback?) => { },
(wx as any).onShareAppMessage(() => { fail: reject,
if (callback) callback(); });
const ShareParams = { });
title: shareInfo.title ? shareInfo.title : SDKConfig.shareTitle, }
imageUrl: shareInfo.image ? shareInfo.image : SDKConfig.shareImageUrl, public addShareEvent = (shareInfo: shareInfo, callback?) => {
imageUrlId: shareInfo.imageId ? shareInfo.imageId : SDKConfig.shareImageId, (wx as any).onShareAppMessage(() => {
query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&' + (shareInfo.query ? shareInfo.query : ''), if (callback) callback();
withShareTicket: true, const ShareParams = {
}; title: shareInfo.title ? shareInfo.title : SDKConfig.shareTitle,
return ShareParams; imageUrl: shareInfo.image ? shareInfo.image : SDKConfig.shareImageUrl,
}); imageUrlId: shareInfo.imageId ? shareInfo.imageId : SDKConfig.shareImageId,
(wx as any).showShareMenu({ withShareTicket: true }) query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&' + (shareInfo.query ? shareInfo.query : ''),
} withShareTicket: true,
// 暂时恢复,稍后删除 };
public ShareApp(params?: string) { return ShareParams;
const ShareParams = { });
title: SDKConfig.shareTitle, (wx as any).showShareMenu({ withShareTicket: true })
imageUrl: SDKConfig.shareImageUrl, }
imageId: SDKConfig.shareImageId, // 暂时恢复,稍后删除
query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&' + (params ? params : '') public ShareApp(params?: string) {
} const ShareParams = {
return this.share(ShareParams) title: SDKConfig.shareTitle,
} imageUrl: SDKConfig.shareImageUrl,
public ShareGameInfo = (shareInfo?) => { imageId: SDKConfig.shareImageId,
// 参数,记录分享的用户openid query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&' + (params ? params : '')
const ShareParams = { }
title: shareInfo && shareInfo.title ? shareInfo.title : SDKConfig.shareTitle, return this.share(ShareParams)
imageUrl: shareInfo && shareInfo.image ? shareInfo.image : SDKConfig.shareImageUrl, }
imageId: shareInfo && shareInfo.imageId ? shareInfo.imageId : SDKConfig.shareImageId, public ShareGameInfo = (shareInfo?) => {
query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&' + (shareInfo.extraData ? shareInfo.extraData : '') // 参数,记录分享的用户openid
} const ShareParams = {
return this.share(ShareParams) title: shareInfo && shareInfo.title ? shareInfo.title : SDKConfig.shareTitle,
} imageUrl: shareInfo && shareInfo.image ? shareInfo.image : SDKConfig.shareImageUrl,
private share = (DATA): Promise<any> => { imageId: shareInfo && shareInfo.imageId ? shareInfo.imageId : SDKConfig.shareImageId,
return new Promise((resolve, reject) => { query: 'fromOpenId=' + this.LoginData['open_id'] + '&from=share&tag=0&' + (shareInfo.extraData ? shareInfo.extraData : '')
(wx as any).shareAppMessage({ }
...DATA, return this.share(ShareParams)
withShareTicket: true, }
success: res => { private share = (DATA): Promise<any> => {
resolve(1); return new Promise((resolve, reject) => {
}, (wx as any).shareAppMessage({
fail: res => { ...DATA,
resolve(-1); withShareTicket: true,
}, success: res => {
}) resolve(1);
setTimeout(function () { // 两秒后直接当分享成功返回 },
resolve(2) fail: res => {
}, 3000) resolve(-1);
}) },
} })
// 切换游戏 setTimeout(function () { // 两秒后直接当分享成功返回
public navToOtherGame = (params) => { resolve(2)
const obj = { // 跳转参数 }, 3000)
appId: params.appid, // 跳转的小程序appid })
path: '', // 跳转到首页 }
envVersion: SDKConfig.navPayEnv, //跳转方式 // 切换游戏
extraData: { public navToOtherGame = (params) => {
from_openid: this.LoginData['open_id'], const obj = { // 跳转参数
from_product: SDKConfig.productCode, appId: params.appid, // 跳转的小程序appid
from_uid: this.LoginData['uid'] path: '', // 跳转到首页
} envVersion: SDKConfig.navPayEnv, //跳转方式
} extraData: {
this.navigateToMiniProgram(obj); from_openid: this.LoginData['open_id'],
} from_product: SDKConfig.productCode,
private navigateToMiniProgram = (params) => { from_uid: this.LoginData['uid']
if (this.SystemInfo['sdkVersion'] < '2.2') { }
this.showMsg('微信版本不兼容,请升级..') }
} else { this.navigateToMiniProgram(obj);
(wx as any).navigateToMiniProgram(params) }
} private navigateToMiniProgram = (params) => {
} if (this.SystemInfo['sdkVersion'] < '2.2') {
// 客服 this.showMsg('微信版本不兼容,请升级..')
public Customer = (_orderInfo?) => { } else {
try { (wx as any).navigateToMiniProgram(params)
(wx as any).openCustomerServiceConversation(_orderInfo) }
} catch (err) { }
console.log("访问客服异常-->", err) // 客服
this.showMsg('打开客服链接失败.') public Customer = (_orderInfo?) => {
} try {
} (wx as any).openCustomerServiceConversation(_orderInfo)
public ActiReport() { } catch (err) {
this.ReportData({ action: 'activation' }); console.log("访问客服异常-->", err)
this.heartBeatReport(); this.showMsg('打开客服链接失败.')
} // 上报激活 }
public RegisterReport() { this.ReportData({ action: 'register' }) } // 上报注册 }
public LoginReport() { this.ReportData({ action: 'login' }) } // 上报登录 public ActiReport() {
public RoleLevelReport(roleInfo) { this.ReportData({ ...roleInfo, action: 'roleUpgrade' }) } // 上报等级 this.ReportData({ action: 'activation' });
public CustomReport(custInfo) { this.ReportData({ ...custInfo, action: 'customevent' }) } // 自定义上报 this.heartBeatReport();
public userClickEvent() { this.clickCounter++ } } // 上报激活
private heartBeatReport() { public RegisterReport() { this.ReportData({ action: 'register' }) } // 上报注册
setTimeout(() => { public LoginReport() { this.ReportData({ action: 'login' }) } // 上报登录
this.clickReport(); public RoleLevelReport(roleInfo) { this.ReportData({ ...roleInfo, action: 'roleUpgrade' }) } // 上报等级
this.heartBeatReport(); public CustomReport(custInfo) { this.ReportData({ ...custInfo, action: 'customevent' }) } // 自定义上报
}, 60 * 1000); public userClickEvent() { this.clickCounter++ }
} private heartBeatReport() {
private clickReport = async () => { setTimeout(() => {
this.ReportData({ action: 'heartBeat' }) this.clickReport();
this.clickCounter > 0 && this.ReportData({ action: 'userappclick', click_times: this.clickCounter }); this.heartBeatReport();
this.clickCounter = 0; // 上报后归零 }, 60 * 1000);
} }
// 上报支付异常 private clickReport = async () => {
private reportPaymentError(err: Object) { this.ReportData({ action: 'heartBeat' })
let portData = { this.clickCounter > 0 && this.ReportData({ action: 'userappclick', click_times: this.clickCounter });
...this.SDKCOMMDATA, this.clickCounter = 0; // 上报后归零
uid: this.LoginData['uid'], }
event_code: 'PaymentError', event_data: JSON.stringify(err), // 上报支付异常
} private reportPaymentError(err: Object) {
this.sdkRequest(Links.paymentErrorReport, portData, 'POST'); let portData = {
} ...this.SDKCOMMDATA,
// 数据上报接口,外部调用,参数中必须含有action值 uid: this.LoginData['uid'],
public ReportData(portData) { event_code: 'PaymentError', event_data: JSON.stringify(err),
portData['launchOptions'] = this.LaunchOptions; }
portData['userInfo'] = { ...portData['userInfo'], ...{ userId: this.LoginData['uid'] || '', open_id: this.LoginData['open_id'] } }; this.sdkRequest(Links.paymentErrorReport, portData, 'POST');
portData['systemInfo'] = this.SystemInfo; }
portData['product_code'] = SDKConfig.productCode; // 数据上报接口,外部调用,参数中必须含有action值
portData['time'] = Date.parse(new Date().toString()) // 获取当前时间戳秒 public ReportData(portData) {
console.log('--SDK上报:', portData); portData['launchOptions'] = this.LaunchOptions;
this.request(SDKConfig.report, portData, 'POST') portData['userInfo'] = { ...portData['userInfo'], ...{ userId: this.LoginData['uid'] || '', open_id: this.LoginData['open_id'] } };
} portData['systemInfo'] = this.SystemInfo;
// 退出小游戏 portData['product_code'] = SDKConfig.productCode;
public exitApp = () => { portData['time'] = Date.parse(new Date().toString()) // 获取当前时间戳秒
(wx as any).exitMiniProgram() console.log('--SDK上报:', portData);
} this.request(SDKConfig.report, portData, 'POST')
private getWechatCode = (): Promise<any> => { }
return new Promise((resolve, reject) => { // 退出小游戏
try { public exitApp = () => {
(wx as any).login({ (wx as any).exitMiniProgram()
success: (res) => { }
if (res.code) resolve(res); private getWechatCode = (): Promise<any> => {
else { return new Promise((resolve, reject) => {
this.showMsg("执行wx.login返回成功,但无code参数", 5000); try {
resolve({ code: 0 }); (wx as any).login({
} success: (res) => {
}, if (res.code) resolve(res);
fail: () => { else {
this.showMsg("执行wx.login返回失败", 5000); this.showMsg("执行wx.login返回成功,但无code参数", 5000);
resolve({ code: 0 }); resolve({ code: 0 });
}, }
}); },
} catch (err) { fail: () => {
this.showMsg("微信登录接口返回失败"); this.showMsg("执行wx.login返回失败", 5000);
} resolve({ code: 0 });
}); },
} });
private showLoading() { } catch (err) {
(wx as any).showLoading({ this.showMsg("微信登录接口返回失败");
title: '请稍候..', }
mask: true });
}) }
} private showLoading() {
private hideLoading() { (wx as any).hideLoading() } (wx as any).showLoading({
private showModal(DATA) { title: '请稍候..',
(wx as any).showModal({ mask: true
...DATA, })
cancelText: '取消', }
confirmText: '确认' private hideLoading() { (wx as any).hideLoading() }
}) private showModal(DATA) {
} (wx as any).showModal({
public showMsg = (str, duration = 3000) => { ...DATA,
(wx as any).showToast({ cancelText: '取消',
title: str, confirmText: '确认'
icon: 'none', })
duration: duration }
}) public showMsg = (str, duration = 3000) => {
} (wx as any).showToast({
private getSystemInfo = (): Promise<any> => { title: str,
return new Promise((resolve, reject) => { icon: 'none',
(wx as any).getSystemInfo({ duration: duration
success: (res) => { resolve(res) }, })
}) }
}) private getSystemInfo = (): Promise<any> => {
} return new Promise((resolve, reject) => {
public getNetworkType = (): Promise<any> => { (wx as any).getSystemInfo({
return new Promise((resolve, reject) => { success: (res) => { resolve(res) },
(wx as any).getNetworkType({ })
success: (res) => { resolve(res.networkType) }, })
}) }
}) public getNetworkType = (): Promise<any> => {
} return new Promise((resolve, reject) => {
public getOptionsInfo = () => { (wx as any).getNetworkType({
const options = (wx as any).getLaunchOptionsSync() success: (res) => { resolve(res.networkType) },
console.log("--启动参数--->", options); })
if (options.query && Object.keys(options.query).length > 0) { })
if (options.query.scene) { // 扫码参数 }
const scene = this.toJson(decodeURIComponent(options.query.scene)); public getOptionsInfo = () => {
return scene; const options = (wx as any).getLaunchOptionsSync()
} else return { ...options.query, scene: options.scene || '' }; // 普通url参数 console.log("--启动参数--->", options);
} else if (options.referrerInfo && options.referrerInfo.appId) { if (options.query && Object.keys(options.query).length > 0) {
return { ...options.referrerInfo.extraData, scene: options.scene || '', appId: options.referrerInfo.appId } // 小程序跳转附带参数 if (options.query.scene) { // 扫码参数
} else return {} const scene = this.toJson(decodeURIComponent(options.query.scene));
} return scene;
// SDK上报接口 } else return { ...options.query, scene: options.scene || '' }; // 普通url参数
private sdkRequest = async (link: string, portData, method?) => { } else if (options.referrerInfo && options.referrerInfo.appId) {
portData = this.md5_sign(portData) // 附上签名参数 return { ...options.referrerInfo.extraData, scene: options.scene || '', appId: options.referrerInfo.appId } // 小程序跳转附带参数
console.log('--SDK接口:', portData); } else return {}
return await this.request(link, portData, method); }
} // SDK上报接口
// 调用微信请求接口 private sdkRequest = async (link: string, portData, method?) => {
private request = async (URI: string, Params: any, Method = 'GET') => { portData = this.md5_sign(portData) // 附上签名参数
const { code, data, msg } = await this.fetchUri(URI, Params, Method); console.log('--SDK接口:', portData);
if (!data) return { code, data: {}, msg } return await this.request(link, portData, method);
if (!code) return { code, data, msg }; }
if (code) this.showMsg(msg); // 输出接口异常 // 调用微信请求接口
} private request = async (URI: string, Params: any, Method = 'GET') => {
private fetchUri = (URI, DATA, METHOD): Promise<any> => { const { code, data, msg } = await this.fetchUri(URI, Params, Method);
return new Promise((resolve, reject) => { if (!data) return { code, data: {}, msg }
try { if (!code) return { code, data, msg };
(wx as any).request({ if (code) this.showMsg(msg); // 输出接口异常
url: URI, }
method: METHOD, private fetchUri = (URI, DATA, METHOD): Promise<any> => {
data: DATA, return new Promise((resolve, reject) => {
header: { try {
'Content-Type': 'json' (wx as any).request({
}, url: URI,
success: (response) => { method: METHOD,
resolve(response.data) data: DATA,
}, header: {
fail: resolve 'Content-Type': 'json'
}) },
} catch (err) { success: (response) => {
reject(err) resolve(response.data)
} },
}) fail: resolve
} })
//把字符串转换成json } catch (err) {
private toJson = (str: string) => { reject(err)
let json = {} }
const jsonArr = str.split('&') })
for (let i = 0; i < jsonArr.length; i++) { }
const keyArr = jsonArr[i].split('=') //把字符串转换成json
json[keyArr[0]] = keyArr[1] || '' // 附上key和对应的value private toJson = (str: string) => {
} let json = {}
return json const jsonArr = str.split('&')
} for (let i = 0; i < jsonArr.length; i++) {
//接口签名,直接返回完整对象 const keyArr = jsonArr[i].split('=')
private md5_sign = (obj) => { json[keyArr[0]] = keyArr[1] || '' // 附上key和对应的value
obj.time = Date.parse(new Date().toString()) // 获取请求的时间戳秒 }
let keys = Object.keys(obj).sort(); return json
let key_url = ""; }
for (let i = 0; i < keys.length; i++) { //接口签名,直接返回完整对象
if (keys[i] != 'sign') key_url += keys[i] + '=' + obj[keys[i]] + '&' private md5_sign = (obj) => {
} obj.time = Date.parse(new Date().toString()) // 获取请求的时间戳秒
key_url = key_url + SDKConfig.productKey let keys = Object.keys(obj).sort();
obj.sign = md5(key_url) let key_url = "";
return obj for (let i = 0; i < keys.length; i++) {
} if (keys[i] != 'sign') key_url += keys[i] + '=' + obj[keys[i]] + '&'
// SDK接口通用参数 }
private SDKCOMMDATA: Object = { key_url = key_url + SDKConfig.productKey
source: 'WEIXIN', obj.sign = md5(key_url)
product_code: SDKConfig.productCode, return obj
uuid: '', }
equipmentos: '', // SDK接口通用参数
package_code: '', private SDKCOMMDATA: Object = {
time: '', source: 'WEIXIN',
sign: '', product_code: SDKConfig.productCode,
os: '', uuid: '',
version: this.sdkVersion equipmentos: '',
} package_code: '',
// 米大师支付参数 time: '',
private MidasPaymentParams = { sign: '',
mode: 'game', // 支付的类型 os: '',
env: SDKConfig.midasPayEnv, // 米大师环境 version: this.sdkVersion
currencyType: 'CNY', // 币种 }
platform: 'android', // 客户端平台 // 米大师支付参数
zoneId: '1', // 分区ID,默认1 private MidasPaymentParams = {
offerId: SDKConfig.offerid, mode: 'game', // 支付的类型
} env: SDKConfig.midasPayEnv, // 米大师环境
private MidasErrorCode = { currencyType: 'CNY', // 币种
'-1': '系统失败', platform: 'android', // 客户端平台
'-2': '支付取消', zoneId: '1', // 分区ID,默认1
'-15001': '缺少参数', offerId: SDKConfig.offerid,
'-15002': '参数不合法', }
'-15003': '订单重复', private MidasErrorCode = {
'-15004': '后台错误', '-1': '系统失败',
'-15005': 'appId权限被封禁', '-2': '支付取消',
'-15006': '货币类型不支持', '-15001': '缺少参数',
'-15007': '订单已支付', '-15002': '参数不合法',
'-15009': '由于健康系统限制,本次支付已超过限额', '-15003': '订单重复',
'1': '用户取消支付', '-15004': '后台错误',
'2': '客户端错误,判断到小程序在用户处于支付中时,又发起了一笔支付请求', '-15005': 'appId权限被封禁',
'3': 'Android 独有错误:用户使用 Google Play 支付,而手机未安装 Google Play', '-15006': '货币类型不支持',
'4': '用户操作系统支付状态异常', '-15007': '订单已支付',
'5': '操作系统错误', '-15009': '由于健康系统限制,本次支付已超过限额',
'6': '其他错误', '1': '用户取消支付',
'1000': '参数错误', '2': '客户端错误,判断到小程序在用户处于支付中时,又发起了一笔支付请求',
'1003': '米大师Portal错误', '3': 'Android 独有错误:用户使用 Google Play 支付,而手机未安装 Google Play',
} '4': '用户操作系统支付状态异常',
'5': '操作系统错误',
'6': '其他错误',
'1000': '参数错误',
'1003': '米大师Portal错误',
}
} }
interface shareInfo { interface shareInfo {
title?: string title?: string
image?: string image?: string
imageId?: string imageId?: string
query?: string query?: string
success: any success: any
fail: any fail: any
complete?: any complete?: any
} }
interface RecorderInfo { interface RecorderInfo {
duration: number duration: number
} }
// SDK后端接口(勿改) // SDK后端接口(勿改)
const Links = { const Links = {
init: SDKConfig.sdk_domain + '/weixin/access_token.php', // 获取openid init: SDKConfig.sdk_domain + '/weixin/access_token.php', // 获取openid
active: SDKConfig.sdk_domain + '/appInit.php', // SDK初始化接口 active: SDKConfig.sdk_domain + '/appInit.php', // SDK初始化接口
login: SDKConfig.sdk_domain + '/login.php', // SDK登录接口,获取用户平台信息 login: SDKConfig.sdk_domain + '/login.php', // SDK登录接口,获取用户平台信息
order: SDKConfig.pay_domain + '/pay.php', //订单接口 order: SDKConfig.pay_domain + '/pay.php', //订单接口
pay: SDKConfig.pay_domain + '/notify/midas/pay.php', //扣费接口 pay: SDKConfig.pay_domain + '/notify/midas/pay.php', //扣费接口
payType: SDKConfig.pay_domain + '/pay_channel/status.php', // 查询支付状态 payType: SDKConfig.pay_domain + '/pay_channel/status.php', // 查询支付状态
sendCode: SDKConfig.sdk_domain + '/sms/send.php', // 发送验证码 sendCode: SDKConfig.sdk_domain + '/sms/send.php', // 发送验证码
saveNum: SDKConfig.sdk_domain + '/bind/mobile.php', // 保存手机号码 saveNum: SDKConfig.sdk_domain + '/bind/mobile.php', // 保存手机号码
playTime: SDKConfig.sdk_domain + '', // 获取用户在线时长 playTime: SDKConfig.sdk_domain + '', // 获取用户在线时长
bindPhone: SDKConfig.sdk_domain + '/bind/is_bind_mobile.php', // 用户手机绑定状态 bindPhone: SDKConfig.sdk_domain + '/bind/is_bind_mobile.php', // 用户手机绑定状态
getActShareId: SDKConfig.active_domain + '/weixin/updatable_message/create_activity_id', // 获取活动消息id getActShareId: SDKConfig.active_domain + '/weixin/updatable_message/create_activity_id', // 获取活动消息id
setActShareInfo: SDKConfig.active_domain + '/weixin/updatable_message/updatablemsg', // 更新活动消息内容 setActShareInfo: SDKConfig.active_domain + '/weixin/updatable_message/updatablemsg', // 更新活动消息内容
getActShareInfo: SDKConfig.active_domain + '/weixin/updatable_message/get_activity', // 查询活动消息内容 getActShareInfo: SDKConfig.active_domain + '/weixin/updatable_message/get_activity', // 查询活动消息内容
paymentErrorReport: SDKConfig.sdk_domain + '/v2/analytics/event', // 上报支付错误信息 paymentErrorReport: SDKConfig.sdk_domain + '/v2/analytics/event', // 上报支付错误信息
} }
// md5加密 // md5加密
const rotateLeft = (lValue, iShiftBits) => { return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)) }; var addUnsigned = function (lX, lY) { var lX4, lY4, lX8, lY8, lResult; lX8 = (lX & 2147483648); lY8 = (lY & 2147483648); lX4 = (lX & 1073741824); lY4 = (lY & 1073741824); lResult = (lX & 1073741823) + (lY & 1073741823); if (lX4 & lY4) { return (lResult ^ 2147483648 ^ lX8 ^ lY8) } if (lX4 | lY4) { if (lResult & 1073741824) { return (lResult ^ 3221225472 ^ lX8 ^ lY8) } else { return (lResult ^ 1073741824 ^ lX8 ^ lY8) } } else { return (lResult ^ lX8 ^ lY8) } }; var F = function (x, y, z) { return (x & y) | ((~x) & z) }; var G = function (x, y, z) { return (x & z) | (y & (~z)) }; var H = function (x, y, z) { return (x ^ y ^ z) }; var I = function (x, y, z) { return (y ^ (x | (~z))) }; var FF = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b) }; var GG = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b) }; var HH = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b) }; var II = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b) }; var convertToWordArray = function (string) { var lWordCount; var lMessageLength = string.length; var lNumberOfWordsTempOne = lMessageLength + 8; var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64; var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16; var lWordArray = Array(lNumberOfWords - 1); var lBytePosition = 0; var lByteCount = 0; while (lByteCount < lMessageLength) { lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); lByteCount++ } lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = lWordArray[lWordCount] | (128 << lBytePosition); lWordArray[lNumberOfWords - 2] = lMessageLength << 3; lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; return lWordArray }; var wordToHex = function (lValue) { var WordToHexValue = "", WordToHexValueTemp = "", lByte, lCount; for (lCount = 0; lCount <= 3; lCount++) { lByte = (lValue >>> (lCount * 8)) & 255; WordToHexValueTemp = "0" + lByte.toString(16); WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2) } return WordToHexValue }; var uTF8Encode = function (string) { string = string.replace(/\x0d\x0a/g, "\x0a"); var output = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { output += String.fromCharCode(c) } else { if ((c > 127) && (c < 2048)) { output += String.fromCharCode((c >> 6) | 192); output += String.fromCharCode((c & 63) | 128) } else { output += String.fromCharCode((c >> 12) | 224); output += String.fromCharCode(((c >> 6) & 63) | 128); output += String.fromCharCode((c & 63) | 128) } } } return output }; function md5(string) { var x = Array(); var k, AA, BB, CC, DD, a, b, c, d; var S11 = 7, S12 = 12, S13 = 17, S14 = 22; var S21 = 5, S22 = 9, S23 = 14, S24 = 20; var S31 = 4, S32 = 11, S33 = 16, S34 = 23; var S41 = 6, S42 = 10, S43 = 15, S44 = 21; string = uTF8Encode(string); x = convertToWordArray(string); a = 1732584193; b = 4023233417; c = 2562383102; d = 271733878; for (k = 0; k < x.length; k += 16) { AA = a; BB = b; CC = c; DD = d; a = FF(a, b, c, d, x[k + 0], S11, 3614090360); d = FF(d, a, b, c, x[k + 1], S12, 3905402710); c = FF(c, d, a, b, x[k + 2], S13, 606105819); b = FF(b, c, d, a, x[k + 3], S14, 3250441966); a = FF(a, b, c, d, x[k + 4], S11, 4118548399); d = FF(d, a, b, c, x[k + 5], S12, 1200080426); c = FF(c, d, a, b, x[k + 6], S13, 2821735955); b = FF(b, c, d, a, x[k + 7], S14, 4249261313); a = FF(a, b, c, d, x[k + 8], S11, 1770035416); d = FF(d, a, b, c, x[k + 9], S12, 2336552879); c = FF(c, d, a, b, x[k + 10], S13, 4294925233); b = FF(b, c, d, a, x[k + 11], S14, 2304563134); a = FF(a, b, c, d, x[k + 12], S11, 1804603682); d = FF(d, a, b, c, x[k + 13], S12, 4254626195); c = FF(c, d, a, b, x[k + 14], S13, 2792965006); b = FF(b, c, d, a, x[k + 15], S14, 1236535329); a = GG(a, b, c, d, x[k + 1], S21, 4129170786); d = GG(d, a, b, c, x[k + 6], S22, 3225465664); c = GG(c, d, a, b, x[k + 11], S23, 643717713); b = GG(b, c, d, a, x[k + 0], S24, 3921069994); a = GG(a, b, c, d, x[k + 5], S21, 3593408605); d = GG(d, a, b, c, x[k + 10], S22, 38016083); c = GG(c, d, a, b, x[k + 15], S23, 3634488961); b = GG(b, c, d, a, x[k + 4], S24, 3889429448); a = GG(a, b, c, d, x[k + 9], S21, 568446438); d = GG(d, a, b, c, x[k + 14], S22, 3275163606); c = GG(c, d, a, b, x[k + 3], S23, 4107603335); b = GG(b, c, d, a, x[k + 8], S24, 1163531501); a = GG(a, b, c, d, x[k + 13], S21, 2850285829); d = GG(d, a, b, c, x[k + 2], S22, 4243563512); c = GG(c, d, a, b, x[k + 7], S23, 1735328473); b = GG(b, c, d, a, x[k + 12], S24, 2368359562); a = HH(a, b, c, d, x[k + 5], S31, 4294588738); d = HH(d, a, b, c, x[k + 8], S32, 2272392833); c = HH(c, d, a, b, x[k + 11], S33, 1839030562); b = HH(b, c, d, a, x[k + 14], S34, 4259657740); a = HH(a, b, c, d, x[k + 1], S31, 2763975236); d = HH(d, a, b, c, x[k + 4], S32, 1272893353); c = HH(c, d, a, b, x[k + 7], S33, 4139469664); b = HH(b, c, d, a, x[k + 10], S34, 3200236656); a = HH(a, b, c, d, x[k + 13], S31, 681279174); d = HH(d, a, b, c, x[k + 0], S32, 3936430074); c = HH(c, d, a, b, x[k + 3], S33, 3572445317); b = HH(b, c, d, a, x[k + 6], S34, 76029189); a = HH(a, b, c, d, x[k + 9], S31, 3654602809); d = HH(d, a, b, c, x[k + 12], S32, 3873151461); c = HH(c, d, a, b, x[k + 15], S33, 530742520); b = HH(b, c, d, a, x[k + 2], S34, 3299628645); a = II(a, b, c, d, x[k + 0], S41, 4096336452); d = II(d, a, b, c, x[k + 7], S42, 1126891415); c = II(c, d, a, b, x[k + 14], S43, 2878612391); b = II(b, c, d, a, x[k + 5], S44, 4237533241); a = II(a, b, c, d, x[k + 12], S41, 1700485571); d = II(d, a, b, c, x[k + 3], S42, 2399980690); c = II(c, d, a, b, x[k + 10], S43, 4293915773); b = II(b, c, d, a, x[k + 1], S44, 2240044497); a = II(a, b, c, d, x[k + 8], S41, 1873313359); d = II(d, a, b, c, x[k + 15], S42, 4264355552); c = II(c, d, a, b, x[k + 6], S43, 2734768916); b = II(b, c, d, a, x[k + 13], S44, 1309151649); a = II(a, b, c, d, x[k + 4], S41, 4149444226); d = II(d, a, b, c, x[k + 11], S42, 3174756917); c = II(c, d, a, b, x[k + 2], S43, 718787259); b = II(b, c, d, a, x[k + 9], S44, 3951481745); a = addUnsigned(a, AA); b = addUnsigned(b, BB); c = addUnsigned(c, CC); d = addUnsigned(d, DD) } var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d); return tempValue.toLowerCase() }; const rotateLeft = (lValue, iShiftBits) => { return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)) }; var addUnsigned = function (lX, lY) { var lX4, lY4, lX8, lY8, lResult; lX8 = (lX & 2147483648); lY8 = (lY & 2147483648); lX4 = (lX & 1073741824); lY4 = (lY & 1073741824); lResult = (lX & 1073741823) + (lY & 1073741823); if (lX4 & lY4) { return (lResult ^ 2147483648 ^ lX8 ^ lY8) } if (lX4 | lY4) { if (lResult & 1073741824) { return (lResult ^ 3221225472 ^ lX8 ^ lY8) } else { return (lResult ^ 1073741824 ^ lX8 ^ lY8) } } else { return (lResult ^ lX8 ^ lY8) } }; var F = function (x, y, z) { return (x & y) | ((~x) & z) }; var G = function (x, y, z) { return (x & z) | (y & (~z)) }; var H = function (x, y, z) { return (x ^ y ^ z) }; var I = function (x, y, z) { return (y ^ (x | (~z))) }; var FF = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b) }; var GG = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b) }; var HH = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b) }; var II = function (a, b, c, d, x, s, ac) { a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac)); return addUnsigned(rotateLeft(a, s), b) }; var convertToWordArray = function (string) { var lWordCount; var lMessageLength = string.length; var lNumberOfWordsTempOne = lMessageLength + 8; var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64; var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16; var lWordArray = Array(lNumberOfWords - 1); var lBytePosition = 0; var lByteCount = 0; while (lByteCount < lMessageLength) { lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); lByteCount++ } lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = lWordArray[lWordCount] | (128 << lBytePosition); lWordArray[lNumberOfWords - 2] = lMessageLength << 3; lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; return lWordArray }; var wordToHex = function (lValue) { var WordToHexValue = "", WordToHexValueTemp = "", lByte, lCount; for (lCount = 0; lCount <= 3; lCount++) { lByte = (lValue >>> (lCount * 8)) & 255; WordToHexValueTemp = "0" + lByte.toString(16); WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2) } return WordToHexValue }; var uTF8Encode = function (string) { string = string.replace(/\x0d\x0a/g, "\x0a"); var output = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { output += String.fromCharCode(c) } else { if ((c > 127) && (c < 2048)) { output += String.fromCharCode((c >> 6) | 192); output += String.fromCharCode((c & 63) | 128) } else { output += String.fromCharCode((c >> 12) | 224); output += String.fromCharCode(((c >> 6) & 63) | 128); output += String.fromCharCode((c & 63) | 128) } } } return output }; function md5(string) { var x = Array(); var k, AA, BB, CC, DD, a, b, c, d; var S11 = 7, S12 = 12, S13 = 17, S14 = 22; var S21 = 5, S22 = 9, S23 = 14, S24 = 20; var S31 = 4, S32 = 11, S33 = 16, S34 = 23; var S41 = 6, S42 = 10, S43 = 15, S44 = 21; string = uTF8Encode(string); x = convertToWordArray(string); a = 1732584193; b = 4023233417; c = 2562383102; d = 271733878; for (k = 0; k < x.length; k += 16) { AA = a; BB = b; CC = c; DD = d; a = FF(a, b, c, d, x[k + 0], S11, 3614090360); d = FF(d, a, b, c, x[k + 1], S12, 3905402710); c = FF(c, d, a, b, x[k + 2], S13, 606105819); b = FF(b, c, d, a, x[k + 3], S14, 3250441966); a = FF(a, b, c, d, x[k + 4], S11, 4118548399); d = FF(d, a, b, c, x[k + 5], S12, 1200080426); c = FF(c, d, a, b, x[k + 6], S13, 2821735955); b = FF(b, c, d, a, x[k + 7], S14, 4249261313); a = FF(a, b, c, d, x[k + 8], S11, 1770035416); d = FF(d, a, b, c, x[k + 9], S12, 2336552879); c = FF(c, d, a, b, x[k + 10], S13, 4294925233); b = FF(b, c, d, a, x[k + 11], S14, 2304563134); a = FF(a, b, c, d, x[k + 12], S11, 1804603682); d = FF(d, a, b, c, x[k + 13], S12, 4254626195); c = FF(c, d, a, b, x[k + 14], S13, 2792965006); b = FF(b, c, d, a, x[k + 15], S14, 1236535329); a = GG(a, b, c, d, x[k + 1], S21, 4129170786); d = GG(d, a, b, c, x[k + 6], S22, 3225465664); c = GG(c, d, a, b, x[k + 11], S23, 643717713); b = GG(b, c, d, a, x[k + 0], S24, 3921069994); a = GG(a, b, c, d, x[k + 5], S21, 3593408605); d = GG(d, a, b, c, x[k + 10], S22, 38016083); c = GG(c, d, a, b, x[k + 15], S23, 3634488961); b = GG(b, c, d, a, x[k + 4], S24, 3889429448); a = GG(a, b, c, d, x[k + 9], S21, 568446438); d = GG(d, a, b, c, x[k + 14], S22, 3275163606); c = GG(c, d, a, b, x[k + 3], S23, 4107603335); b = GG(b, c, d, a, x[k + 8], S24, 1163531501); a = GG(a, b, c, d, x[k + 13], S21, 2850285829); d = GG(d, a, b, c, x[k + 2], S22, 4243563512); c = GG(c, d, a, b, x[k + 7], S23, 1735328473); b = GG(b, c, d, a, x[k + 12], S24, 2368359562); a = HH(a, b, c, d, x[k + 5], S31, 4294588738); d = HH(d, a, b, c, x[k + 8], S32, 2272392833); c = HH(c, d, a, b, x[k + 11], S33, 1839030562); b = HH(b, c, d, a, x[k + 14], S34, 4259657740); a = HH(a, b, c, d, x[k + 1], S31, 2763975236); d = HH(d, a, b, c, x[k + 4], S32, 1272893353); c = HH(c, d, a, b, x[k + 7], S33, 4139469664); b = HH(b, c, d, a, x[k + 10], S34, 3200236656); a = HH(a, b, c, d, x[k + 13], S31, 681279174); d = HH(d, a, b, c, x[k + 0], S32, 3936430074); c = HH(c, d, a, b, x[k + 3], S33, 3572445317); b = HH(b, c, d, a, x[k + 6], S34, 76029189); a = HH(a, b, c, d, x[k + 9], S31, 3654602809); d = HH(d, a, b, c, x[k + 12], S32, 3873151461); c = HH(c, d, a, b, x[k + 15], S33, 530742520); b = HH(b, c, d, a, x[k + 2], S34, 3299628645); a = II(a, b, c, d, x[k + 0], S41, 4096336452); d = II(d, a, b, c, x[k + 7], S42, 1126891415); c = II(c, d, a, b, x[k + 14], S43, 2878612391); b = II(b, c, d, a, x[k + 5], S44, 4237533241); a = II(a, b, c, d, x[k + 12], S41, 1700485571); d = II(d, a, b, c, x[k + 3], S42, 2399980690); c = II(c, d, a, b, x[k + 10], S43, 4293915773); b = II(b, c, d, a, x[k + 1], S44, 2240044497); a = II(a, b, c, d, x[k + 8], S41, 1873313359); d = II(d, a, b, c, x[k + 15], S42, 4264355552); c = II(c, d, a, b, x[k + 6], S43, 2734768916); b = II(b, c, d, a, x[k + 13], S44, 1309151649); a = II(a, b, c, d, x[k + 4], S41, 4149444226); d = II(d, a, b, c, x[k + 11], S42, 3174756917); c = II(c, d, a, b, x[k + 2], S43, 718787259); b = II(b, c, d, a, x[k + 9], S44, 3951481745); a = addUnsigned(a, AA); b = addUnsigned(b, BB); c = addUnsigned(c, CC); d = addUnsigned(d, DD) } var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d); return tempValue.toLowerCase() };
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论