Elixir木蚂蚁支付服务器验签名方法

官方范例为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
原文地址:https://www.cnblogs.com/jasonduan/p/4671106.html