【问题标题】:{ "status": "FAIL", "code": "400002", "errorMessage": "Signature for this request is not valid." }{ \"status\": \"FAIL\", \"code\": \"400002\", \"errorMessage\": \"此请求的签名无效。\" }
【发布时间】:2023-02-03 23:35:54
【问题描述】:

我试图从 binance pay api 获取“创建订单”api 以在我的 kotlin android 应用程序中进行付款。我正在关注 api documentation 来构建有效负载和签名,但不幸的是它不起作用。 我收到此错误:“errorMessage”:“此请求的签名无效。”

任何人都可以帮忙吗?

 private fun createSignature(payload: String, secretKey: String): String {
        val sha512HMAC = Mac.getInstance("HmacSHA512")
        val secretKeySpec =
            SecretKeySpec(secretKey.toByteArray(), "HmacSHA512")  // bokra jarrib HMAC-SHA512
        sha512HMAC.init(secretKeySpec)
        val digest = sha512HMAC.doFinal(payload.toByteArray())
        return digest.toHex()
    }
val timestamp = System.currentTimeMillis() + clockOffset
val nonceStr = generateNonce()
 val body = Gson().toJson(
                OrderRequest(
                    Env("APP"),
                    merchantTradeNb,
                    0.02,
                    "USDT",
                    Goods("01", "D000", "7876763A3C", "phone", "Good new phone")
                )
            )
            val payload = timestamp.toString() + "\n" + nonceStr + "\n" + body + "\n"

            val signature: String = createSignature(
                payload.toByteArray(Charsets.UTF_8).toString(), secretKey
            ).uppercase()

            val retrofitData = retrofitBuilder.binanceApi.createOrder(
                "application/json", timestamp, nonceStr, certSn, signature, body
            )

            retrofitData.enqueue(object : Callback<OrderResponse> {
                override fun onResponse(
                    call: Call<OrderResponse>,
                    response: Response<OrderResponse>,
                ) {
                    response.body()
                }

                override fun onFailure(call: Call<OrderResponse>, t: Throwable) {
                }
            })

        }
interface BinancePayApi {

    @POST("/binancepay/openapi/v2/order")
    fun createOrder(
        @Header("Content-type") contentType: String,
        @Header("BinancePay-Timestamp") timestamp: Long,
        @Header("BinancePay-Nonce") nonce: String,
        @Header("BinancePay-Certificate-SN") apiKey: String,
        @Header("BinancePay-Signature") signature: String,
        @Body request: String
    ): Call<OrderResponse>
}

【问题讨论】:

    标签: android kotlin signature binance


    【解决方案1】:

    我想问题出在签名根据您需要执行此操作的文档

    String signature = hex(hmac("sha512", payload, secretKey)).toUpperCase()
    
    

    因此,要在kotlin中执行此操作,您可以按以下方式进行

    fun hmac(algorithm: String, data: String, secretKey: String): ByteArray {
        val secret = SecretKeySpec(secretKey.toByteArray(), algorithm)
        val mac = Mac.getInstance(algorithm)
        mac.init(secret)
        return mac.doFinal(data.toByteArray())
    }
    

    然后你需要把它转换成hex这样你就可以创建这个方法(我看到你正在使用这个.toHex()但我不知道你的实现)

    fun hex(bytes: ByteArray): String {
        val hexChars = "0123456789ABCDEF".toCharArray()
        val result = StringBuilder(bytes.size * 2)
        for (b in bytes) {
            result.append(hexChars[b.toInt().shr(4) and 0x0f])
            result.append(hexChars[b.toInt() and 0x0f])
        }
        return result.toString()
    }
    

    然后你唯一需要做的就是把它包起来,你可以这样做:

    val signature = hex(hmac("SHA-512", payload, secretKey)).toUpperCase()
    

    我想知道您遇到的问题是否是您使用的是 HmacSHA512 而不是 SHA-512

    【讨论】:

      【解决方案2】:

      我正在阅读您发布的文档,并且阅读了这个示例: (https://developers.binance.com/docs/binance-pay/app-integration)

      String payload = "certSn=317c110ebf7baf641e8f49ab6851331737dbe98541947c53b9dbba27f8c8414f" + "&" + "merchantId=98765987" + "&" + "noncestr=5K8264ILTKCH16CQ2502SI8ZNMTM67VS" + "&" + "prepayId=98765987" + "&"+ "timeStamp=1618302830073";String signature = hex(hmac("sha512", payload, secretKey)).toUpperCase();

      在您的 createSignature 方法中,我看不到这种逻辑。

      【讨论】:

      • 是的,因为有效负载逻辑与 API 规范通用规则中的逻辑不同。它应该是这样的:String payload = timestamp + " " + 随机数 + " “+身体+” " 请阅读 API 规范通用规则并检查负载逻辑
      猜你喜欢
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多