方法一:(传输十六进制)
直接将返回的二进制数据,转换成十六进制,然后发送给java
实例:
$post=array('app_key'=>'ce387668d26157','code'=>'a0b92382');
$key='123456';
$data=_rc4($key,json_encode($post));
$data=bin2hex($data);/*二进制转换为十六进制*/
echo$data;/*传送给java*/
function _rc4($pwd, $data){
$key[] = "";
$box[] = "";
$pwd_length = strlen($pwd);
$data_length = strlen($data);
for ($i = 0; $i < 256; $i++) {
$key[$i] = ord($pwd[$i % $pwd_length]);
$box[$i] = $i;
}
for ($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $key[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
$cipher = '';
for ($a = $j = $i = 0; $i < $data_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$k = $box[($box[$a] + ($box[$j]%256)) % 256];
$cipher .= chr(ord($data[$i]) ^ $k);
}
return $cipher;
}
方法二、(传输二进制)
1、汉字在php中换算成字节后跟java对不上的,按照规律在Rc4方法中加入了这么一行代码
$byte = (ord($data[$i]) >= 128)?(ord($data[$i]) - 256):ord($data[$i]);
2、对内容进行编码,可使用的编码方式 unicode 、urlencode...等
3、写流的时候 使用UTF-8编码 (实现不了可以使用utf8_encode,当然接收的时候就也需要加上utf8_decode)
实例:这里使用的是unicode
$post = array ('app_key'=>'ce387668d26157', 'code' => 'a0b92382');
$key = '123456';
$json =json_encode($post,JSON_UNESCAPED_UNICODE);
$data = enRc4($key,unicode_encode($json));
echo utf8_encode($data);/*传送给java*/
function enRc4($key,$data){
$vactor[]='';
$tempK[]='';
$k_len = strlen($key);
$data_len = strlen($data);
for ($i = 0; $i < 256; $i++) {
$tempK[$i] = ord($key[$i % $k_len]);
$vactor[$i] = $i;
}
for($j=$i=0;$i<256;$i++){
$j = ($j+$vactor[$i]+$tempK[$i])%256;
$temp = $vactor[$i];
$vactor[$i] =$vactor[$j];
$vactor[$j] = $temp;
}
$cipher = '';
for ($i = $j = $x = 0; $x < $data_len; $x++) {
$i = ($i + 1) % 256;
$j = ($j + $vactor[$i]) % 256;
$tmp = $vactor[$i];
$vactor[$i] = $vactor[$j];
$vactor[$j] = $tmp;
$k = $vactor[($vactor[$i] + ($vactor[$j]%256)) % 256];
$byte = (ord($data[$x]) >= 128)?(ord($data[$x]) - 256):ord($data[$x]);
$cipher .= chr($byte ^ $k);
}
return $cipher;
}
//将内容进行UNICODE编码,编码后的内容格式:\u56fe\u7247 (原始:图片)
function unicode_encode($name)
{
$name = iconv('UTF-8', 'UCS-2', $name);
$len = strlen($name);
$str = '';
for ($i = 0; $i < $len - 1; $i = $i + 2){
$c = $name[$i];
$c2 = $name[$i + 1];
if (ord($c) > 0){ //两个字节的文字
$str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);
} else {
$str .= '\u'.str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);
}
}
return $str;
}