【支付系统核心问题】

发布时间:2026/5/20 16:07:25

【支付系统核心问题】 防重复支付核心方案唯一支付订单号生成规则StringgeneratePaymentNo(StringorderId,StringpaymentMethod,Stringchannel){returnorderId-paymentMethod-channel-System.currentTimeMillis();}幂等性校验逻辑MySQLCREATETABLEpayment_transaction(payment_noVARCHAR(64)PRIMARYKEY,order_idVARCHAR(32)NOTNULL,statusENUM(PROCESSING,SUCCESS,FAILED)NOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);支付路由智能选择策略渠道权重计算公式score (base_weight * 0.6) (success_rate * 30) (cost_factor * 10)渠道选择代码defselect_channel(merchant_type,amount,region):available_channelsfilter_channels(merchant_type,region)scored_channels[(c,calculate_score(c,amount))forcinavailable_channels]returnmax(scored_channels,keylambdax:x[1])[0]移动支付实现关键点Java微信支付回调验证publicbooleanverifyWechatCallback(MapString,Stringparams,StringapiKey){Stringsignparams.remove(sign);Stringqueryparams.entrySet().stream().sorted(Map.Entry.comparingByKey()).map(e-e.getKey()e.getValue()).collect(Collectors.joining());returnDigestUtils.md5Hex(querykeyapiKey).equals(sign);}Node.js支付宝RSA2签名constcryptorequire(crypto);functionalipaySign(params,privateKey){constsignStrObject.keys(params).sort().filter(kparams[k]k!sign).map(k${k}${params[k]}).join();returncrypto.createSign(RSA-SHA256).update(signStr).sign(privateKey,base64);}退款处理实现方案微信退款publicRefundResultwechatRefund(RefundRequestrequest)throwsException{KeyStorekeyStoreKeyStore.getInstance(PKCS12);try(InputStreamisFiles.newInputStream(Paths.get(apiclient_cert.p12))){keyStore.load(is,request.getMchId().toCharArray());}X509Certificatecert(X509Certificate)keyStore.getCertificate(cert);PrivateKeyprivateKey(PrivateKey)keyStore.getKey(cert,request.getMchId().toCharArray());// 构建签名和请求逻辑...}异常处理机制设计支付状态机设计发起支付支付成功支付失败重新尝试发起退款退款成功CREATEDPROCESSINGSUCCESSFAILEDREFUNDINGREFUNDED系统监控指标关键监控指标清单支付成功率 (成功笔数 / 总发起笔数) × 100%平均处理时间 Σ(单笔处理时间) / 总笔数渠道故障率 (渠道失败次数 / 渠道调用次数) × 100%重复支付拦截率 (拦截次数 / 重复请求次数) × 100%安全防护措施敏感数据加密处理publicStringencryptCardNo(StringcardNo,Stringkey){CiphercipherCipher.getInstance(AES/GCM/NoPadding);cipher.init(Cipher.ENCRYPT_MODE,newSecretKeySpec(key.getBytes(),AES));byte[]ivcipher.getIV();byte[]encryptedcipher.doFinal(cardNo.getBytes());returnBase64.getEncoder().encodeToString(iv):Base64.getEncoder().encodeToString(encrypted);}

相关新闻