乌兹别克斯坦Click支付网关Merchant API实现咨询
Click支付网关开发疑问解答
一、Prepare/Complete接口与商户API的开发优先级
Click的支付流程是商户主动发起账单(Create Invoice)→ 用户完成支付 → Click回调商户的Prepare/Complete接口确认支付,二者是完整支付闭环的必要环节,不存在二选一:
- 你已实现的Create Invoice属于商户主动调用的API,仅负责生成支付账单,但无法接收支付完成的通知和确认。
- Prepare和Complete是Click网关向你的服务发起的回调接口,用于通知你用户的支付状态,并需要你返回确认结果,这是完成支付流程、更新订单状态的核心步骤。
所以优先开发Prepare和Complete回调接口,否则即使用户支付成功,你的系统也无法同步状态,支付流程不完整。商户API(如查询账单/支付状态)可以后续补充,但回调接口是必须先做的。
二、测试数据获取方式
Click的测试数据(包括测试商户ID、服务ID、密钥、测试手机号/银行卡等)需要通过以下方式获取:
- 注册Click商户测试账号,进入商户后台的测试环境板块;
- 直接联系Click的商户支持团队,提交测试需求,他们会提供全套的测试凭证和模拟支付的测试数据。
三、现有代码的优化建议
你的现有代码存在几个需要调整的问题,避免后续调用失败:
- CreateInvoice请求格式错误:
requests.post中使用data=request_body会以表单格式发送,而Click API要求JSON格式,应改为json=request_body; - URL路径格式错误:比如
CheckInvoiceStatus的URL里的冒号是多余的,正确格式应为:url = f"{self.baseurl}/invoice/status/{self.service_id}/{invoice_id}" - merchant_trans_id重复问题:当前初始化时固定了该值,每次请求应生成唯一的交易ID(比如用时间戳+随机数),避免重复;
- timestamp过期问题:初始化时生成的timestamp会随着实例存在时间变长而过期,应在每次请求时重新生成timestamp、digest和auth头;
- CheckPaymentStatusByMerchantId方法缺失参数:方法里用到了
self.merchant_user_id,但初始化时未定义,且方法没有接收参数,需要补充。
优化后的部分代码示例:
import random from flask import Flask, request, jsonify import hashlib import time import requests app = Flask(__name__) class ClickPay: def __init__(self): self.baseurl = "https://api.click.uz/v2/merchant/" self.secret_key = 'AAAAAA' self.merchant_id = 1111 self.service_id = 11111 self.accept = "application/json" self.content_type = "application/json" def _generate_auth_headers(self, merchant_trans_id): # 每次请求生成新的认证信息 timestamp = str(int(time.time())) digest = hashlib.sha1((timestamp + self.secret_key).encode()).hexdigest() auth = f"{merchant_trans_id}:{digest}:{timestamp}" return { "Accept": self.accept, "Content-Type": self.content_type, "Auth": auth } def CreateInvoice(self, amount, phone_number): url = f"{self.baseurl}/invoice/create" # 生成唯一商户交易ID merchant_trans_id = f"{int(time.time())}{random.randint(1000,9999)}" request_body = { "service_id": self.service_id, "amount": amount, "phone_number": phone_number, "merchant_trans_id": merchant_trans_id } headers = self._generate_auth_headers(merchant_trans_id) # 使用json参数发送请求 response = requests.post(url, headers=headers, json=request_body) return response # 其他方法按同样逻辑优化...
内容的提问来源于stack exchange,提问作者Chirayu P MSP
相关产品推荐
相关产品推荐

