验证iOS支付时, 优先去production验证, 错误后去sandbox
This commit is contained in:
parent
fe0eace046
commit
f8428c369c
@ -22,13 +22,20 @@ const ISSUER_ID = process.env.IOS_ISSUER_ID
|
|||||||
const APP_BUNDLE_ID = process.env.IOS_APP_BUNDLE_ID
|
const APP_BUNDLE_ID = process.env.IOS_APP_BUNDLE_ID
|
||||||
const environment = sandbox ? Environment.Sandbox : Environment.Production
|
const environment = sandbox ? Environment.Sandbox : Environment.Production
|
||||||
|
|
||||||
const api = new AppStoreServerAPI(KEY, KEY_ID, ISSUER_ID, APP_BUNDLE_ID, environment)
|
const apiProd = new AppStoreServerAPI(KEY, KEY_ID, ISSUER_ID, APP_BUNDLE_ID, Environment.Production)
|
||||||
|
const apiSandbox = new AppStoreServerAPI(KEY, KEY_ID, ISSUER_ID, APP_BUNDLE_ID, Environment.Sandbox)
|
||||||
|
|
||||||
@singleton
|
@singleton
|
||||||
export class IosPaySvr {
|
export class IosPaySvr {
|
||||||
public async iosPayVerify(orderId: string) {
|
public async iosPayVerify(orderId: string) {
|
||||||
logger.info('iosPayVerify: ', orderId)
|
logger.info('iosPayVerify: ', orderId)
|
||||||
const response = await api.lookupOrder(orderId)
|
let response;
|
||||||
|
try {
|
||||||
|
response = await apiProd.lookupOrder(orderId)
|
||||||
|
} catch (err) {
|
||||||
|
logger.info('iosPayVerify err: ', err)
|
||||||
|
response = await apiSandbox.lookupOrder(orderId)
|
||||||
|
}
|
||||||
|
|
||||||
if (response.status === OrderLookupStatus.Valid) {
|
if (response.status === OrderLookupStatus.Valid) {
|
||||||
const transactions = await decodeTransactions(response.signedTransactions)
|
const transactions = await decodeTransactions(response.signedTransactions)
|
||||||
@ -44,7 +51,17 @@ export class IosPaySvr {
|
|||||||
if (rversion) {
|
if (rversion) {
|
||||||
reqData['revision'] = rversion
|
reqData['revision'] = rversion
|
||||||
}
|
}
|
||||||
const response = await api.getTransactionHistory(originalTransactionId, reqData)
|
let response
|
||||||
|
try {
|
||||||
|
response = await apiProd.getTransactionHistory(originalTransactionId, reqData)
|
||||||
|
} catch (err) {
|
||||||
|
logger.info(`transaction with id ${originalTransactionId} not found in production, try sandbox`)
|
||||||
|
try {
|
||||||
|
response = await apiSandbox.getTransactionHistory(originalTransactionId, reqData)
|
||||||
|
} catch (errSandbox) {
|
||||||
|
logger.info(`transaction with id ${originalTransactionId} not found in sandbox`)
|
||||||
|
}
|
||||||
|
}
|
||||||
let results: any = []
|
let results: any = []
|
||||||
// Decoding not only reveals the contents of the transactions but also verifies that they were signed by Apple.
|
// Decoding not only reveals the contents of the transactions but also verifies that they were signed by Apple.
|
||||||
const transactions = await decodeTransactions(response.signedTransactions)
|
const transactions = await decodeTransactions(response.signedTransactions)
|
||||||
@ -61,7 +78,21 @@ export class IosPaySvr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async getTransactionInfo(originalTransactionId: string) {
|
public async getTransactionInfo(originalTransactionId: string) {
|
||||||
const response = await api.getTransactionInfo(originalTransactionId)
|
let response;
|
||||||
|
try {
|
||||||
|
response = await apiProd.getTransactionInfo(originalTransactionId)
|
||||||
|
} catch (err) {
|
||||||
|
try {
|
||||||
|
logger.info(`transaction with id ${originalTransactionId} not found in production, try sandbox`)
|
||||||
|
response = await apiSandbox.getTransactionInfo(originalTransactionId)
|
||||||
|
} catch (errSandbox) {
|
||||||
|
logger.info(`transaction with id ${originalTransactionId} not found in sandbox`)
|
||||||
|
throw new Error('getTransactionInfo err')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!response) {
|
||||||
|
throw new Error('empty transaction info')
|
||||||
|
}
|
||||||
const transaction = await decodeTransaction(response.signedTransactionInfo)
|
const transaction = await decodeTransaction(response.signedTransactionInfo)
|
||||||
return transaction
|
return transaction
|
||||||
}
|
}
|
||||||
@ -69,7 +100,7 @@ export class IosPaySvr {
|
|||||||
public async queryNotificationHistory() {
|
public async queryNotificationHistory() {
|
||||||
// Start and end date are required.
|
// Start and end date are required.
|
||||||
// The earliest supported start date is June 6th (the start of WWDC 2022).
|
// The earliest supported start date is June 6th (the start of WWDC 2022).
|
||||||
const response = await api.getNotificationHistory({
|
const response = await apiProd.getNotificationHistory({
|
||||||
startDate: 1690175687060, // June 6th 2022
|
startDate: 1690175687060, // June 6th 2022
|
||||||
endDate: new Date().getTime(),
|
endDate: new Date().getTime(),
|
||||||
})
|
})
|
||||||
@ -85,9 +116,9 @@ export class IosPaySvr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async requestTestNotification() {
|
public async requestTestNotification() {
|
||||||
let resp = await api.requestTestNotification()
|
let resp = await apiSandbox.requestTestNotification()
|
||||||
logger.info('requestTestNotification response: ', resp)
|
logger.info('requestTestNotification response: ', resp)
|
||||||
let info = await api.getTestNotificationStatus(resp.testNotificationToken)
|
let info = await apiSandbox.getTestNotificationStatus(resp.testNotificationToken)
|
||||||
let decodeInfo = await decodeNotificationPayload(info.signedPayload)
|
let decodeInfo = await decodeNotificationPayload(info.signedPayload)
|
||||||
logger.info(decodeInfo)
|
logger.info(decodeInfo)
|
||||||
return decodeInfo
|
return decodeInfo
|
||||||
|
Loading…
x
Reference in New Issue
Block a user