標籤:
官方範例為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
Elixir木螞蟻支付伺服器驗簽名方法