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

Android Kotlin中如何重新生成不含“+”的Token?

解决Token含“+”需重新生成的问题

最优方案:使用URL安全的Base64编码

普通Base64编码会生成+、/这类特殊字符,直接改用URL安全的Base64编码器就能彻底避免这个问题,无需循环重试,效率更高。

修改你的createSignature3函数:

fun createSignature3(data: String, secret: String): String {
    val sha256_HMAC = Mac.getInstance("HmacSHA256")
    val secret_key = SecretKeySpec(secret.toByteArray(), "HmacSHA256")
    sha256_HMAC.init(secret_key)
    // 替换为URL安全的Base64编码器,自动替换+为-、/为_,且不添加换行符
    val token = Base64.getUrlEncoder().encodeToString(sha256_HMAC.doFinal(data.toByteArray()))
    return token
}

修改后生成的Token不会包含+,直接调用下单逻辑即可,无需额外判断:

fun makeOrder(){
    generateOdemeInfo()
    odemeStateAl(merchant_oid)
    val token = createSignature3(hash_str+merchant_salt,merchant_key)
    
    oDao.makeOrder(
        cc_owner,card_number,expiry_month,expiry_year,cvv,
        merchant_id,user_ip,merchant_oid,email,
        payment_type,payment_amount,request_exp_date,currency,test_mode,non_3d,merchant_ok_url,
        merchant_fail_url,user_name,user_address,user_phone,
        basket,debug_on,client_lang,token,non3d_test_fail,installment_count,"bonus"
    ).enqueue(object : Callback<ResponseBody>{
        override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
            htmlStringRepo.value = response.body()!!.string()
        }

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

备选方案:循环生成直到Token不含“+”

如果因业务限制必须使用普通Base64编码,可以通过循环调用生成函数,直到得到不含+的Token:

修改makeOrder函数:

fun makeOrder(){
    generateOdemeInfo()
    odemeStateAl(merchant_oid)
    var token: String
    // 循环生成,直到Token不含+
    do {
        token = createSignature3(hash_str+merchant_salt,merchant_key)
    } while (token.contains("+"))
    
    oDao.makeOrder(
        cc_owner,card_number,expiry_month,expiry_year,cvv,
        merchant_id,user_ip,merchant_oid,email,
        payment_type,payment_amount,request_exp_date,currency,test_mode,non_3d,merchant_ok_url,
        merchant_fail_url,user_name,user_address,user_phone,
        basket,debug_on,client_lang,token,non3d_test_fail,installment_count,"bonus"
    ).enqueue(object : Callback<ResponseBody>{
        override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
            htmlStringRepo.value = response.body()!!.string()
        }

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

注意:循环方案存在极小概率的性能问题(极端情况可能多次重试),优先推荐URL安全Base64的方案。

内容的提问来源于stack exchange,提问作者Sezai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:00:02