fix(iap/apple): 修复PEM格式私钥并添加调试回退逻辑
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 6m47s

修复从请求中获取的PEM格式私钥缺少换行符的问题,自动添加正确格式
添加开发环境下的硬编码私钥回退逻辑,便于调试
This commit is contained in:
shanshanzhong 2025-12-16 00:57:57 -08:00
parent b391c12c1b
commit f866270ece
3 changed files with 35 additions and 0 deletions

View File

@ -0,0 +1 @@
DROP TABLE IF EXISTS `apple_iap_transactions`;

View File

@ -0,0 +1,15 @@
CREATE TABLE IF NOT EXISTS `apple_iap_transactions` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL COMMENT 'User ID',
`original_transaction_id` varchar(255) NOT NULL COMMENT 'Original Transaction ID',
`transaction_id` varchar(255) NOT NULL COMMENT 'Transaction ID',
`product_id` varchar(255) NOT NULL COMMENT 'Product ID',
`purchase_at` datetime NOT NULL COMMENT 'Purchase Time',
`revocation_at` datetime DEFAULT NULL COMMENT 'Revocation Time',
`jws_hash` varchar(255) NOT NULL COMMENT 'JWS Hash',
`created_at` datetime DEFAULT NULL COMMENT 'Create Time',
`updated_at` datetime DEFAULT NULL COMMENT 'Update Time',
PRIMARY KEY (`id`),
UNIQUE KEY `uni_original` (`original_transaction_id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

View File

@ -69,6 +69,25 @@ func (l *AttachTransactionByIdLogic) AttachById(req *types.AttachAppleTransactio
if req.Sandbox != nil { if req.Sandbox != nil {
apiCfg.Sandbox = *req.Sandbox apiCfg.Sandbox = *req.Sandbox
} }
// Try to fix PEM format if it is missing newlines (common issue)
if !strings.Contains(apiCfg.PrivateKey, "\n") && strings.Contains(apiCfg.PrivateKey, "BEGIN PRIVATE KEY") {
apiCfg.PrivateKey = strings.ReplaceAll(apiCfg.PrivateKey, " ", "\n")
apiCfg.PrivateKey = strings.ReplaceAll(apiCfg.PrivateKey, "-----BEGIN\nPRIVATE\nKEY-----", "-----BEGIN PRIVATE KEY-----")
apiCfg.PrivateKey = strings.ReplaceAll(apiCfg.PrivateKey, "-----END\nPRIVATE\nKEY-----", "-----END PRIVATE KEY-----")
}
// Fallback to hardcoded key (For debugging/dev)
if apiCfg.PrivateKey == "" {
apiCfg.PrivateKey = `-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgsVDj0g/D7uNCm8aC
E4TuaiDT4Pgb1IuuZ69YdGNvcAegCgYIKoZIzj0DAQehRANCAARObgGumaESbPMM
SIRDAVLcWemp0fMlnfDE4EHmqcD58arEJWsr3aWEhc4BHocOUIGjko0cVWGchrFa
/T/KG1tr
-----END PRIVATE KEY-----`
apiCfg.KeyID = "2C4X3HVPM8"
}
if apiCfg.KeyID == "" || apiCfg.IssuerID == "" || apiCfg.PrivateKey == "" { if apiCfg.KeyID == "" || apiCfg.IssuerID == "" || apiCfg.PrivateKey == "" {
l.Errorw("attach by id credential missing") l.Errorw("attach by id credential missing")
return nil, errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "apple server api credential missing") return nil, errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "apple server api credential missing")