|
|
@@ -182,7 +182,7 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
|
|
|
// 调用第三方鉴权API
|
|
|
const apiUrl = `https://api.11h5.com/login?cmd=checkUserToken&userToken=${encodeURIComponent(token)}&gameid=${gameid}`;
|
|
|
-
|
|
|
+
|
|
|
logger.info("调用iOS鉴权API:", { url: apiUrl });
|
|
|
|
|
|
const response = await axios.get(apiUrl, {
|
|
|
@@ -195,7 +195,7 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
|
|
|
// 根据错误码判断成功与否
|
|
|
const responseData = response.data;
|
|
|
-
|
|
|
+
|
|
|
if (responseData.error === 0) {
|
|
|
// 成功:error = 0
|
|
|
logger.info("iOS登录鉴权成功:", {
|
|
|
@@ -203,7 +203,7 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
nickname: responseData.nickname,
|
|
|
usertype: responseData.usertype
|
|
|
});
|
|
|
-
|
|
|
+
|
|
|
return {
|
|
|
code: 0,
|
|
|
msg: "登录成功",
|
|
|
@@ -260,12 +260,10 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
async handlePayment(ctx: Context, config: ChannelConfig): Promise<PaymentResult> {
|
|
|
try {
|
|
|
// 获取请求参数 - 支持GET和POST请求
|
|
|
- const queryParams = ctx.request.query as any;
|
|
|
- const bodyParams = ctx.request.body as any;
|
|
|
- const params = { ...queryParams, ...bodyParams }; // 合并query和body参数,body优先
|
|
|
+ const params = ctx.request.query as any;
|
|
|
+
|
|
|
+ const platform = params.platform || 'miniapp'; // 平台参数:ios、Android、miniapp、h5,默认为miniapp
|
|
|
|
|
|
- const platform = params.platform || 'miniapp'; // 平台参数:ios、Android、miniapp、ttminiapp、h5,默认为miniapp
|
|
|
-
|
|
|
logger.info("统一支付回调请求", { platform, url: ctx.href, params: params });
|
|
|
|
|
|
// 根据平台选择不同的支付处理方式和配置
|
|
|
@@ -361,7 +359,7 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
};
|
|
|
}
|
|
|
const orderInfo = validation.orderInfo;
|
|
|
-
|
|
|
+
|
|
|
logger.info("IOS订单校验成功,开始处理支付发货逻辑");
|
|
|
const result = await PaymentHelper.deliverOrder(
|
|
|
orderInfo,
|
|
|
@@ -631,7 +629,7 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
}
|
|
|
data['time'] = Math.floor(Date.now() / 1000); // 添加时间戳参数
|
|
|
data['gameid'] = config.paymentConfig.gameId; // 添加游戏ID参数
|
|
|
-
|
|
|
+
|
|
|
// 处理playerName的各种编码格式
|
|
|
let decodedPlayerName = data.playerName;
|
|
|
try {
|
|
|
@@ -653,18 +651,18 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
console.log("playerName decode error, using original:", error.message);
|
|
|
decodedPlayerName = data.playerName;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 更新data中的playerName为解码后的值
|
|
|
data.playerName = decodedPlayerName;
|
|
|
console.log("playerName for signature:", data.playerName);
|
|
|
-
|
|
|
+
|
|
|
//生成签名
|
|
|
data['sign'] = this.generateRoleInfoSignature(data, config);
|
|
|
-
|
|
|
+
|
|
|
// 构建请求参数 - 对playerName进行URL编码
|
|
|
const encodedPlayerName = encodeURIComponent(data.playerName);
|
|
|
console.log("playerName for request:", encodedPlayerName);
|
|
|
-
|
|
|
+
|
|
|
// 手动构建URL查询字符串,避免对已编码参数进行二次编码
|
|
|
const queryString = [
|
|
|
`openId=${encodeURIComponent(data.openId)}`,
|
|
|
@@ -674,7 +672,7 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
`playerName=${encodedPlayerName}`, // 已经编码过的playerName,不再编码
|
|
|
`sign=${encodeURIComponent(data.sign)}`
|
|
|
].join('&');
|
|
|
-
|
|
|
+
|
|
|
// 调用角色信息修改API
|
|
|
const apiUrl = `https://platform.${config.paymentConfig.apiUrl}/stat/api/?cmd=editUserRoleInfo&${queryString}`;
|
|
|
logger.info("调用角色信息修改API:", {url: apiUrl});
|
|
|
@@ -724,7 +722,7 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
try {
|
|
|
// 固定密钥
|
|
|
const secret = 'qka8qKcvRcGN1u0bLA8O';
|
|
|
-
|
|
|
+
|
|
|
// 准备签名参数
|
|
|
const signParams: any = {
|
|
|
gameId: data.gameid || config.paymentConfig.gameId,
|
|
|
@@ -734,25 +732,25 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
serverId: data.serverid,
|
|
|
time: data.time
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
// 按字典排序参数名
|
|
|
const sortedKeys = Object.keys(signParams).sort();
|
|
|
-
|
|
|
+
|
|
|
// 构建签名字符串(去掉[])
|
|
|
const signString = sortedKeys.map(key => {
|
|
|
return `${key}=${signParams[key]}`;
|
|
|
}).join('');
|
|
|
-
|
|
|
+
|
|
|
console.log("验证签名参数:", signParams);
|
|
|
console.log("验证签名字符串:", signString);
|
|
|
-
|
|
|
+
|
|
|
// 计算MD5签名
|
|
|
const expectedSignature = CryptoJS.MD5(signString).toString();
|
|
|
const actualSignature = data.sign;
|
|
|
-
|
|
|
+
|
|
|
console.log("期望签名:", expectedSignature);
|
|
|
console.log("实际签名:", actualSignature);
|
|
|
-
|
|
|
+
|
|
|
return expectedSignature === actualSignature;
|
|
|
} catch (error) {
|
|
|
logger.error("签名算法2验证出错:", error);
|
|
|
@@ -770,7 +768,7 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
try {
|
|
|
// 固定密钥
|
|
|
const secret = 'qka8qKcvRcGN1u0bLA8O';
|
|
|
-
|
|
|
+
|
|
|
// 准备签名参数
|
|
|
const signParams: any = {
|
|
|
gameid: params.gameid || config.paymentConfig.gameId,
|
|
|
@@ -780,23 +778,23 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
serverid: params.serverid,
|
|
|
time: params.time
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
// 按字典排序参数名
|
|
|
const sortedKeys = Object.keys(signParams).sort();
|
|
|
-
|
|
|
+
|
|
|
// 构建签名字符串(去掉[])
|
|
|
const signString = sortedKeys.map(key => {
|
|
|
return `${key}=${signParams[key]}`;
|
|
|
}).join('');
|
|
|
-
|
|
|
+
|
|
|
console.log("角色信息签名参数:", signParams);
|
|
|
console.log("角色信息签名字符串:", signString);
|
|
|
-
|
|
|
+
|
|
|
// 计算MD5签名
|
|
|
const signature = CryptoJS.MD5(signString).toString();
|
|
|
-
|
|
|
+
|
|
|
console.log("角色信息签名结果:", signature);
|
|
|
-
|
|
|
+
|
|
|
return signature;
|
|
|
} catch (error) {
|
|
|
logger.error("生成角色信息修改签名出错:", error);
|
|
|
@@ -1109,9 +1107,9 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
- logger.info("iOS订单校验响应", {
|
|
|
- status: response.status,
|
|
|
- data: response.data
|
|
|
+ logger.info("iOS订单校验响应", {
|
|
|
+ status: response.status,
|
|
|
+ data: response.data
|
|
|
});
|
|
|
|
|
|
if (response.status === 200) {
|
|
|
@@ -1119,27 +1117,27 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
// 处理纯文本"SUCCESS"响应
|
|
|
if (result === "SUCCESS") {
|
|
|
return { success: true, message: "订单校验成功" };
|
|
|
- }
|
|
|
+ }
|
|
|
// 处理JSON格式响应
|
|
|
else if (result && typeof result === 'object' && result.code === 0) {
|
|
|
return { success: true, message: "订单校验成功" };
|
|
|
} else {
|
|
|
- return {
|
|
|
- success: false,
|
|
|
- message: result?.msg || "订单校验失败"
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: result?.msg || "订单校验失败"
|
|
|
};
|
|
|
}
|
|
|
} else {
|
|
|
- return {
|
|
|
- success: false,
|
|
|
- message: `HTTP错误: ${response.status}`
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: `HTTP错误: ${response.status}`
|
|
|
};
|
|
|
}
|
|
|
} catch (error) {
|
|
|
logger.error("iOS订单校验出错:", error);
|
|
|
- return {
|
|
|
- success: false,
|
|
|
- message: error.message || "订单校验异常"
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: error.message || "订单校验异常"
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
@@ -1154,15 +1152,15 @@ export class MiniappChannelHandler implements ChannelHandler {
|
|
|
try {
|
|
|
// 构建签名字符串
|
|
|
const signString = parameters.join('&') + `&key=${signKey}`;
|
|
|
-
|
|
|
+
|
|
|
// 计算MD5签名并转为大写
|
|
|
const signature = CryptoJS.MD5(signString).toString().toUpperCase();
|
|
|
-
|
|
|
+
|
|
|
logger.info("生成iOS支付签名", {
|
|
|
signString,
|
|
|
signature
|
|
|
});
|
|
|
-
|
|
|
+
|
|
|
return signature;
|
|
|
} catch (error) {
|
|
|
logger.error("生成iOS支付签名出错:", error);
|