144 lines
4.6 KiB
TypeScript
144 lines
4.6 KiB
TypeScript
import cloud from '@lafjs/cloud'
|
||
import * as crypto from 'crypto';
|
||
const db = cloud.database();
|
||
const ThinkingData = require('thinkingdata-node');
|
||
export default async function (ctx: FunctionContext) {
|
||
let uid = ctx.body.uid;
|
||
let outTradeNo = ctx.body.outTradeNo;
|
||
let user = await db.collection("users").where({ _id: uid }).getOne();
|
||
if (user.data == null) {
|
||
return { code: 0, data: null, msg: "未获取到玩家数据" };
|
||
}
|
||
let res = await db.collection("order").where({ outTradeNo: outTradeNo }).getOne();
|
||
if (!res.data) {
|
||
return { code: 0, data: null, msg: "未获取到充值订单" };
|
||
}
|
||
if (res.data.openid !== user.data.openid) {
|
||
return { code: 0, data: null, msg: "充值订单不属于当前玩家" };
|
||
}
|
||
if (res.data.state == 1) {
|
||
return {
|
||
code: 1, data: {
|
||
pay_state: 2
|
||
}, msg: "成功"
|
||
};
|
||
} else if (res.data.state == 2) {
|
||
// Jungle 档位解锁成功后会直接完成订单;前端仍需把它识别为本次支付成功,
|
||
// 随后读取 jungleTreasure 状态并把付费按钮刷新为“领取”。
|
||
if (/^jungle_treasure_[1-8]$/.test(String(res.data.itemid || ""))) {
|
||
return {
|
||
code: 1, data: {
|
||
pay_state: 2
|
||
}, msg: "成功"
|
||
};
|
||
}
|
||
return {
|
||
code: 1, data: {
|
||
pay_state: 1,
|
||
}, msg: "已领取奖励"
|
||
}
|
||
} else {
|
||
return {
|
||
code: 0, data: {
|
||
pay_state: 1,
|
||
}, msg: "充值未成功"
|
||
}
|
||
};
|
||
}
|
||
const propName = {
|
||
"金币包1": "gold_1",
|
||
"金币包2": "gold_2",
|
||
"金币包3": "gold_3",
|
||
"金币包4": "gold_4",
|
||
"金币包5": "gold_5",
|
||
"金币包6": "gold_6",
|
||
"无限体力组合包1": "unlimited_health_bundle_1",
|
||
"无限体力组合包2": "unlimited_health_bundle_2",
|
||
"无限体力组合包3": "unlimited_health_bundle_3",
|
||
"局内购买冻结": "freeze_in_game",
|
||
"局内购买锤子": "hammer_in_game",
|
||
"局内购买魔棒": "wand_in_gamerefill",
|
||
"补满体力": "health",
|
||
"新手礼包": "starter_pack",
|
||
"宝藏1": "jungle_treasure_1",
|
||
"宝藏2": "jungle_treasure_2",
|
||
"宝藏3": "jungle_treasure_3",
|
||
"宝藏4": "jungle_treasure_4",
|
||
"宝藏5": "jungle_treasure_5",
|
||
"宝藏6": "jungle_treasure_6",
|
||
"宝藏7": "jungle_treasure_8"
|
||
};
|
||
function hmacSha256(sessionKey, signData) {
|
||
const hmac = crypto.createHmac('sha256', sessionKey);
|
||
hmac.update(signData);
|
||
return hmac.digest('hex');
|
||
}
|
||
const getClientIp = (req) => {
|
||
return (
|
||
req.headers['x-forwarded-for']?.split(',')[0]?.trim() || // 代理链中的第一个 IP
|
||
req.headers['x-real-ip'] || // Nginx 配置的 real-ip
|
||
req.socket.remoteAddress // 原始 IP(可能是代理)
|
||
);
|
||
};
|
||
async function sead(order, userInfo, ip) {
|
||
console.error("上传数数");
|
||
//db.collection("susu").add({order: order,time: Date.now()});
|
||
if (!userInfo.distinctId) {
|
||
console.log("未找到distinctId无法上传数数")
|
||
return;
|
||
}
|
||
let id = '95993f9ab6f1402a87abe5147827e5e0';
|
||
if (userInfo.isDebug != "true") {
|
||
id = '40e3d5c5f2af49a4a074205564ce5dbb';
|
||
}
|
||
let teSDK = ThinkingData.initWithBatchMode(id, 'https://data.nika4fun.com/sync_data', {
|
||
dryRun: false, // report data to TE or not
|
||
deviceId: "123456789",//设备唯一标识
|
||
});
|
||
let trackEvent = {
|
||
accountId: order.openid,
|
||
distinctId: userInfo.distinctId,//访客id
|
||
event: 'payment',
|
||
time: new Date(Date.now() + 8 * 3600000),
|
||
ip: ip,
|
||
properties: {
|
||
order_id: order.outTradeNo,
|
||
pay_amount: order.goodsPrice,
|
||
payment_name: order.itemid,
|
||
payment_num: order.itemCount,
|
||
payment_type: "Android",
|
||
is_on_table: Number(userInfo.addLevel) >= 5,
|
||
current_level: userInfo.levelAmount, //当前关卡等级 number
|
||
current_health: userInfo.healthAmount, //当前体力值
|
||
tmp_coin: userInfo.coinAmount,//当前金币
|
||
version: "1.6",
|
||
user_id: userInfo._id, //用户id
|
||
pay_user: userInfo.pay_user,
|
||
register_time: userInfo.register_time,
|
||
abTest_layer_one: getABTestGroupValue(userInfo.abTests, "layer_1"),
|
||
abTest_layer_two: getABTestGroupValue(userInfo.abTests, "layer_2"),
|
||
abTest_layer_three: getABTestGroupValue(userInfo.abTests, "layer_3")
|
||
},
|
||
callback(e) { if (e) { } }
|
||
};
|
||
teSDK.track(trackEvent);
|
||
teSDK.close();
|
||
return;
|
||
}
|
||
|
||
function getABTestGroupValue(abTests: any, layerKey: string) {
|
||
if (!abTests) {
|
||
return 0;
|
||
}
|
||
if (typeof abTests === "string") {
|
||
try {
|
||
abTests = JSON.parse(abTests);
|
||
} catch {
|
||
return 0;
|
||
}
|
||
}
|
||
const groupMap = { A: 1, B: 2, C: 3, D: 4, E: 5 };
|
||
const group = String(abTests[layerKey]?.group || "").toUpperCase();
|
||
return groupMap[group] || 0;
|
||
}
|