159 lines
6.0 KiB
TypeScript
159 lines
6.0 KiB
TypeScript
import cloud from '@lafjs/cloud'
|
||
import crypto from 'crypto';
|
||
const mchid = "1719895437";//商户id
|
||
const serialNo = "2A97ED6ED441E55600EBC8830B9EC889ED41496E";//证书序列号
|
||
const db = cloud.database();
|
||
const ThinkingData = require('thinkingdata-node');
|
||
export default async function (ctx: FunctionContext) {
|
||
let outTradeNo = ctx.body.outTradeNo;
|
||
if (!outTradeNo) {
|
||
return { code: 0, data: null, msg: "未获取到充值订单" };
|
||
}
|
||
const uid = ctx.body.uid;
|
||
let res = await getOrder(outTradeNo);
|
||
console.log("查询充值结果");
|
||
let ret = await db.collection("order").where({ "outTradeNo": outTradeNo }).getOne();
|
||
let iosOrder = cloud.shared.get("iosOrder"); // 获取 wsMap
|
||
if (!ret.data) {
|
||
console.error("ios找不到充值订单:" + outTradeNo);
|
||
return { code: 0, data: null, msg: "未获取到充值信息" };
|
||
}
|
||
if (ret.data.state == 2) {
|
||
console.error("ios已经获取奖励");
|
||
return { code: 0, data: null, msg: "已经获取到奖励" };
|
||
}
|
||
let payment_name = ret.data?.itemid;
|
||
if (res) {
|
||
if (uid) {
|
||
let res1 = await db.collection("users").where({ _id: uid }).getOne();
|
||
if (!iosOrder) {
|
||
iosOrder = {};
|
||
} else {
|
||
//console.log(iosOrder);
|
||
}
|
||
if (!iosOrder[outTradeNo]) {
|
||
sead(ret.data, res1.data, getClientIp(ctx));
|
||
iosOrder[outTradeNo] = 2;
|
||
} else {
|
||
}
|
||
|
||
cloud.shared.set("iosOrder", iosOrder); // 设置 wsMap
|
||
switch (payment_name) {
|
||
case "month_Card":
|
||
let monthCardTime = res1.data.monthCardTime;
|
||
if (!monthCardTime || monthCardTime < Date.now()) {
|
||
monthCardTime = Date.now();
|
||
}
|
||
monthCardTime = monthCardTime + 2592000000;
|
||
let ret = await db.collection("users").where({ _id: uid }).update({ monthCardTime: monthCardTime, monthCardReward: 0, pay_user: true });
|
||
break;
|
||
case "reborn_Gift":
|
||
db.collection("users").where({ _id: uid }).update({ rebornGiftTime: Date.now(), rebornGiftCount: 1, pay_user: true });
|
||
break;
|
||
case "starter_pack":
|
||
db.collection("users").where({ _id: uid }).update({ starter_packState: 1, pay_user: true });
|
||
break;
|
||
default:
|
||
db.collection("users").where({ _id: uid }).update({ pay_user: true });
|
||
break;
|
||
}
|
||
}
|
||
await db.collection("order").where({ outTradeNo: outTradeNo }).update({ state: 2, chargeTime: new Date(Date.now() + 8 * 3600000), getTime: new Date(Date.now() + 8 * 3600000) });
|
||
return { code: 1, data: { goodsPrice: ret.data?.goodsPrice, payment_name: payment_name }, msg: "充值成功" };
|
||
} else {
|
||
console.log("充值不成功:" + outTradeNo);
|
||
return { code: 0, data: { goodsPrice: ret.data?.goodsPrice, payment_name: payment_name }, msg: "充值失败" };
|
||
}
|
||
|
||
}
|
||
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 getOrder(outTradeNo) {
|
||
const url = `https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/${outTradeNo}?mchid=1719895437`;
|
||
const nonceStr = crypto.randomBytes(16).toString('hex');
|
||
const timestamp = Math.floor(Date.now() / 1000).toString();
|
||
let au = await sign(outTradeNo, nonceStr, timestamp);
|
||
let res = await fetch(url, {
|
||
method: 'GET', // 默认是 GET,可省略
|
||
headers: {
|
||
'Authorization': au, // 认证令牌
|
||
'Content-Type': 'application/json', // 声明请求体类型(GET 请求通常不需要)
|
||
'Accept': 'application/json', // 声明期望的响应类型
|
||
}
|
||
})
|
||
const data = await res.json();
|
||
if (data.trade_state == 'SUCCESS') {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
async function sign(outTradeNo, nonceStr, timestamp) {
|
||
const data = `GET\n/v3/pay/transactions/out-trade-no/${outTradeNo}?mchid=1719895437\n${timestamp}\n${nonceStr}\n\n`
|
||
// 创建签名对象
|
||
const sign = crypto.createSign('RSA-SHA256');
|
||
// 更新签名内容
|
||
sign.update(data);
|
||
// 获取存储桶
|
||
const bucket = cloud.storage.bucket('j3k323ol-colorblock-oss');
|
||
// 获取文件列表
|
||
const res = await bucket.readFile('apiclient_key.pem');
|
||
const privateKeyPem = await res.Body.transformToString();
|
||
// 使用私钥签名(PKCS1 填充)
|
||
const signature = sign.sign({
|
||
key: privateKeyPem,
|
||
padding: crypto.constants.RSA_PKCS1_PADDING
|
||
}, 'base64');
|
||
// 构建Authorization头
|
||
const authorization = `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",nonce_str="${nonceStr}",signature="${signature}",timestamp="${timestamp}",serial_no="${serialNo}"`;
|
||
return authorization;
|
||
}
|
||
async function sead(order, userInfo, ip) {
|
||
if (!userInfo.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: "ios_old",
|
||
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
|
||
},
|
||
callback(e) {
|
||
if (e) {
|
||
console.log(e);
|
||
}
|
||
}
|
||
};
|
||
teSDK.track(trackEvent);
|
||
teSDK.close();
|
||
return;
|
||
} |