第一步:将字符串转换成十六进制
function String2Hex($string){
$hex='';
for ($i=0; $i < strlen($string); $i++){
$hex .= "\u".dechex(ord($string[$i]));
}
return $hex;
}
第二步:让经过转换的字符串与java的编码保持一致
function unicode_decode($unistr, $encoding = 'UTF-8', $ishex = false, $prefix = '&#', $postfix = ';') {
$arruni = explode($prefix, $unistr);
$unistr = '';
for($i = 1, $len = count($arruni); $i < $len; $i++) {
if (strlen($postfix) > 0) {
$arruni[$i] = substr($arruni[$i], 0, strlen($arruni[$i]) - strlen($postfix));
}
$temp = $ishex ? hexdec($arruni[$i]) : intval($arruni[$i]);
$unistr .= ($temp < 256) ? chr(0) . chr($temp) : chr($temp / 256) . chr($temp % 256);
}
return iconv('UCS-2', $encoding, $unistr);
}
调用示例:
function make_sign($sign_str){
$s = self::String2Hex($sign_str);
//md5加密
$md5_str = md5(self::unicode_decode($s,'utf-8',true,'\u',''));
return strtoupper( $md5_str );
}
需求原因:
在访问京东CPS链接转换的API时,他只适配java的 md5 加密,而php的编码和java不同,所以直接通过 md5 加密之后不能返回正确的数据,通过以上方法将php编码转换成java编码然后再加密,最终得到了正确的返回数据。