java chinapay_通过PHP/Java Bridge来实现ecshop的chinapay支付接口

常心水
2023-12-01

背景:

最近弄ecshop网上商城这个系统,需要提供对中国银联支付支持,从网上查了一些资料,发现chinapay对php支持并不是十分友好。需要扩展编译啥的,似乎很麻烦。网上资料不是很多,php实现chinapay接口,网上流传三种解决方案,1.参照chianpay官方文档,来对php进行扩展编译,似乎很麻烦而且可移值性差。2.php的自带java桥,网上说不是很稳定3.linys提供的解决方案,但没有找到源代码。

chinapy提供的java版jar包,在windows下和linux下应该都没有问题。我在网上发现php调用java,还可以通过PHP/Java Bridge来实现这个功能。于是采用PHP/Java Bridge来调用java实现chinapay支付接口。

材料说明:

1.PHP/Java Bridge安装文件

从其官方网站下载http://php-java-bridge.sourceforge.net/pjb/download.php

我下载的是Binary版本的。具体的为JavaBridgeTemplate554experimental.war.zip

2. chinapay提供的java版NetPayClinet2.5 for java包

3. Jdk6,tomcat6安装文件

下载地址分别为:http://download.java.net/jdk6/和http://archive.apache.org/dist/tomcat/tomcat-6/

步 骤:

1.安装jdk和部署tomcat

这一步不多述,如果不是熟悉可以问问您身边的java朋友或上网google,资料很多。

2.安装PHP/Java Bridge

将下载安装文件JavaBridgeTemplate554experimental.war.zip解压,并将文件夹重命名为JavaBridge,方便记忆。

再将NetPayClinet2.5 for java包中的netpayclient.jar包搞到JavaBridge/WEB-INF/lib文件下。

然后将JavaBridge这个文件夹整个拷到tomcat根目录下webapps文件下。

然后进入tomcat根目录下bin文件夹,启动tomcat。

在浏览器中输入http://localhost:8080/JavaBridge 显示页面。注 我用的时候在windows下有些异常,但不影响php调用应该没有什么问题,在linux下则是正常。

3.配置php.ini

找到php.ini这个文件,将里面的allow_url_include参数改为on,如果没有找到这个参数,自己添加一下就行了。具体如下:

; Whether to allow include/require to open URLs (like http:// or ftp://) as files.

allow_url_include = on

1

2

3

;Whethertoallowinclude/requiretoopenURLs(likehttp:// or ftp://) as files.

allow_url_include=on

写一个简单测试php调用java文件test.php

其代码如下:

<?php

require_once("http://localhost:8080/JavaBridge/java/Java.inc");

$System = java("java.lang.System");

echo $System->getProperties();

?>

1

2

3

4

5

<?php

require_once("http://localhost:8080/JavaBridge/java/Java.inc");

$System=java("java.lang.System");

echo$System->getProperties();

?>

将其放在htdocs下面,在浏览器中输入http://localhost/test.php 如果出现一些环境信息,则说明环境配对了.

4.php调用chianpay的jar包实现signOrder和verifyTransResponse两个函数。

其signOrder函数核心代码如下:

/*

*php通过JavaBridge远程调用java的chinapay组件获取签名。

*/

function signOrder($MerId,$OrdId,$TransAmt,$CuryId,$TransDate,$GateId,$merkey_file,$java_inc_file){

//加载javainc文件,初始化java环境

require_once(“http://localhost:8080/JavaBridge/java/Java.inc”);

//导入私钥文件

$objectKey = new java("chinapay.PrivateKey");

$buildKeyResult = $objectKey->buildKey($MerId,0,$merkey_file);

//生成签名值

if($buildKeyResult==true){

$chinapayLink = new java("chinapay.SecureLink",$objectKey);

$checkValue = $chinapayLink->signOrder($MerId,$OrdId,$TransAmt,$CuryId,$TransDate,$GateId);

}else{

return false;

}

return $checkValue;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

/*

*php通过JavaBridge远程调用java的chinapay组件获取签名。

*/

functionsignOrder($MerId,$OrdId,$TransAmt,$CuryId,$TransDate,$GateId,$merkey_file,$java_inc_file){

//加载javainc文件,初始化java环境

require_once(“http://localhost:8080/JavaBridge/java/Java.inc”);

//导入私钥文件

$objectKey=newjava("chinapay.PrivateKey");

$buildKeyResult=$objectKey->buildKey($MerId,0,$merkey_file);

//生成签名值

if($buildKeyResult==true){

$chinapayLink=newjava("chinapay.SecureLink",$objectKey);

$checkValue=$chinapayLink->signOrder($MerId,$OrdId,$TransAmt,$CuryId,$TransDate,$GateId);

}else{

returnfalse;

}

return$checkValue;

}

其verifyTransResponse函数核心代码如下:

/*

*php通过JavaBridge远程调用java的chinapay组件验证签名。

*/

function verifyTransResponse($merId, $ordId,$transAmt,$curyId,$transDate,$transType, $orderStatus, $chkValue){

$payment = get_payment(basename(__FILE__, '.php'));

//加载javainc文件,初始化java环境

require_once(“http://localhost:8080/JavaBridge/java/Java.inc”);

$pubkey = $payment['chinapay_pubkey_file'];

//导入公钥文件 重新计算密钥的值

$objectKey = new java("chinapay.PrivateKey");

$buildKeyResult = $objectKey->buildKey("999999999999999",0,$pubkey);

//验证签名

if($buildKeyResult==true){

$chinapayLink = new java("chinapay.SecureLink",$objectKey);

$verifyTransResponseResult = $chinapayLink->verifyTransResponse($merId, $ordId,$transAmt,$curyId,$transDate,$transType, $orderStatus, $chkValue);

return $verifyTransResponseResult;

}else{

return false;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

/*

*php通过JavaBridge远程调用java的chinapay组件验证签名。

*/

functionverifyTransResponse($merId,$ordId,$transAmt,$curyId,$transDate,$transType,$orderStatus,$chkValue){

$payment=get_payment(basename(__FILE__,'.php'));

//加载javainc文件,初始化java环境

require_once(“http://localhost:8080/JavaBridge/java/Java.inc”);

$pubkey=$payment['chinapay_pubkey_file'];

//导入公钥文件 重新计算密钥的值

$objectKey=newjava("chinapay.PrivateKey");

$buildKeyResult=$objectKey->buildKey("999999999999999",0,$pubkey);

//验证签名

if($buildKeyResult==true){

$chinapayLink=newjava("chinapay.SecureLink",$objectKey);

$verifyTransResponseResult=$chinapayLink->verifyTransResponse($merId,$ordId,$transAmt,$curyId,$transDate,$transType,$orderStatus,$chkValue);

return$verifyTransResponseResult;

}else{

returnfalse;

}

}

5.php的调用java版ecshop chinapay插件源代码

chinapay主要参数配置及完整实现代码   见附件

 类似资料: