增加game svr上报

This commit is contained in:
zhl 2023-06-07 19:35:07 +08:00
parent c1d01f4ab0
commit d2e2337df0
9 changed files with 75 additions and 10 deletions

View File

@ -11,6 +11,7 @@ GOOGLE_OAUTH_CLIENT_IOS="53206975661-qan0rnefniegjv53ohild375pv0p7ekd.apps.googl
DB_MAIN=mongodb://localhost/wallet-development DB_MAIN=mongodb://localhost/wallet-development
EMAIL_VERIFY_URL="https://wallet.cebggame.com" EMAIL_VERIFY_URL="https://wallet.cebggame.com"
EMAIL_SERVER='http://127.0.0.1:3087'
ALCHEMY_APPID="f83Is2y7L425rxl8" ALCHEMY_APPID="f83Is2y7L425rxl8"
ALCHEMY_APP_SECRET="4Yn8RkxDXN71Q3p0" ALCHEMY_APP_SECRET="4Yn8RkxDXN71Q3p0"
@ -40,4 +41,7 @@ BSC_WALLET='0x50A8e60041A206AcaA5F844a1104896224be6F39'
# 链端转账回调地址 # 链端转账回调地址
PAY_TRANSFER_CB_URL='http://127.0.0.1:3007/api/internal/update_task' PAY_TRANSFER_CB_URL='http://127.0.0.1:3007/api/internal/update_task'
# 链端回调hash的ket # 链端回调hash的ket
HASH_SALT='iG4Rpsa)6U31$H#^T85$^^3' HASH_SALT='iG4Rpsa)6U31$H#^T85$^^3'
# 游戏服, 支付上报地址
GAME_PAY_CB_URL='https://game2006api-test.kingsome.cn/webapp/index.php?c=Shop&a=buyGoodsDirect

View File

@ -6,16 +6,17 @@ import { createOrder, createPageSign, queryFiat, queryPrice, refreshToken } from
import { generateKVStr } from 'utils/net.util' import { generateKVStr } from 'utils/net.util'
import { PayRecord, PayStatus } from 'modules/PayRecord' import { PayRecord, PayStatus } from 'modules/PayRecord'
import { PriceSvr } from 'service/price.svr' import { PriceSvr } from 'service/price.svr'
import { reportPayResult } from 'service/game.svr'
const CALL_BACK_URL = `${process.env.ALCHEMY_PAY_CB_URL}/pay/out/alchemy/buycb` const CALL_BACK_URL = `${process.env.ALCHEMY_PAY_CB_URL}/pay/out/alchemy/buycb`
class AlchemyController extends BaseController { class AlchemyController extends BaseController {
@router('post /pay/alchemy/buy') @router('post /pay/alchemy/buy')
async beginApiPay(req, res) { async beginApiPay(req, res) {
const user = req.user const user = req.user
const { network, crypto, address, fiat, fiatAmount, country } = req.params const { network, crypto, address, fiat, fiatAmount, payWayCode, country, accountId, orderId } = req.params
if (fiat || fiatAmount || country) { if (fiat || fiatAmount || country) {
if (!fiat || !fiatAmount || !country) { if (!fiat || !fiatAmount || !country || !payWayCode) {
throw new ZError(11, 'fiat, fiatAmount and country must be provided') throw new ZError(11, 'fiat, fiatAmount payWayCode and country must be provided')
} }
} }
if (network || crypto) { if (network || crypto) {
@ -30,7 +31,14 @@ class AlchemyController extends BaseController {
throw new ZError(10, 'fetch pay token error') throw new ZError(10, 'fetch pay token error')
} }
const { id, email, accessToken } = tokenResult.data const { id, email, accessToken } = tokenResult.data
let record = new PayRecord({ account: user.id, address, network, crypto }) let record = new PayRecord({
account: user.id,
address,
network,
crypto,
gameAccountId: accountId,
gameOrderId: orderId,
})
if (fiat) record.fiat = fiat if (fiat) record.fiat = fiat
if (fiatAmount) record.fiatAmount = fiatAmount if (fiatAmount) record.fiatAmount = fiatAmount
if (country) record.country = country if (country) record.country = country
@ -44,7 +52,7 @@ class AlchemyController extends BaseController {
depositType: '2', depositType: '2',
address: address, address: address,
network: record.network, network: record.network,
payWayCode: '10001', payWayCode,
alpha2: record.country, alpha2: record.country,
callbackUrl: CALL_BACK_URL, callbackUrl: CALL_BACK_URL,
merchantName: 'CEBG', merchantName: 'CEBG',
@ -55,10 +63,15 @@ class AlchemyController extends BaseController {
record.outData = payRes.data record.outData = payRes.data
if (payRes.success) { if (payRes.success) {
record.outOrderId = payRes.data.orderNo record.outOrderId = payRes.data.orderNo
await record.save()
} else { } else {
record.status = PayStatus.FAIL record.status = PayStatus.FAIL
await record.save()
setImmediate(() => {
reportPayResult(record)
})
} }
record.save()
return { url: payRes.data.payUrl } return { url: payRes.data.payUrl }
} }
@router('post /pay/alchemy/buypage') @router('post /pay/alchemy/buypage')

View File

@ -6,6 +6,7 @@ import { checkPayResultSign, checkSimpleSign } from 'service/alchemy.svr'
import { PayRecord, PayStatus } from 'modules/PayRecord' import { PayRecord, PayStatus } from 'modules/PayRecord'
import { TransferQueue } from 'queue/transfer.queue' import { TransferQueue } from 'queue/transfer.queue'
import { TransferRecord } from 'modules/TransferRecord' import { TransferRecord } from 'modules/TransferRecord'
import { reportPayResult } from 'service/game.svr'
let errorRes = function (msg: string) { let errorRes = function (msg: string) {
return { return {
@ -59,6 +60,9 @@ class AlchemyOutController extends BaseController {
record.outData = req.params record.outData = req.params
record.status = status == 'PAY_SUCCESS' ? PayStatus.SUCCESS : PayStatus.FAIL record.status = status == 'PAY_SUCCESS' ? PayStatus.SUCCESS : PayStatus.FAIL
await record.save() await record.save()
setImmediate(() => {
reportPayResult(record)
})
logger.info(`alchemy callback success, pay finished`) logger.info(`alchemy callback success, pay finished`)
return {} return {}
} }

View File

@ -48,7 +48,9 @@ class MainController extends BaseController {
const openId = payload.sub const openId = payload.sub
let data: any = {} let data: any = {}
if (payload.email) data.email = payload.email if (payload.email) data.email = payload.email
if (payload.email_verified !== undefined) data.emailVerified = payload.email_verified if (process.env.NODE_ENV !== 'development') {
if (payload.email_verified !== undefined) data.emailVerified = payload.email_verified
}
if (payload.locale) data.locale = payload.locale if (payload.locale) data.locale = payload.locale
if (payload.name) data.nickname = payload.name if (payload.name) data.nickname = payload.name
if (payload.picture) data.avatar = payload.picture if (payload.picture) data.avatar = payload.picture

View File

@ -37,6 +37,12 @@ class VerifyController extends BaseController {
return result return result
} }
/**
*
* @param req
* @param res
* @returns
*/
@router('post /email/verify_by_code') @router('post /email/verify_by_code')
async verifyEmailByCode(req, res) { async verifyEmailByCode(req, res) {
let user = req.user let user = req.user

View File

@ -33,13 +33,16 @@ class WalletController extends BaseController {
return { email: user.emailReal, verified: 1 } return { email: user.emailReal, verified: 1 }
} }
if (user.email && user.emailVerified) { if (user.email && user.emailVerified) {
let needSave = false
if (!user.verified) { if (!user.verified) {
needSave = true
user.verified = true user.verified = true
} }
if (!user.emailReal) { if (!user.emailReal) {
needSave = true
user.emailReal = user.email user.emailReal = user.email
} }
if (!user.verified || !user.emailReal) { if (needSave) {
await user.save() await user.save()
} }
return { email: user.email, verified: 1 } return { email: user.email, verified: 1 }

View File

@ -78,6 +78,11 @@ export class PayRecordClass extends BaseModule {
@prop() @prop()
public txHash?: string public txHash?: string
@prop()
public gameAccountId: string
@prop()
public gameOrderId: string
public static async findByRecordId(this: ReturnModelType<typeof PayRecordClass>, outOrderId: string) { public static async findByRecordId(this: ReturnModelType<typeof PayRecordClass>, outOrderId: string) {
return this.findOne({ outOrderId }).exec() return this.findOne({ outOrderId }).exec()
} }

View File

@ -47,7 +47,7 @@ const DEFAULT_MSG_DATA: IMailData = {
to: '', to: '',
subject: 'Please verify your email address', subject: 'Please verify your email address',
} }
const MAIL_SVR = 'http://127.0.0.1:3087' const MAIL_SVR = process.env.EMAIL_SERVER
@singleton @singleton
export class EmailSvr { export class EmailSvr {

28
src/service/game.svr.ts Normal file
View File

@ -0,0 +1,28 @@
import axios from 'axios'
import { PayRecordClass } from 'modules/PayRecord'
import { DocumentType } from '@typegoose/typegoose'
import { hmacsha256 } from 'utils/security.util'
export async function reportPayResult(data: DocumentType<PayRecordClass>) {
let repData = {
account_id: data.gameAccountId,
order_id: data.gameOrderId,
status: data.status,
id: data.id,
txhash: data.txHash,
}
let signStr = Object.keys(repData)
.sort()
.map(key => `${key}=${encodeURIComponent(repData[key])}`)
.join('&')
const sign = hmacsha256(signStr, process.env.HASH_SALT)
let url = `${process.env.GAME_PAY_CB_URL}&${signStr}&sign=${sign}`
let reqConfig: any = {
method: 'get',
url,
headers: {
'Content-Type': 'application/json',
},
}
return axios(reqConfig)
}