Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
weixin_sdk_release
概览
概览
详情
活动
周期分析
版本库
存储库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
JIRA
JIRA
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
open
weixin_sdk_release
Commits
ade6972a
提交
ade6972a
authored
4月 27, 2021
作者:
王进
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert "优化启动参数获取方式"
This reverts commit
c0444676
.
上级
01289986
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
735 行增加
和
970 行删除
+735
-970
SDK.ts
SDK.ts
+735
-970
没有找到文件。
SDK.ts
浏览文件 @
ade6972a
/**
/**
* 鲸鱼游戏微信小游戏接入库
* 鲸鱼游戏微信小游戏接入库
* @author 推广技术部
* @author 推广技术部
* @time: 2021-04-23
* @time: 2020-12-22
*
* 1.优化启动参数获取方式
*
*/
*/
class
WechatSDK
{
class
WechatSDK
{
private
sdkVersion
:
string
=
"3.0.5"
;
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
++
;
// 每分钟记录一次
let
curTime
=
new
Date
().
getTime
();
this
.
onlineTime
++
;
(
wx
as
any
).
setStorageSync
(
"onlineMinute"
,
this
.
onlineTime
);
let
curTime
=
new
Date
().
getTime
();
(
wx
as
any
).
setStorageSync
(
"offlineTime"
,
curTime
);
(
wx
as
any
).
setStorageSync
(
"onlineMinute"
,
this
.
onlineTime
);
},
60000
);
(
wx
as
any
).
setStorageSync
(
"offlineTime"
,
curTime
);
}
},
60000
);
private
sdkInit
=
async
()
=>
{
}
this
.
LaunchOptions
=
await
this
.
getOptionsInfo
();
private
sdkInit
=
async
()
=>
{
this
.
actId
=
this
.
LaunchOptions
[
'actId'
]
||
''
;
this
.
LaunchOptions
=
await
this
.
getOptionsInfo
();
this
.
SystemInfo
=
await
this
.
getSystemInfo
();
this
.
actId
=
this
.
LaunchOptions
[
"actId"
]
||
""
;
this
.
SystemInfo
[
'networkType'
]
=
await
this
.
getNetworkType
();
this
.
SystemInfo
=
await
this
.
getSystemInfo
();
this
.
SDKCOMMDATA
[
'os'
]
=
this
.
SystemInfo
[
'system'
].
split
(
' '
)[
0
].
toLowerCase
();
this
.
SystemInfo
[
"networkType"
]
=
await
this
.
getNetworkType
();
}
this
.
SDKCOMMDATA
[
"os"
]
=
this
.
SystemInfo
[
"system"
].
split
(
" "
)[
0
].
toLowerCase
();
public
Login
=
async
(
retry
=
0
)
=>
{
};
if
(
retry
>
2
)
{
public
Login
=
async
(
retry
=
0
)
=>
{
this
.
showMsg
(
'登录异常,请联系客服.'
);
if
(
retry
>
2
)
{
return
{
error
:
"登录超时.."
}
this
.
showMsg
(
"登录异常,请联系客服."
);
}
return
{
error
:
"登录超时.."
};
const
res
=
await
this
.
getWechatCode
();
// 获取微信登录code
}
if
(
res
.
code
)
{
const
res
=
await
this
.
getWechatCode
();
// 获取微信登录code
// 请求openid
if
(
res
.
code
)
{
const
{
data
}
=
await
this
.
sdkRequest
(
Links
.
init
,
{
// 请求openid
...
this
.
SDKCOMMDATA
,
const
{
data
}
=
await
this
.
sdkRequest
(
Links
.
init
,
{
appid
:
SDKConfig
.
appid
,
...
this
.
SDKCOMMDATA
,
code
:
res
.
code
appid
:
SDKConfig
.
appid
,
});
code
:
res
.
code
,
this
.
LoginData
=
{
...
data
}
});
this
.
SDKCOMMDATA
[
'uuid'
]
=
data
.
open_id
;
this
.
LoginData
=
{
...
data
};
// SDK后台调试模式开关
this
.
SDKCOMMDATA
[
"uuid"
]
=
data
.
open_id
;
if
(
typeof
(
data
.
debug_mode
)
!=
"undefined"
&&
data
.
debug_mode
==
1
)
{
// SDK后台调试模式开关
(
wx
as
any
).
setEnableDebug
({
if
(
typeof
data
.
debug_mode
!=
"undefined"
&&
data
.
debug_mode
==
1
)
{
enableDebug
:
true
(
wx
as
any
).
setEnableDebug
({
})
enableDebug
:
true
,
}
});
this
.
actId
!=
""
&&
this
.
updateShareMsgInfo
({});
}
return
this
.
sdkActive
();
this
.
actId
!=
""
&&
this
.
updateShareMsgInfo
({});
}
return
this
.
sdkActive
();
retry
+=
1
;
}
this
.
Login
(
retry
);
retry
+=
1
;
}
this
.
Login
(
retry
);
// SDK激活
};
private
sdkActive
=
async
()
=>
{
// SDK激活
const
{
data
}
=
await
this
.
sdkRequest
(
Links
.
active
,
{
...
this
.
SDKCOMMDATA
,
...
this
.
LoginData
});
private
sdkActive
=
async
()
=>
{
this
.
LoginData
[
'pay_channel'
]
=
data
.
default_pay_channel
;
const
{
data
}
=
await
this
.
sdkRequest
(
Links
.
active
,
{
this
.
ActiReport
();
// 上报激活
...
this
.
SDKCOMMDATA
,
return
this
.
sdkLogin
();
...
this
.
LoginData
,
}
});
private
async
sdkLogin
()
{
this
.
LoginData
[
"pay_channel"
]
=
data
.
default_pay_channel
;
delete
this
.
LoginData
[
'token'
];
// 强制清空登录toekn
this
.
ActiReport
();
// 上报激活
const
{
data
,
msg
}
=
await
this
.
sdkRequest
(
Links
.
login
,
{
...
this
.
SDKCOMMDATA
,
...
this
.
LoginData
});
return
this
.
sdkLogin
();
console
.
log
(
"--SDK登录返回::"
,
data
);
};
if
(
Object
.
keys
(
data
).
length
==
0
)
{
private
async
sdkLogin
()
{
this
.
showMsg
(
msg
);
delete
this
.
LoginData
[
"token"
];
// 强制清空登录toekn
return
{
error
:
msg
}
const
{
data
,
msg
}
=
await
this
.
sdkRequest
(
Links
.
login
,
{
}
...
this
.
SDKCOMMDATA
,
this
.
LoginData
=
{
...
this
.
LoginData
,
...
data
}
...
this
.
LoginData
,
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
{
console
.
log
(
"--SDK登录返回::"
,
data
);
...
filters
,
if
(
Object
.
keys
(
data
).
length
==
0
)
{
os
:
this
.
SDKCOMMDATA
[
'os'
],
// 返回系统类型IOS或者android
this
.
showMsg
(
msg
);
session_key
:
this
.
LoginData
[
'session_key'
],
// 返回session_key
return
{
error
:
msg
};
scene
:
this
.
LaunchOptions
[
'scene'
],
// 用户来源场景值
}
from_appid
:
this
.
LaunchOptions
[
'appId'
]
||
this
.
LaunchOptions
[
'appid'
],
this
.
LoginData
=
{
...
this
.
LoginData
,
...
data
};
launchOptions
:
this
.
LaunchOptions
const
filters
=
(({
create_time
,
ip
,
nickname
,
open_id
,
uid
,
enter_game
,
origin_uid
,
origin_open_id
})
=>
({
}
create_time
,
}
ip
,
public
payOrder
=
async
(
Params
,
showMessage
=
true
)
=>
{
nickname
,
this
.
showLoading
();
open_id
,
// 支付前先获取用户订单状态,如果没有未完成订单则继续支付
uid
,
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'
);
enter_game
,
this
.
hideLoading
();
origin_uid
,
if
(
code
==
0
&&
data
.
open_customer_service
)
{
origin_open_id
,
const
params
=
{
}))(
data
);
title
:
'充值教程'
,
return
{
content
:
'即将跳转官方【客服会话】进行充值, 向客服回复【充值】获取充值链接'
,
...
filters
,
showCancel
:
false
,
os
:
this
.
SDKCOMMDATA
[
"os"
],
// 返回系统类型IOS或者android
success
:
()
=>
{
session_key
:
this
.
LoginData
[
"session_key"
],
// 返回session_key
this
.
Customer
({
scene
:
this
.
LaunchOptions
[
"scene"
],
// 用户来源场景值
sessionFrom
:
'order_id='
+
(
data
.
order_num
||
''
)
+
'&payload='
+
(
data
.
payload
||
''
),
from_appid
:
this
.
LaunchOptions
[
"appId"
]
||
this
.
LaunchOptions
[
"appid"
],
showMessageCard
:
true
,
launchOptions
:
this
.
LaunchOptions
,
sendMessageTitle
:
'回复【充值】获取充值链接'
,
};
sendMessageImg
:
'https://h5sdk.pthc8.com/resource/images/payTips.jpg'
,
}
});
public
payOrder
=
async
(
Params
,
showMessage
=
true
)
=>
{
}
this
.
showLoading
();
}
// 支付前先获取用户订单状态,如果没有未完成订单则继续支付
this
.
showModal
(
params
);
const
{
code
,
data
,
msg
}
=
await
this
.
fetchUri
(
return
{
order_code
:
2
,
msg
:
''
};
Links
.
order
,
}
this
.
md5_sign
({
if
(
code
==
0
&&
data
.
order_type
==
1
)
{
...
this
.
SDKCOMMDATA
,
this
.
MidasPaymentParams
[
'buyQuantity'
]
=
<
number
>
(
Params
.
money
/
100
)
*
<
number
>
data
.
weixin_proportion
// 充值金额
...
Params
,
console
.
log
(
"--米大师支付参数:"
,
this
.
MidasPaymentParams
);
token
:
this
.
LoginData
[
"token"
],
// 调微信米大师支付接口
pay_channel
:
this
.
LoginData
[
"pay_channel"
],
return
new
Promise
((
resolve
,
reject
)
=>
{
}),
(
wx
as
any
).
requestMidasPayment
({
"GET"
...
this
.
MidasPaymentParams
,
);
success
:
async
(
response
)
=>
{
this
.
hideLoading
();
console
.
log
(
"--SDK支付成功:"
,
response
);
if
(
code
==
0
&&
data
.
open_customer_service
)
{
let
coinsResult
=
await
this
.
getCoins
({
...
this
.
SDKCOMMDATA
,
token
:
this
.
LoginData
[
'token'
],
order_num
:
data
.
order_num
});
const
params
=
{
if
(
coinsResult
.
code
==
0
||
coinsResult
.
code
==
3012
)
{
title
:
"充值教程"
,
resolve
({
order_code
:
200
,
msg
:
''
});
content
:
"即将跳转官方【客服会话】进行充值, 向客服回复【充值】获取充值链接"
,
}
showCancel
:
false
,
else
{
success
:
()
=>
{
resolve
({
order_code
:
0
,
msg
:
(
coinsResult
.
msg
||
''
)
});
this
.
Customer
({
}
sessionFrom
:
"order_id="
+
(
data
.
order_num
||
""
)
+
"&payload="
+
(
data
.
payload
||
""
),
},
showMessageCard
:
true
,
fail
:
(
err
)
=>
{
sendMessageTitle
:
"回复【充值】获取充值链接"
,
console
.
log
(
"--米大师支付失败:"
,
err
);
sendMessageImg
:
"https://h5sdk.pthc8.com/resource/images/payTips.jpg"
,
let
msg
=
this
.
MidasErrorCode
[
JSON
.
stringify
(
err
.
errCode
)]
||
'支付异常'
;
});
if
(
showMessage
)
{
},
const
params
=
{
};
title
:
'支付提示'
,
this
.
showModal
(
params
);
content
:
msg
,
return
{
order_code
:
2
,
msg
:
""
};
showCancel
:
false
}
}
if
(
code
==
0
&&
data
.
order_type
==
1
)
{
this
.
showModal
(
params
);
this
.
MidasPaymentParams
[
"buyQuantity"
]
=
<
number
>
(
Params
.
money
/
100
)
*
<
number
>
data
.
weixin_proportion
;
// 充值金额
}
console
.
log
(
"--米大师支付参数:"
,
this
.
MidasPaymentParams
);
resolve
({
order_code
:
err
.
errCode
,
msg
:
msg
});
// 调微信米大师支付接口
this
.
reportPaymentError
({
order_code
:
err
.
errCode
,
msg
:
msg
,
order_num
:
data
.
order_num
});
return
new
Promise
((
resolve
,
reject
)
=>
{
}
(
wx
as
any
).
requestMidasPayment
({
});
...
this
.
MidasPaymentParams
,
});
success
:
async
(
response
)
=>
{
}
console
.
log
(
"--SDK支付成功:"
,
response
);
}
let
coinsResult
=
await
this
.
getCoins
({
private
getCoins
=
async
(
orderParams
)
=>
{
// 通知服务端扣费
...
this
.
SDKCOMMDATA
,
console
.
log
(
'--通知扣费:'
,
orderParams
);
token
:
this
.
LoginData
[
"token"
],
return
await
this
.
sdkRequest
(
Links
.
pay
,
orderParams
)
order_num
:
data
.
order_num
,
}
});
public
createActiveShare
=
async
(
shareInfo
)
=>
{
//动态消息
if
(
coinsResult
.
code
==
0
||
coinsResult
.
code
==
3012
)
{
let
{
code
,
data
,
msg
}
=
await
this
.
sdkRequest
(
Links
.
getActShareId
,
{
resolve
({
order_code
:
200
,
msg
:
""
});
...
this
.
SDKCOMMDATA
,
}
else
{
room_limit
:
shareInfo
.
room_limit
,
resolve
({
target_state
:
0
order_code
:
0
,
},
'POST'
);
msg
:
coinsResult
.
msg
||
""
,
if
(
code
==
0
)
{
});
const
actId
=
data
.
activity_id
;
}
const
totalMembers
=
shareInfo
.
room_limit
||
'0'
;
},
(
wx
as
any
).
updateShareMenu
({
fail
:
(
err
)
=>
{
withShareTicket
:
true
,
console
.
log
(
"--米大师支付失败:"
,
err
);
isUpdatableMessage
:
true
,
let
msg
=
this
.
MidasErrorCode
[
JSON
.
stringify
(
err
.
errCode
)]
||
"支付异常"
;
activityId
:
this
.
actId
,
// 活动 ID
if
(
showMessage
)
{
templateInfo
:
{
const
params
=
{
parameterList
:
[{
title
:
"支付提示"
,
name
:
'member_count'
,
content
:
msg
,
value
:
'1'
// 设置房间初始玩家1
showCancel
:
false
,
},
{
};
name
:
'room_limit'
,
this
.
showModal
(
params
);
value
:
totalMembers
}
}]
resolve
({
order_code
:
err
.
errCode
,
msg
:
msg
});
},
this
.
reportPaymentError
({
success
:
(
res
)
=>
{
order_code
:
err
.
errCode
,
let
ShareParams
=
{
msg
:
msg
,
title
:
shareInfo
.
title
?
shareInfo
.
title
:
SDKConfig
.
shareTitle
,
order_num
:
data
.
order_num
,
imageUrl
:
shareInfo
.
image
?
shareInfo
.
image
:
SDKConfig
.
shareImageUrl
,
});
imageId
:
shareInfo
.
imageId
?
shareInfo
.
imageId
:
SDKConfig
.
shareImageId
,
},
query
:
'fromOpenId='
+
this
.
LoginData
[
'open_id'
]
+
'&from=share&tag=0&actId='
+
actId
});
}
});
this
.
share
(
ShareParams
);
}
},
if
(
code
==
3023
)
{
});
showMessage
&&
}
else
{
(
wx
as
any
).
showModal
({
console
.
log
(
"--SDK错误::createActiveSahre"
,
msg
);
title
:
"支付提示"
,
}
content
:
msg
,
}
cancelText
:
"取消"
,
confirmText
:
"确认"
,
});
return
{
order_code
:
3023
,
msg
:
""
};
}
if
(
code
)
{
const
errmsg
=
msg
||
"支付失败.."
;
showMessage
&&
this
.
showMsg
(
errmsg
);
return
{
order_code
:
code
,
msg
:
errmsg
};
}
};
private
getCoins
=
async
(
orderParams
)
=>
{
// 通知服务端扣费
console
.
log
(
"--通知扣费:"
,
orderParams
);
return
await
this
.
sdkRequest
(
Links
.
pay
,
orderParams
);
};
public
createActiveShare
=
async
(
shareInfo
)
=>
{
//动态消息
let
{
code
,
data
,
msg
}
=
await
this
.
sdkRequest
(
Links
.
getActShareId
,
{
...
this
.
SDKCOMMDATA
,
room_limit
:
shareInfo
.
room_limit
,
target_state
:
0
,
},
"POST"
);
if
(
code
==
0
)
{
const
actId
=
data
.
activity_id
;
const
totalMembers
=
shareInfo
.
room_limit
||
"0"
;
(
wx
as
any
).
updateShareMenu
({
withShareTicket
:
true
,
isUpdatableMessage
:
true
,
activityId
:
this
.
actId
,
// 活动 ID
templateInfo
:
{
parameterList
:
[
{
name
:
"member_count"
,
value
:
"1"
,
// 设置房间初始玩家1
},
{
name
:
"room_limit"
,
value
:
totalMembers
,
},
],
},
success
:
(
res
)
=>
{
let
ShareParams
=
{
title
:
shareInfo
.
title
?
shareInfo
.
title
:
SDKConfig
.
shareTitle
,
imageUrl
:
shareInfo
.
image
?
shareInfo
.
image
:
SDKConfig
.
shareImageUrl
,
imageId
:
shareInfo
.
imageId
?
shareInfo
.
imageId
:
SDKConfig
.
shareImageId
,
query
:
"fromOpenId="
+
this
.
LoginData
[
"open_id"
]
+
"&from=share&tag=0&actId="
+
actId
,
};
this
.
share
(
ShareParams
);
},
});
}
else
{
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
,
{
// 查询动态消息接口
product_code
:
SDKConfig
.
productCode
,
let
{
code
,
data
}
=
await
this
.
sdkRequest
(
activity_id
:
this
.
actId
Links
.
getActShareInfo
,
},
'POST'
)
{
return
!
code
?
data
:
0
;
product_code
:
SDKConfig
.
productCode
,
}
activity_id
:
this
.
actId
,
public
async
phoneCode
(
phoneInfo
,
callback
?)
{
// 发送验证码接口
},
const
{
code
}
=
await
this
.
sdkRequest
(
Links
.
sendCode
,
{
...
this
.
SDKCOMMDATA
,
...
phoneInfo
,
type
:
'SDK.BIND_MOBILE'
});
"POST"
callback
&&
callback
(
!
code
);
);
}
return
!
code
?
data
:
0
;
public
async
userPhone
(
phoneInfo
,
callback
)
{
// 绑定手机
};
const
{
code
}
=
await
this
.
sdkRequest
(
Links
.
saveNum
,
{
...
this
.
SDKCOMMDATA
,
open_id
:
this
.
LoginData
[
'open_id'
],
...
phoneInfo
,
source
:
'WEIXIN'
})
public
async
phoneCode
(
phoneInfo
,
callback
?)
{
callback
(
code
);
// 发送验证码接口
}
const
{
code
}
=
await
this
.
sdkRequest
(
Links
.
sendCode
,
{
public
async
checkUserPhoneBind
()
{
// 查询用户绑定状态
...
this
.
SDKCOMMDATA
,
const
{
code
}
=
await
this
.
sdkRequest
(
Links
.
bindPhone
,
{
...
this
.
SDKCOMMDATA
,
uid
:
this
.
LoginData
[
'uid'
]
});
...
phoneInfo
,
return
!
code
;
type
:
"SDK.BIND_MOBILE"
,
}
});
public
async
getUserPaymentType
(
roleInfo
)
{
// 是否支持切支付
callback
&&
callback
(
!
code
);
let
{
code
}
=
await
this
.
sdkRequest
(
Links
.
payType
,
{
...
this
.
SDKCOMMDATA
,
...
roleInfo
});
}
return
!
code
;
public
async
userPhone
(
phoneInfo
,
callback
)
{
}
// 绑定手机
// 创建录屏对象
const
{
code
}
=
await
this
.
sdkRequest
(
Links
.
saveNum
,
{
public
createGameRecorder
=
(
startEventCallBack
?,
stopEventCallBack
?,
cpCallback
?)
=>
{
...
this
.
SDKCOMMDATA
,
try
{
open_id
:
this
.
LoginData
[
"open_id"
],
this
.
GameRecorder
=
(
wx
as
any
).
getGameRecorder
();
...
phoneInfo
,
if
(
!
this
.
GameRecorder
.
isFrameSupported
())
{
source
:
"WEIXIN"
,
if
(
cpCallback
)
cpCallback
({
status
:
0
,
msg
:
'设备不支持录屏功能.'
});
});
return
;
callback
(
code
);
}
}
this
.
GameRecorder
.
on
(
'start'
,
()
=>
{
public
async
checkUserPhoneBind
()
{
if
(
startEventCallBack
)
startEventCallBack
();
// 查询用户绑定状态
});
const
{
code
}
=
await
this
.
sdkRequest
(
Links
.
bindPhone
,
{
this
.
GameRecorder
.
on
(
'stop'
,
(
res
)
=>
{
...
this
.
SDKCOMMDATA
,
console
.
log
(
'--对局回放时长:'
,
res
.
duration
);
uid
:
this
.
LoginData
[
"uid"
],
if
(
stopEventCallBack
)
stopEventCallBack
(
res
);
});
})
return
!
code
;
if
(
cpCallback
)
cpCallback
({
status
:
1
,
msg
:
null
})
}
}
catch
(
err
)
{
public
async
getUserPaymentType
(
roleInfo
)
{
console
.
log
(
"--录屏异常:"
,
err
);
// 是否支持切支付
if
(
cpCallback
)
cpCallback
({
status
:
0
,
msg
:
err
})
let
{
code
}
=
await
this
.
sdkRequest
(
Links
.
payType
,
{
}
...
this
.
SDKCOMMDATA
,
}
...
roleInfo
,
public
startGameRecorder
(
recorderInfo
:
RecorderInfo
)
{
});
try
{
return
!
code
;
this
.
GameRecorder
.
start
({
}
duration
:
recorderInfo
.
duration
// 创建录屏对象
});
public
createGameRecorder
=
(
startEventCallBack
?,
stopEventCallBack
?,
cpCallback
?)
=>
{
}
catch
(
err
)
{
try
{
console
.
log
(
"$$SDK录屏异常::gameRecorder"
,
err
);
this
.
GameRecorder
=
(
wx
as
any
).
getGameRecorder
();
}
if
(
!
this
.
GameRecorder
.
isFrameSupported
())
{
}
if
(
cpCallback
)
cpCallback
({
status
:
0
,
msg
:
"设备不支持录屏功能."
});
public
stopGameRecorder
(
shareInfo
)
{
return
;
try
{
}
this
.
GameRecorder
.
stop
();
this
.
GameRecorder
.
on
(
"start"
,
()
=>
{
if
(
this
.
recorderBtn
)
this
.
recorderBtn
.
show
();
if
(
startEventCallBack
)
startEventCallBack
();
else
this
.
createRecorderShareButton
(
shareInfo
);
});
}
catch
(
err
)
{
this
.
GameRecorder
.
on
(
"stop"
,
(
res
)
=>
{
console
.
log
(
"$$SDK录屏异常::gameRecorder"
,
err
);
console
.
log
(
"--对局回放时长:"
,
res
.
duration
);
}
if
(
stopEventCallBack
)
stopEventCallBack
(
res
);
}
});
private
createRecorderShareButton
(
shareInfo
)
{
if
(
cpCallback
)
cpCallback
({
status
:
1
,
msg
:
null
});
let
recorderShareInfo
=
{
}
catch
(
err
)
{
style
:
{
console
.
log
(
"--录屏异常:"
,
err
);
left
:
shareInfo
.
left
,
if
(
cpCallback
)
cpCallback
({
status
:
0
,
msg
:
err
});
top
:
shareInfo
.
top
,
}
height
:
shareInfo
.
height
,
};
iconMarginRight
:
shareInfo
.
iconMarginRight
,
public
startGameRecorder
(
recorderInfo
:
RecorderInfo
)
{
fontSize
:
shareInfo
.
fontSize
,
try
{
color
:
shareInfo
.
color
,
this
.
GameRecorder
.
start
({
paddingLeft
:
shareInfo
.
paddingLeft
,
duration
:
recorderInfo
.
duration
,
paddingRight
:
shareInfo
.
paddingRight
});
},
}
catch
(
err
)
{
icon
:
shareInfo
.
icon
||
''
,
console
.
log
(
"$$SDK录屏异常::gameRecorder"
,
err
);
image
:
shareInfo
.
image
||
''
,
}
text
:
shareInfo
.
text
||
''
,
}
share
:
{
public
stopGameRecorder
=
(
shareInfo
)
=>
{
query
:
'fromOpenId='
+
this
.
LoginData
[
'open_id'
]
+
'&from=share&tag=0&'
+
(
shareInfo
.
query
?
shareInfo
.
query
:
''
),
try
{
bgm
:
shareInfo
.
bgm
,
this
.
GameRecorder
.
stop
();
timeRange
:
shareInfo
.
timeRange
if
(
this
.
recorderBtn
)
this
.
recorderBtn
.
show
();
}
else
this
.
createRecorderShareButton
(
shareInfo
);
};
}
catch
(
err
)
{
this
.
recorderBtn
=
(
wx
as
any
).
createGameRecorderShareButton
(
recorderShareInfo
);
console
.
log
(
"$$SDK录屏异常::gameRecorder"
,
err
);
// 当分享出现异常时才会触发点击回调
}
this
.
recorderBtn
.
onTap
(
res
=>
{
};
console
.
log
(
'--录屏异常:'
,
res
);
private
createRecorderShareButton
=
(
shareInfo
)
=>
{
});
let
recorderShareInfo
=
{
}
style
:
{
public
hideGameRecorderShareButton
()
{
left
:
shareInfo
.
left
,
if
(
this
.
recorderBtn
)
this
.
recorderBtn
.
hide
();
top
:
shareInfo
.
top
,
}
height
:
shareInfo
.
height
,
public
async
checkUserAdvised
()
{
// 防沉迷验证
iconMarginRight
:
shareInfo
.
iconMarginRight
,
let
time
=
this
.
onlineTime
*
60
;
// 转成成秒
fontSize
:
shareInfo
.
fontSize
,
return
new
Promise
((
resolve
,
reject
)
=>
{
color
:
shareInfo
.
color
,
(
wx
as
any
).
checkIsUserAdvisedToRest
({
paddingLeft
:
shareInfo
.
paddingLeft
,
todayPlayedTime
:
time
,
paddingRight
:
shareInfo
.
paddingRight
,
success
:
function
(
res
)
{
},
resolve
(
res
.
result
);
// 是否建议用户休息
icon
:
shareInfo
.
icon
||
""
,
},
image
:
shareInfo
.
image
||
""
,
fail
:
function
(
res
)
{
text
:
shareInfo
.
text
||
""
,
reject
(
res
);
share
:
{
},
query
:
"fromOpenId="
+
this
.
LoginData
[
"open_id"
]
+
"&from=share&tag=0&"
+
(
shareInfo
.
query
?
shareInfo
.
query
:
""
),
})
bgm
:
shareInfo
.
bgm
,
});
timeRange
:
shareInfo
.
timeRange
,
}
},
// 获取用户信息
};
public
getUserInfo
=
async
()
=>
{
this
.
recorderBtn
=
(
wx
as
any
).
createGameRecorderShareButton
(
recorderShareInfo
);
let
status
=
await
this
.
_getSetting
();
// 当分享出现异常时才会触发点击回调
if
(
status
==
1
)
{
this
.
recorderBtn
.
onTap
((
res
)
=>
{
// 用户已授权,可以直接调用相关 API
console
.
log
(
"--录屏异常:"
,
res
);
let
userInfo
=
await
this
.
_getUserInfo
();
});
// 上报用户授权
};
this
.
ReportData
({
public
hideGameRecorderShareButton
=
()
=>
{
userInfo
:
{
...
userInfo
,
nickName
:
encodeURI
(
userInfo
.
nickName
)
},
if
(
this
.
recorderBtn
)
this
.
recorderBtn
.
hide
();
action
:
'authorize'
,
};
})
public
checkUserAdvised
=
async
()
=>
{
return
userInfo
;
// 防沉迷验证
}
let
time
=
this
.
onlineTime
*
60
;
// 转成成秒
else
if
(
status
==
0
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
// 用户已拒绝授权,再调用相关 API 或者 wx.authorize 会失败,需要引导用户到设置页面打开授权开关
(
wx
as
any
).
checkIsUserAdvisedToRest
({
const
w
=
(
wx
as
any
).
getSystemInfoSync
().
windowWidth
;
todayPlayedTime
:
time
,
const
h
=
(
wx
as
any
).
getSystemInfoSync
().
windowHeight
;
success
:
function
(
res
)
{
let
OpenSettingButton
=
(
wx
as
any
).
createOpenSettingButton
({
resolve
(
res
.
result
);
// 是否建议用户休息
type
:
"text"
,
},
text
:
""
,
fail
:
function
(
res
)
{
style
:
{
reject
(
res
);
left
:
0
,
},
top
:
0
,
});
width
:
w
,
});
height
:
h
};
}
// 获取用户信息
});
public
getUserInfo
=
async
()
=>
{
OpenSettingButton
.
onTap
(
async
(
res
)
=>
{
// 用户已授权,可以直接调用相关 API
let
t_status
=
await
this
.
_getSetting
();
let
userInfo
:
any
=
await
this
.
_getUserInfo
();
console
.
log
(
"--SDK点击设置按钮返回t_status="
,
t_status
);
if
(
userInfo
.
nickName
)
{
if
(
t_status
==
1
)
{
// 上报用户授权
OpenSettingButton
.
offTap
(
this
);
this
.
ReportData
({
OpenSettingButton
.
destroy
();
userInfo
:
{
OpenSettingButton
=
null
;
...
userInfo
,
let
userInfo
=
await
this
.
_getUserInfo
();
nickName
:
encodeURI
(
userInfo
.
nickName
),
// 上报用户授权
},
this
.
ReportData
({
action
:
"authorize"
,
...
userInfo
,
});
action
:
'authorize'
,
}
nickName
:
encodeURI
(
userInfo
.
nickName
)
return
userInfo
;
})
};
return
userInfo
;
private
_getUserInfo
=
async
():
Promise
<
any
>
=>
{
}
return
new
Promise
(
async
function
(
resolve
,
reject
)
{
});
(
wx
as
any
).
getUserProfile
({
}
lang
:
"zh_CN"
,
else
if
(
status
==
-
1
)
{
desc
:
"完善个人资料"
,
let
userBtn
=
this
.
createUserInfoButton
();
success
:
(
res
)
=>
{
userBtn
.
onTap
((
res
)
=>
{
let
userInfo
=
res
[
"userInfo"
];
if
(
res
.
userInfo
)
{
resolve
(
userInfo
);
//上报授权
},
userBtn
.
offTap
(
this
);
fail
:
(
res
:
any
)
=>
{
userBtn
.
destroy
();
resolve
({});
userBtn
=
null
;
},
let
userInfo
=
res
[
"userInfo"
];
});
// 上报用户授权
});
this
.
ReportData
({
};
...
userInfo
,
public
addShareEvent
=
(
shareInfo
:
shareInfo
,
callback
?)
=>
{
action
:
'authorize'
,
(
wx
as
any
).
onShareAppMessage
(()
=>
{
nickName
:
encodeURI
(
userInfo
.
nickName
)
if
(
callback
)
callback
();
})
const
ShareParams
=
{
return
userInfo
;
title
:
shareInfo
.
title
?
shareInfo
.
title
:
SDKConfig
.
shareTitle
,
}
imageUrl
:
shareInfo
.
image
?
shareInfo
.
image
:
SDKConfig
.
shareImageUrl
,
});
imageUrlId
:
shareInfo
.
imageId
?
shareInfo
.
imageId
:
SDKConfig
.
shareImageId
,
}
query
:
"fromOpenId="
+
this
.
LoginData
[
"open_id"
]
+
"&from=share&tag=0&"
+
(
shareInfo
.
query
?
shareInfo
.
query
:
""
),
}
withShareTicket
:
true
,
private
createUserInfoButton
()
{
};
// 未询问过用户授权,调用相关 API 或者 wx.authorize 会弹窗询问用户
return
ShareParams
;
let
w
=
(
wx
as
any
).
getSystemInfoSync
().
windowWidth
;
});
let
h
=
(
wx
as
any
).
getSystemInfoSync
().
windowHeight
;
(
wx
as
any
).
showShareMenu
({
withShareTicket
:
true
});
let
userBtn
=
(
wx
as
any
).
createUserInfoButton
({
};
type
:
"text"
,
// 暂时恢复,稍后删除
text
:
""
,
public
ShareApp
=
(
params
?:
string
)
=>
{
withCredentials
:
false
,
const
ShareParams
=
{
style
:
{
title
:
SDKConfig
.
shareTitle
,
left
:
0
,
imageUrl
:
SDKConfig
.
shareImageUrl
,
top
:
0
,
imageId
:
SDKConfig
.
shareImageId
,
width
:
w
,
query
:
"fromOpenId="
+
this
.
LoginData
[
"open_id"
]
+
"&from=share&tag=0&"
+
(
params
?
params
:
""
),
height
:
h
};
},
return
this
.
share
(
ShareParams
);
});
};
return
userBtn
public
ShareGameInfo
=
(
shareInfo
?)
=>
{
}
// 参数,记录分享的用户openid
private
async
_getUserInfo
():
Promise
<
any
>
{
const
ShareParams
=
{
return
new
Promise
(
async
function
(
resolve
,
reject
)
{
title
:
shareInfo
&&
shareInfo
.
title
?
shareInfo
.
title
:
SDKConfig
.
shareTitle
,
(
wx
as
any
).
getUserInfo
({
imageUrl
:
shareInfo
&&
shareInfo
.
image
?
shareInfo
.
image
:
SDKConfig
.
shareImageUrl
,
withCredentials
:
false
,
//获取用户信息,withCredentials 为 true 时需要先调用 wx.login 接口。需要用户授权 scope.userInfo。
imageId
:
shareInfo
&&
shareInfo
.
imageId
?
shareInfo
.
imageId
:
SDKConfig
.
shareImageId
,
success
:
(
res
)
=>
{
query
:
"fromOpenId="
+
this
.
LoginData
[
"open_id"
]
+
"&from=share&tag=0&"
+
(
shareInfo
.
extraData
?
shareInfo
.
extraData
:
""
),
let
userInfo
=
res
[
"userInfo"
];
};
resolve
(
userInfo
);
return
this
.
share
(
ShareParams
);
},
};
fail
:
(
res
:
any
)
=>
{
private
share
=
(
DATA
):
Promise
<
any
>
=>
{
console
.
log
(
"--SDK:玩家头像等数据失败,用户未授权"
);
return
new
Promise
((
resolve
,
reject
)
=>
{
reject
();
(
wx
as
any
).
shareAppMessage
({
}
...
DATA
,
});
withShareTicket
:
true
,
});
success
:
(
res
)
=>
{
}
resolve
(
1
);
private
async
_getSetting
():
Promise
<
any
>
{
},
return
new
Promise
(
async
function
(
resolve
,
reject
)
{
fail
:
(
res
)
=>
{
(
wx
as
any
).
getSetting
({
resolve
(
-
1
);
success
:
function
(
res
)
{
},
let
authSetting
=
res
.
authSetting
;
});
if
(
authSetting
[
'scope.userInfo'
]
===
true
)
{
setTimeout
(
function
()
{
resolve
(
1
);
// 两秒后直接当分享成功返回
}
resolve
(
2
);
else
if
(
authSetting
[
'scope.userInfo'
]
===
false
)
{
},
3000
);
resolve
(
0
);
});
}
};
else
{
// 切换游戏
resolve
(
-
1
);
public
navToOtherGame
=
(
params
)
=>
{
}
const
obj
=
{
},
// 跳转参数
fail
:
function
()
{
appId
:
params
.
appid
,
// 跳转的小程序appid
reject
();
path
:
""
,
// 跳转到首页
},
envVersion
:
SDKConfig
.
navPayEnv
,
//跳转方式
});
extraData
:
{
});
from_openid
:
this
.
LoginData
[
"open_id"
],
}
from_product
:
SDKConfig
.
productCode
,
public
addShareEvent
=
(
shareInfo
:
shareInfo
,
callback
?)
=>
{
from_uid
:
this
.
LoginData
[
"uid"
],
(
wx
as
any
).
onShareAppMessage
(()
=>
{
},
if
(
callback
)
callback
();
};
const
ShareParams
=
{
this
.
navigateToMiniProgram
(
obj
);
title
:
shareInfo
.
title
?
shareInfo
.
title
:
SDKConfig
.
shareTitle
,
};
imageUrl
:
shareInfo
.
image
?
shareInfo
.
image
:
SDKConfig
.
shareImageUrl
,
private
navigateToMiniProgram
=
(
params
)
=>
{
imageUrlId
:
shareInfo
.
imageId
?
shareInfo
.
imageId
:
SDKConfig
.
shareImageId
,
if
(
this
.
SystemInfo
[
"sdkVersion"
]
<
"2.2"
)
{
query
:
'fromOpenId='
+
this
.
LoginData
[
'open_id'
]
+
'&from=share&tag=0&'
+
(
shareInfo
.
query
?
shareInfo
.
query
:
''
),
this
.
showMsg
(
"微信版本不兼容,请升级.."
);
withShareTicket
:
true
,
}
else
{
};
(
wx
as
any
).
navigateToMiniProgram
(
params
);
return
ShareParams
;
}
});
};
(
wx
as
any
).
showShareMenu
({
withShareTicket
:
true
})
// 客服
}
public
Customer
=
(
_orderInfo
?)
=>
{
// 暂时恢复,稍后删除
try
{
public
ShareApp
(
params
?:
string
)
{
(
wx
as
any
).
openCustomerServiceConversation
(
_orderInfo
);
const
ShareParams
=
{
}
catch
(
err
)
{
title
:
SDKConfig
.
shareTitle
,
console
.
log
(
"访问客服异常-->"
,
err
);
imageUrl
:
SDKConfig
.
shareImageUrl
,
this
.
showMsg
(
"打开客服链接失败."
);
imageId
:
SDKConfig
.
shareImageId
,
}
query
:
'fromOpenId='
+
this
.
LoginData
[
'open_id'
]
+
'&from=share&tag=0&'
+
(
params
?
params
:
''
)
};
}
public
ActiReport
=
()
=>
{
return
this
.
share
(
ShareParams
)
this
.
ReportData
({
action
:
"activation"
});
}
this
.
heartBeatReport
();
public
ShareGameInfo
=
(
shareInfo
?)
=>
{
};
// 上报激活
// 参数,记录分享的用户openid
public
RegisterReport
=
()
=>
{
const
ShareParams
=
{
this
.
ReportData
({
action
:
"register"
});
title
:
shareInfo
&&
shareInfo
.
title
?
shareInfo
.
title
:
SDKConfig
.
shareTitle
,
};
// 上报注册
imageUrl
:
shareInfo
&&
shareInfo
.
image
?
shareInfo
.
image
:
SDKConfig
.
shareImageUrl
,
public
LoginReport
=
()
=>
{
imageId
:
shareInfo
&&
shareInfo
.
imageId
?
shareInfo
.
imageId
:
SDKConfig
.
shareImageId
,
this
.
ReportData
({
action
:
"login"
});
query
:
'fromOpenId='
+
this
.
LoginData
[
'open_id'
]
+
'&from=share&tag=0&'
+
(
shareInfo
.
extraData
?
shareInfo
.
extraData
:
''
)
};
// 上报登录
}
public
RoleLevelReport
=
(
roleInfo
)
=>
{
return
this
.
share
(
ShareParams
)
this
.
ReportData
({
...
roleInfo
,
action
:
"roleUpgrade"
});
}
};
// 上报等级
private
share
=
(
DATA
):
Promise
<
any
>
=>
{
public
CustomReport
=
(
custInfo
)
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
this
.
ReportData
({
...
custInfo
,
action
:
"customevent"
});
(
wx
as
any
).
shareAppMessage
({
};
// 自定义上报
...
DATA
,
public
userClickEvent
=
()
=>
{
withShareTicket
:
true
,
this
.
clickCounter
++
;
success
:
res
=>
{
};
resolve
(
1
);
private
heartBeatReport
=
()
=>
{
},
setTimeout
(()
=>
{
fail
:
res
=>
{
this
.
clickReport
();
resolve
(
-
1
);
this
.
heartBeatReport
();
},
},
60
*
1000
);
})
};
setTimeout
(
function
()
{
// 两秒后直接当分享成功返回
private
clickReport
=
async
()
=>
{
resolve
(
2
)
this
.
ReportData
({
action
:
"heartBeat"
});
},
3000
)
this
.
clickCounter
>
0
&&
})
this
.
ReportData
({
}
action
:
"userappclick"
,
// 切换游戏
click_times
:
this
.
clickCounter
,
public
navToOtherGame
=
(
params
)
=>
{
});
const
obj
=
{
// 跳转参数
this
.
clickCounter
=
0
;
// 上报后归零
appId
:
params
.
appid
,
// 跳转的小程序appid
};
path
:
''
,
// 跳转到首页
// 上报支付异常
envVersion
:
SDKConfig
.
navPayEnv
,
//跳转方式
private
reportPaymentError
=
(
err
:
Object
)
=>
{
extraData
:
{
let
portData
=
{
from_openid
:
this
.
LoginData
[
'open_id'
],
...
this
.
SDKCOMMDATA
,
from_product
:
SDKConfig
.
productCode
,
uid
:
this
.
LoginData
[
"uid"
],
from_uid
:
this
.
LoginData
[
'uid'
]
event_code
:
"PaymentError"
,
}
event_data
:
JSON
.
stringify
(
err
),
}
};
this
.
navigateToMiniProgram
(
obj
);
this
.
sdkRequest
(
Links
.
paymentErrorReport
,
portData
,
"POST"
);
}
};
private
navigateToMiniProgram
=
(
params
)
=>
{
// 数据上报接口,外部调用,参数中必须含有action值
if
(
this
.
SystemInfo
[
'sdkVersion'
]
<
'2.2'
)
{
public
ReportData
=
(
portData
)
=>
{
this
.
showMsg
(
'微信版本不兼容,请升级..'
)
portData
[
"launchOptions"
]
=
this
.
LaunchOptions
;
}
else
{
portData
[
"userInfo"
]
=
{
(
wx
as
any
).
navigateToMiniProgram
(
params
)
...
portData
[
"userInfo"
],
}
...{
}
userId
:
this
.
LoginData
[
"uid"
]
||
""
,
// 客服
open_id
:
this
.
LoginData
[
"open_id"
],
public
Customer
=
(
_orderInfo
?)
=>
{
},
try
{
};
(
wx
as
any
).
openCustomerServiceConversation
(
_orderInfo
)
portData
[
"systemInfo"
]
=
this
.
SystemInfo
;
}
catch
(
err
)
{
portData
[
"product_code"
]
=
SDKConfig
.
productCode
;
console
.
log
(
"访问客服异常-->"
,
err
)
portData
[
"time"
]
=
Date
.
parse
(
new
Date
().
toString
());
// 获取当前时间戳秒
this
.
showMsg
(
'打开客服链接失败.'
)
console
.
log
(
"--SDK上报:"
,
portData
);
}
this
.
request
(
SDKConfig
.
report
,
portData
,
"POST"
);
}
};
public
ActiReport
()
{
// 退出小游戏
this
.
ReportData
({
action
:
'activation'
});
public
exitApp
=
()
=>
{
this
.
heartBeatReport
();
(
wx
as
any
).
exitMiniProgram
();
}
// 上报激活
};
public
RegisterReport
()
{
this
.
ReportData
({
action
:
'register'
})
}
// 上报注册
private
getWechatCode
=
():
Promise
<
any
>
=>
{
public
LoginReport
()
{
this
.
ReportData
({
action
:
'login'
})
}
// 上报登录
return
new
Promise
((
resolve
,
reject
)
=>
{
public
RoleLevelReport
(
roleInfo
)
{
this
.
ReportData
({
...
roleInfo
,
action
:
'roleUpgrade'
})
}
// 上报等级
try
{
public
CustomReport
(
custInfo
)
{
this
.
ReportData
({
...
custInfo
,
action
:
'customevent'
})
}
// 自定义上报
(
wx
as
any
).
login
({
public
userClickEvent
()
{
this
.
clickCounter
++
}
success
:
(
res
)
=>
{
private
heartBeatReport
()
{
if
(
res
.
code
)
resolve
(
res
);
setTimeout
(()
=>
{
else
{
this
.
clickReport
();
this
.
showMsg
(
"执行wx.login返回成功,但无code参数"
,
5000
);
this
.
heartBeatReport
();
resolve
({
code
:
0
});
},
60
*
1000
);
}
}
},
private
clickReport
=
async
()
=>
{
fail
:
()
=>
{
this
.
ReportData
({
action
:
'heartBeat'
})
this
.
showMsg
(
"执行wx.login返回失败"
,
5000
);
this
.
clickCounter
>
0
&&
this
.
ReportData
({
action
:
'userappclick'
,
click_times
:
this
.
clickCounter
});
resolve
({
code
:
0
});
this
.
clickCounter
=
0
;
// 上报后归零
},
}
});
// 上报支付异常
}
catch
(
err
)
{
private
reportPaymentError
(
err
:
Object
)
{
this
.
showMsg
(
"微信登录接口返回失败"
);
let
portData
=
{
}
...
this
.
SDKCOMMDATA
,
});
uid
:
this
.
LoginData
[
'uid'
],
};
event_code
:
'PaymentError'
,
event_data
:
JSON
.
stringify
(
err
),
private
showLoading
=
()
=>
{
}
(
wx
as
any
).
showLoading
({
this
.
sdkRequest
(
Links
.
paymentErrorReport
,
portData
,
'POST'
);
title
:
"请稍候.."
,
}
mask
:
true
,
// 数据上报接口,外部调用,参数中必须含有action值
});
public
ReportData
(
portData
)
{
};
portData
[
'launchOptions'
]
=
this
.
LaunchOptions
;
private
hideLoading
=
()
=>
{
portData
[
'userInfo'
]
=
{
...
portData
[
'userInfo'
],
...{
userId
:
this
.
LoginData
[
'uid'
]
||
''
,
open_id
:
this
.
LoginData
[
'open_id'
]
}
};
(
wx
as
any
).
hideLoading
();
portData
[
'systemInfo'
]
=
this
.
SystemInfo
;
};
portData
[
'product_code'
]
=
SDKConfig
.
productCode
;
private
showModal
=
(
DATA
)
=>
{
portData
[
'time'
]
=
Date
.
parse
(
new
Date
().
toString
())
// 获取当前时间戳秒
(
wx
as
any
).
showModal
({
console
.
log
(
'--SDK上报:'
,
portData
);
...
DATA
,
this
.
request
(
SDKConfig
.
report
,
portData
,
'POST'
)
cancelText
:
"取消"
,
}
confirmText
:
"确认"
,
// 退出小游戏
});
public
exitApp
=
()
=>
{
};
(
wx
as
any
).
exitMiniProgram
()
public
showMsg
=
(
str
,
duration
=
3000
)
=>
{
}
(
wx
as
any
).
showToast
({
private
getWechatCode
=
():
Promise
<
any
>
=>
{
title
:
str
,
return
new
Promise
((
resolve
,
reject
)
=>
{
icon
:
"none"
,
try
{
duration
:
duration
,
(
wx
as
any
).
login
({
});
success
:
(
res
)
=>
{
};
if
(
res
.
code
)
resolve
(
res
);
private
getSystemInfo
=
():
Promise
<
any
>
=>
{
else
{
return
new
Promise
((
resolve
,
reject
)
=>
{
this
.
showMsg
(
"执行wx.login返回成功,但无code参数"
,
5000
);
(
wx
as
any
).
getSystemInfo
({
resolve
({
code
:
0
});
success
:
(
res
)
=>
{
}
resolve
(
res
);
},
},
fail
:
()
=>
{
});
this
.
showMsg
(
"执行wx.login返回失败"
,
5000
);
});
resolve
({
code
:
0
});
};
},
public
getNetworkType
=
():
Promise
<
any
>
=>
{
});
return
new
Promise
((
resolve
,
reject
)
=>
{
}
catch
(
err
)
{
(
wx
as
any
).
getNetworkType
({
this
.
showMsg
(
"微信登录接口返回失败"
);
success
:
(
res
)
=>
{
}
resolve
(
res
.
networkType
);
});
},
}
});
private
showLoading
()
{
});
(
wx
as
any
).
showLoading
({
};
title
:
'请稍候..'
,
public
getOptionsInfo
=
()
=>
{
mask
:
true
const
options
=
(
wx
as
any
).
getLaunchOptionsSync
();
})
console
.
log
(
"--启动参数--->"
,
options
);
}
if
(
options
.
query
&&
Object
.
keys
(
options
.
query
).
length
>
0
)
{
private
hideLoading
()
{
(
wx
as
any
).
hideLoading
()
}
if
(
options
.
query
.
scene
)
{
private
showModal
(
DATA
)
{
// 扫码参数
(
wx
as
any
).
showModal
({
const
scene
=
this
.
toJson
(
decodeURIComponent
(
options
.
query
.
scene
));
...
DATA
,
return
scene
;
cancelText
:
'取消'
,
}
else
return
{
...
options
.
query
,
scene
:
options
.
scene
||
""
};
// 普通url参数
confirmText
:
'确认'
}
else
if
(
options
.
referrerInfo
&&
options
.
referrerInfo
.
appId
)
{
})
return
{
}
...
options
.
referrerInfo
.
extraData
,
public
showMsg
=
(
str
,
duration
=
3000
)
=>
{
scene
:
options
.
scene
||
""
,
(
wx
as
any
).
showToast
({
appId
:
options
.
referrerInfo
.
appId
,
title
:
str
,
};
// 小程序跳转附带参数
icon
:
'none'
,
}
else
return
{};
duration
:
duration
};
})
// SDK上报接口
}
private
sdkRequest
=
async
(
link
:
string
,
portData
,
method
?)
=>
{
private
getSystemInfo
=
():
Promise
<
any
>
=>
{
portData
=
this
.
md5_sign
(
portData
);
// 附上签名参数
return
new
Promise
((
resolve
,
reject
)
=>
{
console
.
log
(
"--SDK接口:"
,
portData
);
(
wx
as
any
).
getSystemInfo
({
return
await
this
.
request
(
link
,
portData
,
method
);
success
:
(
res
)
=>
{
resolve
(
res
)
},
};
})
// 调用微信请求接口
})
private
request
=
async
(
URI
:
string
,
Params
:
any
,
Method
=
"GET"
)
=>
{
}
const
{
code
,
data
,
msg
}
=
await
this
.
fetchUri
(
URI
,
Params
,
Method
);
public
getNetworkType
=
():
Promise
<
any
>
=>
{
if
(
!
data
)
return
{
code
,
data
:
{},
msg
};
return
new
Promise
((
resolve
,
reject
)
=>
{
if
(
!
code
)
return
{
code
,
data
,
msg
};
(
wx
as
any
).
getNetworkType
({
if
(
code
)
this
.
showMsg
(
msg
);
// 输出接口异常
success
:
(
res
)
=>
{
resolve
(
res
.
networkType
)
},
};
})
private
fetchUri
=
(
URI
,
DATA
,
METHOD
):
Promise
<
any
>
=>
{
})
return
new
Promise
((
resolve
,
reject
)
=>
{
}
try
{
public
getOptionsInfo
=
()
=>
{
(
wx
as
any
).
request
({
const
options
=
(
wx
as
any
).
getLaunchOptionsSync
()
url
:
URI
,
console
.
log
(
"--启动参数--->"
,
options
);
method
:
METHOD
,
if
(
options
.
query
&&
Object
.
keys
(
options
.
query
).
length
>
0
)
{
data
:
DATA
,
if
(
options
.
query
.
scene
)
{
// 扫码参数
header
:
{
const
scene
=
this
.
toJson
(
decodeURIComponent
(
options
.
query
.
scene
));
"Content-Type"
:
"json"
,
return
scene
;
},
}
else
return
{
...
options
.
query
,
scene
:
options
.
scene
||
''
};
// 普通url参数
success
:
(
response
)
=>
{
}
else
if
(
options
.
referrerInfo
&&
options
.
referrerInfo
.
appId
)
{
resolve
(
response
.
data
);
return
{
...
options
.
referrerInfo
.
extraData
,
scene
:
options
.
scene
||
''
,
appId
:
options
.
referrerInfo
.
appId
}
// 小程序跳转附带参数
},
}
else
return
{}
fail
:
resolve
,
}
});
// SDK上报接口
}
catch
(
err
)
{
private
sdkRequest
=
async
(
link
:
string
,
portData
,
method
?)
=>
{
reject
(
err
);
portData
=
this
.
md5_sign
(
portData
)
// 附上签名参数
}
console
.
log
(
'--SDK接口:'
,
portData
);
});
return
await
this
.
request
(
link
,
portData
,
method
);
};
}
//把字符串转换成json
// 调用微信请求接口
private
toJson
=
(
str
:
string
)
=>
{
private
request
=
async
(
URI
:
string
,
Params
:
any
,
Method
=
'GET'
)
=>
{
let
json
=
{};
const
{
code
,
data
,
msg
}
=
await
this
.
fetchUri
(
URI
,
Params
,
Method
);
const
jsonArr
=
str
.
split
(
"&"
);
if
(
!
data
)
return
{
code
,
data
:
{},
msg
}
for
(
let
i
=
0
;
i
<
jsonArr
.
length
;
i
++
)
{
if
(
!
code
)
return
{
code
,
data
,
msg
};
const
keyArr
=
jsonArr
[
i
].
split
(
"="
);
if
(
code
)
this
.
showMsg
(
msg
);
// 输出接口异常
json
[
keyArr
[
0
]]
=
keyArr
[
1
]
||
""
;
// 附上key和对应的value
}
}
private
fetchUri
=
(
URI
,
DATA
,
METHOD
):
Promise
<
any
>
=>
{
return
json
;
return
new
Promise
((
resolve
,
reject
)
=>
{
};
try
{
//接口签名,直接返回完整对象
(
wx
as
any
).
request
({
private
md5_sign
=
(
obj
)
=>
{
url
:
URI
,
obj
.
time
=
Date
.
parse
(
new
Date
().
toString
());
// 获取请求的时间戳秒
method
:
METHOD
,
let
keys
=
Object
.
keys
(
obj
).
sort
();
data
:
DATA
,
let
key_url
=
""
;
header
:
{
for
(
let
i
=
0
;
i
<
keys
.
length
;
i
++
)
{
'Content-Type'
:
'json'
if
(
keys
[
i
]
!=
"sign"
)
key_url
+=
keys
[
i
]
+
"="
+
obj
[
keys
[
i
]]
+
"&"
;
},
}
success
:
(
response
)
=>
{
key_url
=
key_url
+
SDKConfig
.
productKey
;
resolve
(
response
.
data
)
obj
.
sign
=
md5encode
(
key_url
);
},
return
obj
;
fail
:
resolve
};
})
// SDK接口通用参数
}
catch
(
err
)
{
private
SDKCOMMDATA
:
Object
=
{
reject
(
err
)
source
:
"WEIXIN"
,
}
product_code
:
SDKConfig
.
productCode
,
})
uuid
:
""
,
}
equipmentos
:
""
,
//把字符串转换成json
package_code
:
""
,
private
toJson
=
(
str
:
string
)
=>
{
time
:
""
,
let
json
=
{}
sign
:
""
,
const
jsonArr
=
str
.
split
(
'&'
)
os
:
""
,
for
(
let
i
=
0
;
i
<
jsonArr
.
length
;
i
++
)
{
version
:
this
.
sdkVersion
,
const
keyArr
=
jsonArr
[
i
].
split
(
'='
)
};
json
[
keyArr
[
0
]]
=
keyArr
[
1
]
||
''
// 附上key和对应的value
// 米大师支付参数
}
private
MidasPaymentParams
=
{
return
json
mode
:
"game"
,
// 支付的类型
}
env
:
SDKConfig
.
midasPayEnv
,
// 米大师环境
//接口签名,直接返回完整对象
currencyType
:
"CNY"
,
// 币种
private
md5_sign
=
(
obj
)
=>
{
platform
:
"android"
,
// 客户端平台
obj
.
time
=
Date
.
parse
(
new
Date
().
toString
())
// 获取请求的时间戳秒
zoneId
:
"1"
,
// 分区ID,默认1
let
keys
=
Object
.
keys
(
obj
).
sort
();
offerId
:
SDKConfig
.
offerid
,
let
key_url
=
""
;
};
for
(
let
i
=
0
;
i
<
keys
.
length
;
i
++
)
{
private
MidasErrorCode
=
{
if
(
keys
[
i
]
!=
'sign'
)
key_url
+=
keys
[
i
]
+
'='
+
obj
[
keys
[
i
]]
+
'&'
"-1"
:
"系统失败"
,
}
"-2"
:
"支付取消"
,
key_url
=
key_url
+
SDKConfig
.
productKey
"-15001"
:
"缺少参数"
,
obj
.
sign
=
md5
(
key_url
)
"-15002"
:
"参数不合法"
,
return
obj
"-15003"
:
"订单重复"
,
}
"-15004"
:
"后台错误"
,
// SDK接口通用参数
"-15005"
:
"appId权限被封禁"
,
private
SDKCOMMDATA
:
Object
=
{
"-15006"
:
"货币类型不支持"
,
source
:
'WEIXIN'
,
"-15007"
:
"订单已支付"
,
product_code
:
SDKConfig
.
productCode
,
"-15009"
:
"由于健康系统限制,本次支付已超过限额"
,
uuid
:
''
,
"1"
:
"用户取消支付"
,
equipmentos
:
''
,
"2"
:
"客户端错误,判断到小程序在用户处于支付中时,又发起了一笔支付请求"
,
package_code
:
''
,
"3"
:
"Android 独有错误:用户使用 Google Play 支付,而手机未安装 Google Play"
,
time
:
''
,
"4"
:
"用户操作系统支付状态异常"
,
sign
:
''
,
"5"
:
"操作系统错误"
,
os
:
''
,
"6"
:
"其他错误"
,
version
:
this
.
sdkVersion
"1000"
:
"参数错误"
,
}
"1003"
:
"米大师Portal错误"
,
// 米大师支付参数
};
private
MidasPaymentParams
=
{
mode
:
'game'
,
// 支付的类型
env
:
SDKConfig
.
midasPayEnv
,
// 米大师环境
currencyType
:
'CNY'
,
// 币种
platform
:
'android'
,
// 客户端平台
zoneId
:
'1'
,
// 分区ID,默认1
offerId
:
SDKConfig
.
offerid
,
}
private
MidasErrorCode
=
{
'-1'
:
'系统失败'
,
'-2'
:
'支付取消'
,
'-15001'
:
'缺少参数'
,
'-15002'
:
'参数不合法'
,
'-15003'
:
'订单重复'
,
'-15004'
:
'后台错误'
,
'-15005'
:
'appId权限被封禁'
,
'-15006'
:
'货币类型不支持'
,
'-15007'
:
'订单已支付'
,
'-15009'
:
'由于健康系统限制,本次支付已超过限额'
,
'1'
:
'用户取消支付'
,
'2'
:
'客户端错误,判断到小程序在用户处于支付中时,又发起了一笔支付请求'
,
'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加密
const
rotateLeft1
=
(
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
(
rotateLeft1
(
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
(
rotateLeft1
(
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
(
rotateLeft1
(
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
(
rotateLeft1
(
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
(
/
\x
0d
\x
0a/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
md5encode
(
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
();
}
}
// 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
(
/
\x
0d
\x
0a/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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论