You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

乌兹别克斯坦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、密钥、测试手机号/银行卡等)需要通过以下方式获取:

  1. 注册Click商户测试账号,进入商户后台的测试环境板块;
  2. 直接联系Click的商户支持团队,提交测试需求,他们会提供全套的测试凭证和模拟支付的测试数据。

三、现有代码的优化建议

你的现有代码存在几个需要调整的问题,避免后续调用失败:

  1. CreateInvoice请求格式错误:requests.post中使用data=request_body会以表单格式发送,而Click API要求JSON格式,应改为json=request_body;
  2. URL路径格式错误:比如CheckInvoiceStatus的URL里的冒号是多余的,正确格式应为:
    url = f"{self.baseurl}/invoice/status/{self.service_id}/{invoice_id}"
    
  3. merchant_trans_id重复问题:当前初始化时固定了该值,每次请求应生成唯一的交易ID(比如用时间戳+随机数),避免重复;
  4. timestamp过期问题:初始化时生成的timestamp会随着实例存在时间变长而过期,应在每次请求时重新生成timestamp、digest和auth头;
  5. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:47:01