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
相关产品推荐
相关产品推荐

