php调用java
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下载路径:
最新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
php调用java的更多相关文章
- oracle调用JAVA类的方法
导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了, 1.操作系统需要拥有支持loadjava命令的jdk. 2.加 ...
- android webView开发之js调用java代码示例
1.webView设置 webView.getSettings().setJavaScriptEnabled(true);//设置支持js webView.addJavascriptInterface ...
- Android 使用js调用Java
效果如: 主要用到一个接口类:MyObject package com.example.jsdemo; import android.content.Context; import android.s ...
- 关于c#调用java中间件api的几个问题
由于项目需要,做的c#客户端数据库连接串首先肯定不能写死的程序里(数据库很容易被攻击,我们的项目半年改了几次密码...) 放置在配置文件内,都可以看得到,最开始想法将配置文件加密,老师说加密过的文件还 ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- JNI中C调用Java方法
背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...
- 规则引擎集成接口(七)规则引擎调用Java类
规则引擎调用Java类 通过myEclipse编写一个简单工程,其中方法是两数相加等到结果,既结果1=输入值1+输入值2.实现规则调用外部接口的方法有三种. 1:接口实例:在myEclipse中制作一 ...
- oracle 调用java
1.首先在PL/SQL中创建JAVA类,并编译 例如:这个是到的一个查询目录下面文件列表的java类 创建此java 类用: create or replace and compile java so ...
- C#调用Java方法(详细实例)
C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL C#调用c++ C#调用 ...
- JNI系列——C文件中的方法调用Java中方法
1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...
随机推荐
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化
本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...
- [KISSY5系列]淘宝全终端框架 KISSY 5--从零开始使用
KISSY 是淘宝一个开源的 JavaScript 库,包含的组件有:日历.图片放大镜.卡片切换.弹出窗口.输入建议等 一.简介 KISSY 是一款跨终端.模块化.高性能.使用简单的 JavaScri ...
- [Git]03 如何查看提交历史
在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 gitlog 命令查看. 常用命令 1.查看提交历史 $ git log 2.查看某个文件或者某个目录的递交历史 $ gi ...
- linux操作系统中对大小端的判断
static union { char c[4]; unsigned long l; } endian_test = { { 'l', '?', '?', 'b' } }; #define ENDIA ...
- CKEditor不借助CKFinder实现图片上传(.net版 ashx实现)
参考博客:http://blog.csdn.net/mydwr/article/details/8669594 本人版本:4.4.6 打开文件:ckeditor/plugins/image/dialo ...
- java泛型探索——小特性
泛型特性(小篇幅) 1. 补充介绍一些常见的泛型特性: 类型参数T可以是recursive(类似递归性),它的边界可以是类型参数是自身的接口或类. 如我实现寻找最大值的方法,可以这么写: public ...
- JAVA的HashTable源码分析
Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长.Hashtable ...
- 解决ssh或ftp下root用户认证失败问题
问题:当连接ssh远程终端或使用ftp方式进行文件传输时,使用普通用户可以进行远程登录,但使用root用户则认证失败,提示密码错误.而我们在普通用户登录下,su - root,验证密码,是可以正常切换 ...
- 如何显示mnist中的数据(tensroflow)
在使用mnist数据集的时候,一直想看看数据中原来的图片,还有卷积层.池化层中的图片,经过不断的捣鼓,最后终于显示了出来.只看数据集中的图片用如下代码就好了: import tensorflow. ...
- 主机通过host-only虚拟网卡连接VBOX虚拟机
主机通过host-only虚拟网卡连接VBOX虚拟机 How to set up host-only virtual machines that host can access it... 问题 因为 ...