背景:最近公司接入第三方支付,提供了相關jar包,但是公司項目使用的是TP5框架,故此研究了一下TP5項目中配置php_java_bridge來調用jar包的方法。
先本地windows上配置測試,測試成功後再通過寶塔面板配置到centos7環境中,通過寶塔面板配置步驟相對簡單。
一、安裝Java。windows下的安裝可參考網上的教程,centos7中通過寶塔面板,可以直接安裝tomcat8,也可以安裝Java項目管理器,通過它安裝tomcat8,安裝tomcat8會附帶安裝jdk1.8。
二、配置php_java_bridge。
1、下載JavaBridgeTemplate721.war
進入網站http://sourceforge.net/projects/php-java-bridge/files,選擇Binarypackage,
然後選擇最新的版本Php-java-bridge_7.2.1,下載JavaBridgeTemplate721.war;
2、把JavaBridgeTemplate721.war放到tomcat下webapps,
啓動tomcat,tomcat就會解析該文件,然後產生一個同名文件夾,tomcat的在這裏的主要作用就是這個(用完可以關掉);
3、啓動方法。
進入該文件夾下/WEB-INF/lib目錄,
windows執行命令:java -jar JavaBridge.jar SERVLET_LOCAL:8081 &
linux下執行命令:java -jar /www/server/tomcat8/webapps/JavaBridgeTemplate721/WEB-INF/lib/JavaBridge.jar SERVLET_LOCAL:8081 &
也可在配置文件中添加此命令開機執行(rc.local 文件要配置執行權限!否則無效):
編輯 vi /etc/rc.local
將命令添加到結尾,注意這裏肯定要JavaBridge.jar的完整路徑;
爲確保JavaBridge.jar保持運行狀態,可以通過寶塔面板添加計劃任務,選擇shell腳本,腳本內容如下:
#!/bin/bash
#判斷進程是否存在,如果不存在就啓動它
PIDS=`ps -ef |grep 'JavaBridge.jar' |grep -v grep | awk '{print $2}'`
if [ "$PIDS" == "" ]; then
echo "JavaBridge.jar is starting!"
#else
#運行進程
java -jar /www/server/tomcat8/webapps/JavaBridgeTemplate721/WEB-INF/lib/JavaBridge.jar SERVLET_LOCAL:8081 &
fi
三、對第三方提供的jar包,通過安裝eclipse插件查看源碼進行重寫,或者瞭解jar包中要調用類的路徑。調試OK後將項目導出爲可運行的jar文件(如果選擇的不是該選項,linux環境中可能調用不到),複製到步驟一安裝目錄下的jdk1.8.0_181\jre\lib\ext文件夾中。
四、TP5項目中,使用composer安裝php_java_bridge依賴包,命令:composer require soluble/japha,安裝包地址:https://packagist.org/packages/soluble/japha。
TP5項目中調用示例:
use Soluble\Japha\Bridge\Adapter as BridgeAdapter;
use Soluble\Japha\Bridge\Exception as BridgeException;
class Rsautil
{
private $bridge;
private $java;
public function __construct()
{
#--實例化php_java_bridge:
$options = [
'servlet_address' => 'localhost:8081/php-servlet.jar',
'driver' => 'pjb62'
];
try {
#--實例化java類:
$java = $this->java = new BridgeAdapter($options);
#--測試調用java系統類:
/*$props = $java->java("java.lang.System")->getProperties();
$array = $java->values($props);
foreach ($array as $k => $v) {
echo "$k=>$v";
echo "<br>\n";
}
echo "<br>\n";*/
#--調用自定義java類:
$this->bridge = $java->java("com.third.ReadP12Cert");
} catch (BridgeException\ConnectionException $e) {
#--無法訪問服務器:
echo $e->getMessage();
}
}
/**
* 調用jar包中的loadPrivateKey類,從證書文件中裝入私鑰
* @return 私鑰
* @throws Exception
*/
public function loadPrivateKey()
{
$res = self::$bridge->loadPrivateKey();
$res = $this->java->values($res);
($res) or die('您使用的私鑰格式錯誤,請檢查私鑰配置');
return $res;
}
}