update pay ui
This commit is contained in:
@@ -43,14 +43,15 @@ ALIPAY_CONFIG = {
|
||||
|
||||
def load_key_from_file(file_path):
|
||||
"""从文件读取密钥内容"""
|
||||
import sys
|
||||
try:
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
return f.read().strip()
|
||||
except FileNotFoundError:
|
||||
print(f"❌ 密钥文件不存在: {file_path}")
|
||||
print(f"[AlipayConfig] Key file not found: {file_path}", file=sys.stderr)
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"❌ 读取密钥文件失败: {e}")
|
||||
print(f"[AlipayConfig] Read key file failed: {e}", file=sys.stderr)
|
||||
return None
|
||||
|
||||
|
||||
@@ -70,48 +71,48 @@ def validate_config():
|
||||
|
||||
# 检查 app_id
|
||||
if not ALIPAY_CONFIG.get('app_id') or ALIPAY_CONFIG['app_id'].startswith('your_'):
|
||||
issues.append("❌ app_id 未配置,请替换为真实的支付宝应用ID")
|
||||
issues.append("app_id not configured")
|
||||
|
||||
# 检查密钥文件
|
||||
if not os.path.exists(ALIPAY_CONFIG['app_private_key_path']):
|
||||
issues.append(f"❌ 应用私钥文件不存在: {ALIPAY_CONFIG['app_private_key_path']}")
|
||||
issues.append(f"Private key file not found: {ALIPAY_CONFIG['app_private_key_path']}")
|
||||
else:
|
||||
key = get_app_private_key()
|
||||
if not key or len(key) < 100:
|
||||
issues.append("❌ 应用私钥内容异常,请检查文件格式")
|
||||
issues.append("Private key content invalid")
|
||||
|
||||
if not os.path.exists(ALIPAY_CONFIG['alipay_public_key_path']):
|
||||
issues.append(f"❌ 支付宝公钥文件不存在: {ALIPAY_CONFIG['alipay_public_key_path']}")
|
||||
issues.append(f"Alipay public key file not found: {ALIPAY_CONFIG['alipay_public_key_path']}")
|
||||
else:
|
||||
key = get_alipay_public_key()
|
||||
if not key or len(key) < 100:
|
||||
issues.append("❌ 支付宝公钥内容异常,请检查文件格式")
|
||||
issues.append("Alipay public key content invalid")
|
||||
|
||||
return len(issues) == 0, issues
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("支付宝支付配置验证")
|
||||
print("Alipay Payment Config Validation")
|
||||
print("=" * 50)
|
||||
|
||||
is_valid, issues = validate_config()
|
||||
|
||||
if is_valid:
|
||||
print("✅ 配置验证通过!")
|
||||
print("[OK] Config validation passed!")
|
||||
print(f" App ID: {ALIPAY_CONFIG['app_id']}")
|
||||
print(f" 网关: {ALIPAY_CONFIG['gateway_url']}")
|
||||
print(f" 回调地址: {ALIPAY_CONFIG['notify_url']}")
|
||||
print(f" 同步跳转: {ALIPAY_CONFIG['return_url']}")
|
||||
print(f" Gateway: {ALIPAY_CONFIG['gateway_url']}")
|
||||
print(f" Notify URL: {ALIPAY_CONFIG['notify_url']}")
|
||||
print(f" Return URL: {ALIPAY_CONFIG['return_url']}")
|
||||
else:
|
||||
print("⚠️ 配置存在问题:")
|
||||
print("[ERROR] Config has issues:")
|
||||
for issue in issues:
|
||||
print(f" {issue}")
|
||||
print(f" - {issue}")
|
||||
|
||||
print("\n📋 配置步骤:")
|
||||
print("1. 登录支付宝开放平台 (open.alipay.com)")
|
||||
print("2. 创建应用并获取 App ID")
|
||||
print("3. 在开发设置中配置RSA2密钥")
|
||||
print("4. 将应用私钥、支付宝公钥放到 ./alipay/ 文件夹")
|
||||
print("5. 更新本文件中的配置信息")
|
||||
print("\nSetup steps:")
|
||||
print("1. Login to Alipay Open Platform (open.alipay.com)")
|
||||
print("2. Create app and get App ID")
|
||||
print("3. Configure RSA2 keys in development settings")
|
||||
print("4. Put private key and Alipay public key in ./alipay/ folder")
|
||||
print("5. Update config in this file")
|
||||
|
||||
print("=" * 50)
|
||||
|
||||
@@ -46,9 +46,7 @@ class AlipayPay:
|
||||
self.app_private_key = self._load_private_key(app_private_key)
|
||||
self.alipay_public_key = self._load_public_key(alipay_public_key)
|
||||
|
||||
print(f"✅ 支付宝支付初始化成功")
|
||||
print(f" App ID: {app_id}")
|
||||
print(f" 网关: {gateway_url}")
|
||||
# 注意:不要在这里使用 print,会影响 subprocess 的 JSON 输出
|
||||
|
||||
def _load_private_key(self, key_str):
|
||||
"""加载RSA私钥(支持 PKCS#1 和 PKCS#8 格式)"""
|
||||
@@ -76,11 +74,13 @@ class AlipayPay:
|
||||
)
|
||||
return private_key
|
||||
except Exception as e:
|
||||
print(f"[AlipayPay] Load private key failed: {e}")
|
||||
import sys
|
||||
print(f"[AlipayPay] Load private key failed: {e}", file=sys.stderr)
|
||||
raise
|
||||
|
||||
def _load_public_key(self, key_str):
|
||||
"""加载RSA公钥"""
|
||||
import sys
|
||||
try:
|
||||
# 如果密钥不包含头尾,添加PEM格式头尾
|
||||
if '-----BEGIN' not in key_str:
|
||||
@@ -92,7 +92,7 @@ class AlipayPay:
|
||||
)
|
||||
return public_key
|
||||
except Exception as e:
|
||||
print(f"❌ 加载公钥失败: {e}")
|
||||
print(f"[AlipayPay] Load public key failed: {e}", file=sys.stderr)
|
||||
raise
|
||||
|
||||
def _sign(self, unsigned_string):
|
||||
@@ -105,6 +105,7 @@ class AlipayPay:
|
||||
Returns:
|
||||
Base64编码的签名
|
||||
"""
|
||||
import sys
|
||||
try:
|
||||
signature = self.app_private_key.sign(
|
||||
unsigned_string.encode('utf-8'),
|
||||
@@ -113,7 +114,7 @@ class AlipayPay:
|
||||
)
|
||||
return base64.b64encode(signature).decode('utf-8')
|
||||
except Exception as e:
|
||||
print(f"❌ 签名失败: {e}")
|
||||
print(f"[AlipayPay] Sign failed: {e}", file=sys.stderr)
|
||||
raise
|
||||
|
||||
def _verify(self, message, signature):
|
||||
@@ -127,6 +128,7 @@ class AlipayPay:
|
||||
Returns:
|
||||
bool: 验证是否通过
|
||||
"""
|
||||
import sys
|
||||
try:
|
||||
self.alipay_public_key.verify(
|
||||
base64.b64decode(signature),
|
||||
@@ -136,7 +138,7 @@ class AlipayPay:
|
||||
)
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ 签名验证失败: {e}")
|
||||
print(f"[AlipayPay] Verify signature failed: {e}", file=sys.stderr)
|
||||
return False
|
||||
|
||||
def _get_sign_content(self, params):
|
||||
@@ -205,9 +207,9 @@ class AlipayPay:
|
||||
# 构建完整的支付URL
|
||||
pay_url = f"{self.gateway_url}?{urlencode(params)}"
|
||||
|
||||
print(f"✅ 支付宝订单创建成功: {out_trade_no}")
|
||||
print(f" 金额: {total_amount}元")
|
||||
print(f" 标题: {subject}")
|
||||
# 日志输出到 stderr,避免影响 subprocess JSON 输出
|
||||
import sys
|
||||
print(f"[AlipayPay] Order created: {out_trade_no}, amount: {total_amount}", file=sys.stderr)
|
||||
|
||||
return {
|
||||
'success': True,
|
||||
@@ -216,7 +218,8 @@ class AlipayPay:
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 创建支付宝订单失败: {e}")
|
||||
import sys
|
||||
print(f"[AlipayPay] Create order failed: {e}", file=sys.stderr)
|
||||
return {
|
||||
'success': False,
|
||||
'error': str(e)
|
||||
@@ -266,7 +269,9 @@ class AlipayPay:
|
||||
response = requests.get(self.gateway_url, params=params, timeout=30)
|
||||
result = response.json()
|
||||
|
||||
print(f"📡 支付宝查询响应: {result}")
|
||||
# 日志输出到 stderr
|
||||
import sys
|
||||
print(f"[AlipayPay] Query response: {result}", file=sys.stderr)
|
||||
|
||||
# 解析响应
|
||||
query_response = result.get('alipay_trade_query_response', {})
|
||||
@@ -295,10 +300,12 @@ class AlipayPay:
|
||||
}
|
||||
|
||||
except requests.RequestException as e:
|
||||
print(f"❌ 支付宝API请求失败: {e}")
|
||||
import sys
|
||||
print(f"[AlipayPay] API request failed: {e}", file=sys.stderr)
|
||||
return {'success': False, 'error': f'网络请求失败: {e}'}
|
||||
except Exception as e:
|
||||
print(f"❌ 查询订单异常: {e}")
|
||||
import sys
|
||||
print(f"[AlipayPay] Query order error: {e}", file=sys.stderr)
|
||||
return {'success': False, 'error': str(e)}
|
||||
|
||||
def verify_callback(self, params):
|
||||
@@ -323,21 +330,22 @@ class AlipayPay:
|
||||
sign_content = self._get_sign_content(params)
|
||||
|
||||
# 验证签名
|
||||
import sys
|
||||
if self._verify(sign_content, sign):
|
||||
print(f"✅ 支付宝回调签名验证通过")
|
||||
print(f"[AlipayPay] Callback signature verified", file=sys.stderr)
|
||||
return {
|
||||
'success': True,
|
||||
'data': params
|
||||
}
|
||||
else:
|
||||
print(f"❌ 支付宝回调签名验证失败")
|
||||
print(f"[AlipayPay] Callback signature verification failed", file=sys.stderr)
|
||||
return {
|
||||
'success': False,
|
||||
'error': '签名验证失败'
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 验证回调异常: {e}")
|
||||
print(f"[AlipayPay] Verify callback error: {e}", file=sys.stderr)
|
||||
return {'success': False, 'error': str(e)}
|
||||
|
||||
def verify_return(self, params):
|
||||
@@ -403,14 +411,14 @@ if __name__ == '__main__':
|
||||
import sys
|
||||
|
||||
print("=" * 60)
|
||||
print("支付宝支付测试")
|
||||
print("Alipay Payment Test")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# 检查配置
|
||||
is_ready, message = check_alipay_ready()
|
||||
print(f"\n配置状态: {'✅ 就绪' if is_ready else '❌ 未就绪'}")
|
||||
print(f"详情: {message}")
|
||||
print(f"\nConfig status: {'READY' if is_ready else 'NOT READY'}")
|
||||
print(f"Details: {message}")
|
||||
|
||||
if is_ready:
|
||||
# 创建实例
|
||||
@@ -421,19 +429,19 @@ if __name__ == '__main__':
|
||||
result = alipay.create_page_pay_url(
|
||||
out_trade_no=test_order_no,
|
||||
total_amount='0.01',
|
||||
subject='测试商品',
|
||||
body='这是一个测试订单'
|
||||
subject='Test Product',
|
||||
body='This is a test order'
|
||||
)
|
||||
|
||||
print(f"\n创建订单结果:")
|
||||
print(f"\nCreate order result:")
|
||||
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||
|
||||
if result['success']:
|
||||
print(f"\n🔗 支付链接(复制到浏览器打开):")
|
||||
print(f"\nPayment URL (open in browser):")
|
||||
print(result['pay_url'][:200] + '...')
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n❌ 测试失败: {e}")
|
||||
print(f"\nTest failed: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user