官方范例为java
public boolean verify(String sign , String appKey , String orderId) throws UnsupportedEncodingException{ if(sign.length()<14){ return false; } String verityStr = sign.substring(0,8); sign = sign.substring(8); String temp = MD5Util.toMD5(sign); if(!verityStr.equals(temp.substring(0,8))){ return false; } String keyB = sign.substring(0,6); String randKey = keyB+appKey; randKey = MD5Util.toMD5(randKey); byte[] signB = Base64.decodeFast(sign.substring(6)); int signLength = signB.length; String verfic=""; for(int i =0 ; i< signLength ; i++){ char b = (char)(signB[i]^randKey.getBytes()[i%32]); verfic +=String.valueOf(b); } return verfic.equals(orderId); }
Elixir
def verifyPayment(appkey, %{"tradeSign" => tradeSign} = params) do sign_length = String.length(tradeSign) if sign_length < 14 do false else verityStr = String.slice(tradeSign, 0, 8) sign = String.slice(tradeSign, 8, sign_length + 1) temp = Utils.md5_sign(sign) temp = String.slice(temp, 0, 8) if verityStr == temp do keyB = String.slice(sign, 0, 6) randKey = keyB <> appkey randKey = Utils.md5_sign(randKey) signB = String.slice(sign, 6, sign_length + 1) |> Base.decode64! |> String.to_char_list randKey = randKey |> String.to_char_list signedOrderId = signB |> Enum.with_index |> Enum.map fn({c, i}) -> Bitwise.bxor c, Enum.at(randKey, rem(i, 32)) end params["orderID"] == signedOrderId else false end end end