您的位置:首页 > 理论基础 > 计算机网络

PHP建设银行支付网络回调验签

2018-01-13 10:08 351 查看
最近在做建行支付接口,商户到银行的已经通了,现在遇到的问题就是当用户交易完成之后建行会给指定URL回复交易信息,其中有一段是SIGN签名,使用MD5withRSA这个算法,接口文档上简单介绍了下算法。验证操作总结分三步:

1) 使用公钥进行签名的逆运算

2) 使用标准MD5算法运算原文

3) 比较1)、2)结果。

其中就卡在了第一步,参考了demo,demo里基本上都是在windows平台下验证的,其中代码如下:
$strSrc=$_POST['src'];<br data-filtered="filtered">
$strSign=$_POST['sign'];<br data-filtered="filtered">
$strPubKey=$_POST['pubkey'];<br data-filtered="filtered">
<br data-filtered="filtered">
$rsasig=new COM("CCBRSA.RSASig");<br data-filtered="filtered">
$rsasig->setpublickey($strPubKey);<br data-filtered="filtered">
$strRet=$rsasig->StringVerifySigature($strSign,$strSrc);


问题是建行的CCBRSA.DLL很久没有更新了,目前在win2003还可以使用,在2008以上的32位系统及64位系统上根本无法使用。

在咨询建行相关人员,得到的回复是只能在服务器上安装java环境,使用官方提供的jar包建立socket通信,然后在php里通过socket客户端来实现数据通信,进行验签。

1.搭建java环境

首先要搭建java环境,本处案例是采用linux服务器,具体的java环境搭建参考 
http://blog.csdn.net/xinxin19881112/article/details/46816385。我使用的jdk安装包是“jdk-8u131-linux-x64.tar.gz”,可从oracle官网下载,linux上需要先卸载原有的opensdk里的java程序,再安装下载的jdk。 

(说明:安装jdk1.4及以上版本,商户验签包使用jdk1.4编译)

jdk安装完成后,将xml配置文件(名称:ccbnetpayconfig.xml)和jar包(官方提供,名称为:ccbnetpaysign.jar)放在同一目录下

2.配置xml文件

xml配置文件:
配置文件名称:ccbnetpayconfig.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 中国建设银行商户通知验签配置文件 -->

<ccbnetpayconfig>

<!-- 通讯端口1024~65535之间未被使用的端口 -->
<commport>
<value>55533</value>
</commport>

<!-- 通讯端口1024~65535之间未被使用的端口 -->
<maxconn>
<value>5</value>
</maxconn>

<!-- 可按照不同的柜台号配置不同的公钥 -->
<merpos>

<!-- 商户柜台号 -->
<posid>100001329</posid>

<!-- 对应的公钥 -->
<pubkey>30819d300d06092a864886f70d010101050003818b0030818702818100ad10ae07fe299a3993a129153502ca809aff9f9f0059af33a80da26453c0ec7abafc8ba677c869aaaedc6a1a0c59087af329696d5d2eb29750fa70b1b1a35c076e61703711e2fae8251f0ec760976d3f2f7d78ce566b251ffcfe9ed5d5881f8239def691a100f41cde2b9889faeaef72165e9aeaf0a58079f76a796caa806d87020111</pubkey>
</merpos>

<merpos>
<posid>100001321</posid>    <pubkey>kkk19d300d06092a864886f70d010101050003818b0030818702818100ad10ae07fe299a3993a129153502ca809aff9f9f0059af33a80da26453c0ec7abafc8ba677c869aaaedc6a1a0c59087af329696d5d2eb29750fa70b1b1a35c076e61703711e2fae8251f0ec760976d3f2f7d78ce566b251ffcfe9ed5d5881f8239def691a100f41cde2b9889faeaef72165e9aeaf0a58079f76a796caa806d87020111</pubkey>
</merpos>

</ccbnetpayconfig>
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
31
32
33

参数说明: 

1.comport:socket通讯端口。配置文件中默认为55533,商户可在0-65535之间选择空置端口,建议使用1024-65535之间的空置端口。 

2.maxconn:处理验签的线程数。系统默认为5,商户可按照实际情况配置。 

3.merpos: 商户柜台信息,对于有多个柜台的商户可循环配置。 

4.Posid:商户柜台号。 

5.Pubkey:柜台号对应的公钥。

3.1.4 JAR包的运行方法

方法1. 默认方式将jar包和xml配置文件放在相同目录,在该目录下执行:
java -jar ccbnetpaysign.jar
1

方法2. 指定文件路径:
java –jar jar包路径 配置文件绝对路径
java –jar /opt/ccbsign/ccbnetpaysign.jar /etc /config/cbnetpayconfig.xml
java -jar ./cc/ccbnetpaysign.jar C:\hxj\cc\ccbnetpayconfig.xml
1
2
3

正常执行状态下控制台输出:server is running on PORT: 55533 

等待外部连接。

4.php连接socket验签
<?php

function get_data_from_server($address, $service_port, $send_data) {
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket创建失败原因: " . socket_strerror($socket) . "\n";
} else {
echo "socket_create OK,HE HE.\n";
}
$result = socket_connect($socket, $address, $service_port);
if ($result < 0) {
echo "SOCKET连接失败原因: ($result) " . socket_strerror($result) . "\n";
} else {
echo "OK.\n";
}
//发送命令
$in = $send_data;
$out = '';
echo "Send ..........";
socket_write($socket, $in, strlen($in));
echo "OK.\n";
echo "Reading Backinformatin:\n\n";
while ($out = socket_read($socket, 2048)) {
echo $out;
}
echo "Close socket........";
socket_close($socket);
echo "OK,He He.\n\n";
return $out;
}

echo "aaaaaa";

echo get_data_from_server("127.0.0.1",55533,"POSID=100001329&BRANCHID=500000000&ORDERID=GWA10081217305965959&PAYMENT=0.01&CURCODE=01&REMARK1=&REMARK2=&SUCCESS=Y&TYPE=1&REFERER=http://114.255.7.208/page/bankpay.do&CLIENTIP=114.255.7.194&SIGN=9a7efc7f15f4b0e7f8fba52649d6b97ae33fad44598a7ca1c26196e8ddba00ecf91a596346e4bfd3cc6d2bdba6c085a3cdb0f231d865d7856e37de89846a371c8bc09f8f2643284260499e1d3f464d9ca9d379fe8af3202a09fc83d39f5c68501a4627d62a3ae891d4b0ff6aa21d61f6ba0e9c8bc5840b292af853d2736ce04a\n");

?>
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
31
32
33
34
35
36

上面的涉及到配置信息的内容,为官方文档提供的配置信息,本地实现不一定为有效信息,具体以建行提供给商户的配置信息来实现。

根据以上内容,验签工作实现成功。

另外,可以通过nohup 命令将启动jar包的启动命令设置为后台运行,这样退出操作界面,也能保证验签程序的存活了。 

步骤:
    1.进入jar包目录
2.nohupjava -jar ccbnetpaysign.jar &
3.exit命令退出(注:一定要输入exit退出,直接关闭nohup命令会无效)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: