Verifone 将于 2024 年 4 月 15 日在其平台上停止支持 MD5 算法,并强制用户使用 SHA。有必要使用他们的指南创建的一些哈希来响应 IPN 通知。
这是 Java 上的一段代码,通过 MD5 算法创建带有哈希值的响应正文:
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
String responseBody(IpnRequest request, VerifoneApiKey secret) {
var ipnPidValues = request.id();
var ipnNameValues = request.get(IPN_PNAME);
var ipnDateValue = request.get(IPN_DATE);
List<String> toEncrypt = ImmutableList.of(
ipnPidValues, ipnNameValues, ipnDateValue, ipnDateValue
);
var hash = hmacMd5(toEncrypt, secret.getValue());
var responseBody = format("<EPAYMENT>%s|%s</EPAYMENT>", ipnDateValue, hash);
return responseBody;
}
String hmacMd5(Collection<String> values, String key) {
checkCanEncrypt(values);
checkNotEmptyOrBlank(key);
var toEncrypt = compose(values);
var md5HashFunction = Hashing.hmacMd5(key.getBytes(UTF_8));
return encrypt(toEncrypt, md5HashFunction);
}
String compose(Collection<String> values) {
return values.stream()
.map(s -> byteLength(s) + s)
.collect(Collectors.joining());
}
int byteLength(String str) {
return str.getBytes(UTF_8).length;
}
此部分有效,Verifone 将 IPN 标记为已成功发送,但当
Hashing.hmacMd5
更改为 Hashing.hmacSha256
或 Hashing.hmacSha512
时,Verifone 表示通知发送时出现错误并尝试重新发送。