diff --git a/.env.development b/.env.development index 706ff13..6036e70 100644 --- a/.env.development +++ b/.env.development @@ -11,6 +11,7 @@ GOOGLE_OAUTH_CLIENT_IOS="53206975661-qan0rnefniegjv53ohild375pv0p7ekd.apps.googl DB_MAIN=mongodb://localhost/wallet-development EMAIL_VERIFY_URL="https://wallet.cebggame.com" +EMAIL_SERVER='http://127.0.0.1:3087' ALCHEMY_APPID="f83Is2y7L425rxl8" 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' # 链端回调hash的ket -HASH_SALT='iG4Rpsa)6U31$H#^T85$^^3' \ No newline at end of file +HASH_SALT='iG4Rpsa)6U31$H#^T85$^^3' + +# 游戏服, 支付上报地址 +GAME_PAY_CB_URL='https://game2006api-test.kingsome.cn/webapp/index.php?c=Shop&a=buyGoodsDirect‘ \ No newline at end of file diff --git a/src/controllers/alchemy.controller.ts b/src/controllers/alchemy.controller.ts index 0ffe504..4c163b0 100644 --- a/src/controllers/alchemy.controller.ts +++ b/src/controllers/alchemy.controller.ts @@ -6,16 +6,17 @@ import { createOrder, createPageSign, queryFiat, queryPrice, refreshToken } from import { generateKVStr } from 'utils/net.util' import { PayRecord, PayStatus } from 'modules/PayRecord' 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` class AlchemyController extends BaseController { @router('post /pay/alchemy/buy') async beginApiPay(req, res) { 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) { - throw new ZError(11, 'fiat, fiatAmount and country must be provided') + if (!fiat || !fiatAmount || !country || !payWayCode) { + throw new ZError(11, 'fiat, fiatAmount payWayCode and country must be provided') } } if (network || crypto) { @@ -30,7 +31,14 @@ class AlchemyController extends BaseController { throw new ZError(10, 'fetch pay token error') } 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 (fiatAmount) record.fiatAmount = fiatAmount if (country) record.country = country @@ -44,7 +52,7 @@ class AlchemyController extends BaseController { depositType: '2', address: address, network: record.network, - payWayCode: '10001', + payWayCode, alpha2: record.country, callbackUrl: CALL_BACK_URL, merchantName: 'CEBG', @@ -55,10 +63,15 @@ class AlchemyController extends BaseController { record.outData = payRes.data if (payRes.success) { record.outOrderId = payRes.data.orderNo + await record.save() } else { record.status = PayStatus.FAIL + await record.save() + setImmediate(() => { + reportPayResult(record) + }) } - record.save() + return { url: payRes.data.payUrl } } @router('post /pay/alchemy/buypage') diff --git a/src/controllers/alchemyout.controller.ts b/src/controllers/alchemyout.controller.ts index 648f5ee..c1c60fe 100644 --- a/src/controllers/alchemyout.controller.ts +++ b/src/controllers/alchemyout.controller.ts @@ -6,6 +6,7 @@ import { checkPayResultSign, checkSimpleSign } from 'service/alchemy.svr' import { PayRecord, PayStatus } from 'modules/PayRecord' import { TransferQueue } from 'queue/transfer.queue' import { TransferRecord } from 'modules/TransferRecord' +import { reportPayResult } from 'service/game.svr' let errorRes = function (msg: string) { return { @@ -59,6 +60,9 @@ class AlchemyOutController extends BaseController { record.outData = req.params record.status = status == 'PAY_SUCCESS' ? PayStatus.SUCCESS : PayStatus.FAIL await record.save() + setImmediate(() => { + reportPayResult(record) + }) logger.info(`alchemy callback success, pay finished`) return {} } diff --git a/src/controllers/main.controllers.ts b/src/controllers/main.controllers.ts index 1f7af1e..aece449 100644 --- a/src/controllers/main.controllers.ts +++ b/src/controllers/main.controllers.ts @@ -48,7 +48,9 @@ class MainController extends BaseController { const openId = payload.sub let data: any = {} 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.name) data.nickname = payload.name if (payload.picture) data.avatar = payload.picture diff --git a/src/controllers/verify.controller.ts b/src/controllers/verify.controller.ts index 81d2d9a..6193ad0 100644 --- a/src/controllers/verify.controller.ts +++ b/src/controllers/verify.controller.ts @@ -37,6 +37,12 @@ class VerifyController extends BaseController { return result } + /** + * 通过邮件中的验证码验证 + * @param req + * @param res + * @returns + */ @router('post /email/verify_by_code') async verifyEmailByCode(req, res) { let user = req.user diff --git a/src/controllers/wallet.controller.ts b/src/controllers/wallet.controller.ts index 42decac..c069da3 100644 --- a/src/controllers/wallet.controller.ts +++ b/src/controllers/wallet.controller.ts @@ -33,13 +33,16 @@ class WalletController extends BaseController { return { email: user.emailReal, verified: 1 } } if (user.email && user.emailVerified) { + let needSave = false if (!user.verified) { + needSave = true user.verified = true } if (!user.emailReal) { + needSave = true user.emailReal = user.email } - if (!user.verified || !user.emailReal) { + if (needSave) { await user.save() } return { email: user.email, verified: 1 } diff --git a/src/modules/PayRecord.ts b/src/modules/PayRecord.ts index 788f414..54efbaa 100644 --- a/src/modules/PayRecord.ts +++ b/src/modules/PayRecord.ts @@ -78,6 +78,11 @@ export class PayRecordClass extends BaseModule { @prop() public txHash?: string + @prop() + public gameAccountId: string + @prop() + public gameOrderId: string + public static async findByRecordId(this: ReturnModelType, outOrderId: string) { return this.findOne({ outOrderId }).exec() } diff --git a/src/service/email.svr.ts b/src/service/email.svr.ts index 416a436..2cae5dc 100644 --- a/src/service/email.svr.ts +++ b/src/service/email.svr.ts @@ -47,7 +47,7 @@ const DEFAULT_MSG_DATA: IMailData = { to: '', subject: 'Please verify your email address', } -const MAIL_SVR = 'http://127.0.0.1:3087' +const MAIL_SVR = process.env.EMAIL_SERVER @singleton export class EmailSvr { diff --git a/src/service/game.svr.ts b/src/service/game.svr.ts new file mode 100644 index 0000000..b8b6f34 --- /dev/null +++ b/src/service/game.svr.ts @@ -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) { + 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) +}