PHP调用JAVA方式

1.     背景

在开发招商银行信用卡分期付款功能过程中,在支付成功之后需要对银行的返回数据进行签名验证,因签名加密方式招商银行是不提供的,只提供了相应的JAVA验证类测试例子,而本项目采用的是PHP架构方式,因此需要PHP调用JAVA的验证类来测试签名是否正确。

2.     目的

本文档提供一种PHP调用JAVA类的方式来进行招行的支付成功签名验证,本方法也可用于其他银行的JAVA签名验证方式。

3.     名词解释

名词

解释说明

php-java-bridge

PHP和JAVA的连接桥

4.     php-java-bridge安装和配置介绍

4.1 安装

Php-java-bridge下载路径:

http://sourceforge.net/projects/php-java-bridge/files/RHEL_FC%20SecurityEnhancedLinux/php-java-bridge_5.4.4.2/

最新php-java-bridge版本是php-java-bridge_6.2.1.tar.gz

解压之后采用/usr/local/php/phpize进行模块编译,提示Cannot find config.m4,版本过高问题,采用了5.4.4.2版本。

编译及安装:

tar zxvf php-java-bridge_5.4.4.2.tar.gz

cd php-java-bridge-5.4.4.2/

/usr/local/php/bin/phpize

./configure --disable-servlet --with-java=/usr/local/java/,/usr/local/java/jre --with-php-config=/usr/local/php/bin/php-config

make && make install

4.2 配置

vim /usr/local/php/etc/php.ini

[新增]

extension=java.so

[java]

java.java_home="/usr/local/java/"

java.java="/usr/local/java/jre/bin/java"

java.log_file="/var/log/php-java-bridge.log"

java.classpath="/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/JavaBridge.jar"

java.libpath="/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/"

java.log_level="3"

java.hosts="10.204.79.232:8081"

4.3 启动

重新启动nginx或者apache,输入<?php phpinfo();?>可以看到

java support

Enabled

java bridge

5.4.4.2

java.log_level

2

手动启动javaBridge

java -jar JavaBridge.jar SERVLET:8080&

也可以尝试使用java -jar JavaBridge.jar SERVLET_LOCAL:8081&

4.4 测试

解压javaBridge.jar,取出java目录下相关的Java.inc文件

测试代码:

require_once("java/Java.inc");

$string = new Java("java.lang.String", "HelloWorld");

echo $string;

$system=new Java("java.lang.System");

echo "Java version=".$system->getProperty("java.version")." ";

注意:java/Java.inc记得从javaBridge.jar解压出来放在相关php代码中

注意取值:java_is_true java_is_false java_values

5.     注意事项及配置过程中的问题

下述描述在实际配置测试过程中可能会碰到的问题及解决方法:

5.1  问题

问题1:

configure: error: host_alias is not set. Make sure to run config.guess

Back-end configuration failed.

Please install the recommended autoconf, libtool and automake versions

or disable back-end configuration and use the pre-compiled J2EE back-end:

./configure --disable-backend --with-java=<JAVA_HOME>

configure: error: ./configure.gnu failed for server

安装yum install libtool即可

5.2  注意事项

事项1:

远程调用require_once('http://10.204.79.231:8080/JavaBridget/java/Java.inc');需要设置php.ini的allow_url_include参数为on,同时编辑 JavaBridge 部署的 Web 应用程序目录中的 web.xml 文件,如下:

取消对这个部分的注释,以便允许对您的 Java 类进行远程访问

<init-param>
  <param-name>promiscuous</param-name>
  <param-value>On</param-value>
</init-param>

事项2:

在实际生产环境中,考虑到如果每台机器都部署一个JavaBridge服务的话,不好维护。故考虑在单台或2台左右机器上部署,其他机器连接到部署机器上,可以做分流承压的功效并且易监控。在外网环境下发现在调用部署环境的内外网IP都无法获取到指定文档。实际require_once本质就是调用部署环境的java.inc文件,可以考虑把相关文件放在本地生产环境上,但在引用Java_require相关JAR包会提示连接不到JavaBridge服务,阅读Java.inc可以查看它会通过几个地方设置JAVA_HOST宏变量,第一种是通过require_once里面的IP或者域名和端口,另外一种是在未设置JAVA_HOST宏变量的前提下读取php.ini,如果都没有java.hosts参数则默认为127.0.0.1:8080。

排除第一种方式如果采用读取php.ini的话,因为本身java.hosts参数不属于PHP可人为设置的参数,采用ini_set函数并不能指定java.hosts的值,所以一种方式是在所有项目的生产环境的php.ini都指定内网IP和端口,如java.hosts=10.204.79.231:8080。还有一种方式,查阅Java.inc可以看到是在未设置JAVA_HOST变量的前提下是去读取php.ini,我们可以在require_once('java/Java.inc')之前新增一行define ("JAVA_HOSTS", $host)。

5.3  参考例子

个人的实际测试代码如下:

private function _checkSign($strText, $strSign){

$ret = false;

try{

$host = ConfigWrapper::load()->services->phpjava->host;

if($host != NULL){

define ("JAVA_HOSTS", $host);

}

require_once('java/Java.inc');

java_require(self::CMBJAR);

$pay = new Java('testCdpaySign', self::CERFILE);

$result = $pay->checkSign((string)$strText, (string)$strSign);

if(java_is_true($result) == 1){

$ret = true;

}

}catch (\Exception $e) {

Logger::debug("_checkSign = " . $e->getMessage());

}

return $ret;

}

6.     参考链接

http://blog.sina.com.cn/s/blog_51a5e5f40100cxie.html

http://www.cnblogs.com/benio/archive/2010/09/27/1837027.html

http://wangduowu.iteye.com/blog/310846

http://www.tuicool.com/articles/uYVRfu

http://www.ibm.com/developerworks/cn/aix/library/au-javaphpaix5/

http://blog.sina.com.cn/s/blog_5f857be30100u6wp.html

http://www.oicto.com/ecshop-chinapay/

http://www.cppblog.com/zzfmars/archive/2011/04/10/143875.html

http://sourceforge.net/projects/php-java-bridge/files/RHEL_FC%20SecurityEnhancedLinux/php-java-bridge_5.4.4.2/

 

php调用java的更多相关文章

  1. oracle调用JAVA类的方法

    导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了,  1.操作系统需要拥有支持loadjava命令的jdk.  2.加 ...

  2. android webView开发之js调用java代码示例

    1.webView设置 webView.getSettings().setJavaScriptEnabled(true);//设置支持js webView.addJavascriptInterface ...

  3. Android 使用js调用Java

    效果如: 主要用到一个接口类:MyObject package com.example.jsdemo; import android.content.Context; import android.s ...

  4. 关于c#调用java中间件api的几个问题

    由于项目需要,做的c#客户端数据库连接串首先肯定不能写死的程序里(数据库很容易被攻击,我们的项目半年改了几次密码...) 放置在配置文件内,都可以看得到,最开始想法将配置文件加密,老师说加密过的文件还 ...

  5. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  6. JNI中C调用Java方法

    背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...

  7. 规则引擎集成接口(七)规则引擎调用Java类

    规则引擎调用Java类 通过myEclipse编写一个简单工程,其中方法是两数相加等到结果,既结果1=输入值1+输入值2.实现规则调用外部接口的方法有三种. 1:接口实例:在myEclipse中制作一 ...

  8. oracle 调用java

    1.首先在PL/SQL中创建JAVA类,并编译 例如:这个是到的一个查询目录下面文件列表的java类 创建此java 类用: create or replace and compile java so ...

  9. C#调用Java方法(详细实例)

    C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL C#调用c++ C#调用 ...

  10. JNI系列——C文件中的方法调用Java中方法

    1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...

随机推荐

  1. bzoj3112 [Zjoi2013]防守战线

    正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...

  2. php生成二维码的几种方式整理及使用实例

    hp生成二维码的方式:1.google开放api:2.php类库PHP QR Code:3.libqrencode:4.QRcode Perl CGI & PHP scripts感兴趣的朋友可 ...

  3. Unity 总裁 John Riccitiello 发话:VR足以匹敌互联网

    在2017年Vision Summit大会的开幕演讲中,Unity首席执行官John Riccitiello向观众通报了开发人员如何利用Oculus,HTC等品牌创造的机遇来打造虚拟现实(VR)行业, ...

  4. 源于《Unity官方实例教程 “Space Shooter”》思路分析及相应扩展

    教程来源于:Unity官方实例教程 Space Shooter(一)-(五)       http://www.jianshu.com/p/8cc3a2109d3b 一.经验总结 教程中步骤清晰,并且 ...

  5. oracle linux 6.5 安装 oracle 12cR2数据库(2)-DBCA建库

    援引:http://www.cnblogs.com/kerrycode/p/3386917.html  by 潇湘隐者 Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引 ...

  6. shell入门笔记1:执行方式、运行方式、变量、替换

    说明: 本文是关于http://c.biancheng.net/cpp/shell/的相关笔记 shell的两种执行方式 交互式(interactive) 解释执行用户的命令,用户输入一条命令,She ...

  7. java环境安装之不能安装exe文件

    经过多年,打算再学下java 从官网下载java8安装包,但因为我的计算机的cd-room被卸载掉了,安装是报错说cab文件损坏之类的错误. 从stackOverflow中找到一篇眼前一亮的解决办法. ...

  8. [刷题]算法竞赛入门经典(第2版) 5-14/UVa1598 - Exchange

    题意:模拟买卖,当出售价bid等于或低于出售价ask,则交易. 代码:(Accepted,0.330s) //UVa1598 - Exchange //Accepted 0.330s //#defin ...

  9. 设计模式浅谈----策略模式(c#及java实现)

    一.何为策略模式 策略模式是行为型模式的一种,主要用于需要使用不同的算法来处理不同的数据对象时使用,是一种可以在运行时选择算法的设计模式.也称为政策模式. 主要解决:在有多种算法相似的情况下,使用 i ...

  10. 基于python的爬虫(一)

    抓取网页 python核心库 urllib2 实现对静态网页的抓取,不得不说,"人生苦短,我用python"这句话还是有道理的,要是用java来写,这估计得20行代码 (对不住了博 ...