中国农业银行网上支付平台
交易市场 PHP 商户接口编程指南
Java Edition
修订历史纪录
日期 版本 说明 作者
2009/11/18 初稿 童益柱
目录
1. ..................................................................................................................................................................简介 3
目的.............................................................................................................................................................3
功能描述.....................................................................................................................................................3
总体架构图.................................................................................................................................................3
2. 接口开发软件包说明 ..................................................................................................................4
3. 安装步骤 ......................................................................................................................................5
安装前检查.................................................................................................................................................5
系统配置.....................................................................................................................................................5
WEB SERVICES 接口应用配置 ...................................................................................................................5
配置测试应用.............................................................................................................................................6
4. 配置文件说明 ..............................................................................................................................7
5. 范例交易说明 ..............................................................................................................................8
交易流程.....................................................................................................................................................8
Web Services 技术的引入...................................................................................................................8
签约和解约交易 .................................................................................................................................8
交易开发说明...........................................................................................................................................10
开发环境的配置 ...............................................................................................................................10
编写 web services 接口函数 .............................................................................................................10
编写 php 接口 ...................................................................................................................................19
1. 简介
目的
提供商户端交易网站通过中国农业银行网上支付平台提供的商户端开发软件包实现功能的编
程指南。
功能描述
按照本编程指南所描述的标准,商户交易网站可以呼叫调用,支持功能包括签约、解约请
求、挂单、撤单交易、实时成交、追加货款交易、确认付款交易、退货交易、批量撤单、批量成
交、批量交易结果查询、到期支付,并且具备接收信用支付平台结果响应等功能。
接口采用数字证书的方式来保证商户与信用支付平台间的身份验证、中间信息传递的完整
性,以便进行电子商务安全当中非常重要的交易身份辨识、不可抵赖、防止篡改等功能。
总体架构图
中国农业银行
网上支付平台
Interne
t
商户
交易网站服务器
消费者
发
起
交
易
交易请求 / 响应
进行交易
Web Services
服务器
2. 接口开发软件包说明
银行提供的接口开发软件包 ( 为接口开发软件包的
版本号)包含下列文档。
文件名称 说明
/docs/农行网上支付平台-交易市场商户接口编程指南-PHP-
本文件
/lib/
农行网上支付平台商户端接口 Java
软件包。
/lib/
农 行 网 上 支 付 平 台 商 户 端 Web
Services 接口范例软件包。
/lib/ 接口配置文件
/lib/
供参考的 Tomcat 应用服务器,包含
相关配置
/lib/ Php 接口
/demo/ 接口范例首页
/demo/ 签约请求交易 php 范例页面 1
/demo/ 签约请求交易 php 范例页面 2
/demo/ 解约请求交易 php 范例页面 1
/demo/ 解约请求交易 php 范例页面 2
/cert/ 生产环境农行根证书
/cert/ 测试环境农行根证书
/cert/ 生产环境网上支付平台证书
/cert/ 测试环境网上支付平台证书
其他范例页面和文档参考“信用平台商户接口编程指南”
备注:由于 php 接口是对原有 java 接口基础上的进一步封装,所以需要参考 java 接口的相关文档和范例
3. 安装步骤
安装前检查
1、本接口软件包采用 JDK 标准,php5 标准,请检查已经安装了 php5 和 或以上版
本的 jvm。
系统配置
本文档以 _18 版本为 JVM, 作为 Web Services 服务器, 作
为 SOAP 解析引擎为例,介绍如何在 linux 平台下构建商户端 Web Services 服务器环境及部署接口应
用。
1、下载 ,解压缩后放置安装目录下,下载 axis-src-1_3,将 axis 文件夹放
入$CATALINA_HOME\webapps 目录下。
注:均已提供在“供参考的 Tomcat 应用服务器”中。
2、安装 _18。在 中设置环境变量:
export JAVA_HOME=/opt/IBM/was6admin/_18(根据实际安装路径来设置)
export JAVA_OPTS=" -Xms256m -Xmx1024m"
3、在$CATALINA_HOME\bin 下命令行方式下,键入:./ start 启动服务器,然后在
浏览器中键入地址 :8080/axis/,查看能否正常启动。
Web Services 接口应用配置
1、将银行提供的接口开发软件包 ( 为接口开发软
件包的版本号)解压缩到商户自定的安装目录中。
2、请参考《农行网上支付平台 -商户使用手册 》登录网上支付平台下载商户交易证书,
并将商户交易证书保存到服务器的硬盘或签名服务器中。
3、将商户的证书文件夹 Certificate 放入$CATALINA_HOME\bin 目录下,包括商户服务器证书
*.pfx,农行根证书 (生产环境证书,测试环境证书为 )和支付平台证书
(生产环境证书,测试环境证书为 )。
4、将 文件放置到$CATALINA_HOME\webapps\axis\WEB-
INF\classes 目录下,该文件包含银行端访问地址,商户 id,相关证书路径,证书密码的配置,日志路径
等。商户需要注意进行正确的配置(具体参考配置文件说明)。将 java 接口包 EMarketClient-
文件放入$CATALINA_HOME\webapps\axis\WEB-INF\lib 下。
5、将 Web Services 接口包 放入
$CATALINA_HOME\webapps\axis\WEB-INF\lib 下。在 lib 下加入包 ,,
,,。
6、将 Web Services 配置文件 放入$CATALINA_HOME\webapps\axis\WEB-
INF 中。
7、修改$CATALINA_HOME\webapps\axis\WEB-INF 的 文件,添加 log4j 初始化的
servlet 配置,并在该目录下建立文件夹 config,放置 配置文件(该文件中,可以指定
web services 段代码日志输出格式及输出地址)。这里我们默认的日志是放在$CATALINA_HOME\logs
下。
8、重新启动 tomcat 应用服务器。
9、通过 php 调用 web services 接口,从而与农行电子商务系统进行交互。
注:以上 配置均已提供在“供参考的 Tomcat 应用服务器”中,以供参考。
配置测试应用
1、配置 WebApp,指向接口软件包安装目录\demo。
2、开启浏览器进入
包是否已正确安装及配置。
4. 配置文件说明
配置段 参数名称 数值类型 说明
TrustPayConnectMethod 字符串
信用支付平台通讯方式
http:使用 HTTP 通讯方式
https:使用 HTTPS 通讯方式(必需)
TrustPayServerName 字符串
信用支付平台服务器名
可以使用服务器的域名或服务器的 IP 地址
TrustPayServerPort 数字 信用支付平台交易端口
TrustPayNewLine 数字
信用支付平台接口特性
1 或 2
TrustPayServerTimeOut 数字 信用支付平台服务超时时间 毫秒
TrustPayTrxURL 字符串 信用支付平台交易网址
TrustPayCertFile 字符串 信用支付平台证书
TrustStoreFile 字符串 农行根证书文件
信用支付平台
系统配置段
* 请 依 照 银 行 的
指示设定
TrustStorePassword 字符串 农行根证书文件密码
商户资料段 MerchantID 字符串 商户编号
LogPath 字符串 日志文件存放绝对目录。*请勿输入文件名
MerchantKeyStoreType 数字
证书储存媒体
0: File
1: 硬件签名服务器
MerchantCertFile 字符串
商户证书储存目录档名
当 KeyStoreType=0 时,必须设定。
必须为 PKCS#12 的文件格式。
MerchantCertPassword 字符串
商户私钥加密密码
当 KeyStoreType=0 时,必须设定。
SignServerIP 字符串
签名服务器 IP 地址
当 KeyStoreType=1 时,必须设定。
SignServerPort 数字
签名服务器端口
当 KeyStoreType=1 时,必须设定。
商户系统配置段
SignServerPassword 字符串
签名服务器密码
当 KeyStoreType=1 时,必须设定。
5. 范例交易说明
在 java 接口的相关说明文档中,已经给出了如何利用农行提供的 java 接口包进行商户接口开发的
说明,请参考“信用平台商户接口编程指南”。php 商户由于不能直接在程序中
调用农行 java 接口,所以需要通过一个中间件间接调用农行 java 接口,本文档以交易市场中典型的签
约和解约交易为例,介绍如何进行对农行 java 接口包的间接调用。
注意:由于 php 系统商户接口开发是对 java 接口包进行的一个封装调用,所以商户在开发过程
中,需要首先熟悉 java 接口包的使用,运行 java 接口包中的 demo 页面。
交易流程
本节将说明商户交易平台如何与网上支付平台通信,来完成交易的过程。
Web Services 技术的引入
由于 php 商户在 php 程序中不能直接调用农行提供的 java 接口包,所以我们需要一种机制使得可
以在 php 程序中间接调用 java 接口包。Web Services 技术就可以提供这样一种功能。
Web Services 技术是由业界领袖 IBM、Microsoft 等公司倡导使用,并由国际标准组织 W3C、ws-i
等制定了 SOAP、WSDL 等协议和规范,使得 Web Services 技术可以将已有的功能代码进行封装发
布,凡遵循 Web Services 技术规范的其他平台和程序都可以通过 SOAP 协议进行访问。所以,将农行
java 接口利用 Web Services 技术进行功能封装,就可以在 php 程序中进行跨平台、跨语言访问。
下面,本文档将交易市场中常用的签约解约功能进行 Web Services 封装,并通过 php 程序进行跨
平台调用访问,商户开发人员可以参考这两支交易,进行其它接口功能的开发。
签约和解约交易
签约或解约交易因为需要三方的配合(客户、商户交易网站、信用支付平台),且交易流程是分
两阶段进行,所以商户交易平台针对每个交易需要开发两个主要的程序才能完成整个签约或解约交易
流程,此两支程序为“签约或解约请求程序”及“签约或解约结果接收程序”。交易流程如下图所述:
交易开发说明
开发环境的配置
1、商户模拟系统:Window
php 开发环境安装:
1)安装 版本
2)配置 php 环境(C:\WINDOWS\),添加 soap 支持(修改 配置文件中
extension=),
中文支持( 中修改:extension_dir = "C:/php/ext",ext 目录中放入 )
2、Web Services 环境:linux
java 开发环境:
1)安装
2)安装 eclipse 开发环境(eclipse )
3)安装 Tomcat 应用服务器()
备注:商户模拟系统和 Web Services 环境既可以部署在 Windows 平台,也 Linux 平台上,本
文档以上述配置环境为例进行说明。
编写 web services 接口函数
编写 Web Services 接口函数可以参考 java 接口包中提供的 demo 页面代码,将这些 demo 中的 java
代码翻译到一个 java 接口函数中。具体如下:
1、签约请求
签约请求的 Web Services 接口函数编写需要参考 java 接口包中的 ,该 jsp 文件
中,将客户输入的参数进行封装,然后调用农行 java 接口,从而与农行电子商务系统进行交互。
文件的代码如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import = ".*" %>
<%@ page import = ".*" %>
<%@ page import = "" %>
<%@ page import = "" %>
<%
("GBK");
("Cache-Control", "no-cache"); %>
<%
//1、取得客户签名信息
String tRequestID = ("RequestID");
String tCustSignInfo = ("CustSignInfo");
String tCustName = ("CustName");
String tMerchantName = ("MerchantName");
String tNeedTwoCheck = ("NeedTwoCheck");
//2、生成签约请求对象 s
SignUpRequest tRequest = new SignUpRequest();
(tCustSignInfo); //客户签名信息(必要信息)
(tRequestID); //请求流水号(必要信息)
();
(_SIGNUP);
(tCustName); //客户名称(必要信息)
(tMerchantName); //交易市场名称(必要信息)
(tNeedTwoCheck); //是否需要双人复核
//3、传送商户身份验证请求并取得结果
TrxResponse tResponse = ();
String sReturnMsg = ();
String sReturnCode = ();
%>
<HTML>
<HEAD>
<TITLE>中国农业银行</TITLE>
</HEAD>
<BODY BGCOLOR='#FFFFFF' TEXT='#000000' LINK='#0000FF' VLINK='#0000FF' ALINK='#FF0000'>
<table>
<tr>
<td><b>客户签约</b></td>
</tr>
<%
//4、判断签约结果状态,进行后续操作
if (())
{
String sMerchantID = ();
String sFunctionID = ();
String sCustomer = ();
String sFunctionName = "签约交易";
%>
<tr>
<td><%=sFunctionName %>交易成功</td>
</tr>
<tr>
<td>商户编号: <%=sMerchantID%></td>
</tr>
<tr>
<td>客户编号: <%=sCustomer%></td>
</tr>
<tr>
<td>交易返回结果: <%=sReturnMsg%></td>
</tr>
<%
}
else
{
%>
<tr>
<td>交易失败</td>
</tr>
<tr>
<td>错误代码: <%=sReturnCode%></td>
</tr>
<tr>
<td>错误信息: <%=sReturnMsg%></td>
</tr>
<%
}
%>
</table>
<br>
<a href=''>回商户首页</a>
</BODY></HTML>
根据此 jsp demo 文件,我们编写的签约 Web Services 接口函数 signUp_php 如下:
/**
*
* @author tongyizhu
* 在提供给Web Services php客户端调用的接口中,返回值result以数组形式进行传递,其中result[0]中存储农行
客户端接口请求成功返回
* 的实质内容,result[1]存储标识请求是否成功的一个布尔型变量,result[2]中存储农行客户端接口请求的返回
码,result[3]存储农行客户端接口请求的
* 错误信息
*/
public Object[] signUp_php(
String tCustSignInfo,
String tRequestID,
String tCustName,
String tMerchantName,
String tNeedTwoCheck) {
("In signUp_php");
("Parameters:");
(
"tCustSignInfo:"
+ tCustSignInfo
+ "###tRequestID:"
+ tRequestID
+ "###tCustName:"
+ tCustName
+ "###tMerchantName:"
+ tMerchantName
+ "###tNeedTwoCheck:"
+ tNeedTwoCheck);
Object[] result = new Object[4];
//1、生成签约请求对象s
SignUpRequest tRequest = new SignUpRequest();
(tCustSignInfo); //客户签名信息(必要信息)
(tRequestID); //请求流水号(必要信息)
();
(_SIGNUP);
(tCustName); //客户名称(必要信息)
(tMerchantName); //交易市场名称(必要信息)
(tNeedTwoCheck); //是否需要双人复核
// 4、传送直接支付请求并取得支付网址
TrxResponse tResponse = ();
String sReturnMsg = ();
String sReturnCode = ();
String sMerchantID = ();
String sFunctionID = ();
String sCustomer = ();
if (()) {
//6、支付请求提交成功,将客户端导向支付页面
("MerchantID-->" + sMerchantID);
("Customer-->" + sCustomer);
("ReturnMsg-->" + sReturnMsg);
Object[] data1 = new Object[3]; //返回信息
result[0] = data1;
data1[0] = sMerchantID;
data1[1] = sCustomer;
data1[2] = sReturnMsg;
result[1] = new Boolean(true);
} else {
result[1] = new Boolean(false);
result[2] = ();
result[3] = ();
(
"ReturnCode = [" + () + "]");
(
"ErrorMessage = [" + () + "]");
}
return result;
}
可见,在 jsp 文件中,商户传递的所有参数,如请求流水号(tRequestID)是通过如下代码从请求
中读取的。而 Web Services 接口函数由于是供其他程序调用的,所以这些参数是通过函数参数的方式
传入的。
tRequestID = ("RequestID");
和 jsp 程序中相仿,在 signUp_php 接口函数中,也是通过将所有输入参数封装成 java 接口包中的
SignUpRequest 对象,然后调用 postRequest()方法与农行电子商务系统进行交互,从而得到农行系统的返
回结果。signUp_php 接口函数通过将农行系统返回的结果封装在 result 对象数组中,返回给 php 系统,php
系统提取出返回结果,进行下一步的操作。
2、解约请求
解约请求与签约请求类似,需要参考 java 接口包中的 ,该 jsp 文件中,将客户输
入的参数进行封装,然后调用农行 java 接口,从而与农行电子商务系统进行交互。
文件的代码如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import = ".*" %>
<%@ page import = ".*" %>
<%@ page import = "" %>
<%@ page import = "" %>
<%
("GBK");
("Cache-Control", "no-cache"); %>
<%
//1、取得客户签名信息
String tRequestID = ("RequestID");
String tCustSignInfo = ("CustSignInfo");
String tCustName = ("CustName");
String tMerchantName = ("MerchantName");
String tCustomer = ("Customer");
//2、生成签约请求对象
SignUpRequest tRequest = new SignUpRequest();
(tCustSignInfo); //客户签名信息(必要信息)
(tRequestID); //请求流水号(必要信息)
(tCustomer);
();
(_SIGNOFF);
(tCustName); //客户名称(必要信息)
(tMerchantName); //交易市场名称(必要信息)
//3、传送商户身份验证请求并取得结果
TrxResponse tResponse = ();
String sReturnMsg = ();
String sReturnCode = ();
String sCustomer = ();
%>
<HTML>
<HEAD>
<TITLE>中国农业银行</TITLE>
</HEAD>
<BODY BGCOLOR='#FFFFFF' TEXT='#000000' LINK='#0000FF' VLINK='#0000FF' ALINK='#FF0000'>
<table>
<tr>
<td><b>客户解约</b></td>
</tr>
<%
//4、判断签约结果状态,进行后续操作
if (())
{
String sMerchantID = ();
String sFunctionID = ();
String sFunctionName = "解约交易";
%>
<tr>
<td><%=sFunctionName %>交易成功</td>
</tr>
<tr>
<td>商户编号: <%=sMerchantID%></td>
</tr>
<tr>
<td>交易返回结果: <%=sReturnMsg%></td>
</tr>
<tr>
<td>客户编号: <%=sCustomer%></td>
</tr>
<%
}
else
{
%>
<tr>
<td>解约失败</td>
</tr>
<tr>
<td>错误代码: <%=sReturnCode%></td>
</tr>
<tr>
<td>错误信息: <%=sReturnMsg%></td>
</tr>
<tr>
<td>客户编号: <%=sCustomer%></td>
</tr>
<%
}
%>
</table>
<br>
<a href=''>回商户首页</a>
</BODY></HTML>
根据此 jsp demo 文件,我们编写的签约 Web Services 接口函数 signOff_php 如下:
/**
*
* @author tongyizhu
* 在提供给Web Services php客户端调用的接口中,返回值result以数组形式进行传递,其中result[0]中存储农行
客户端接口请求成功返回
* 的实质内容,result[1]存储标识请求是否成功的一个布尔型变量,result[2]中存储农行客户端接口请求的返回
码,result[3]存储农行客户端接口请求的
* 错误信息
*/
public Object[] signOff_php(
String tCustSignInfo,
String tRequestID,
String tCustomer,
String tCustName,
String tMerchantName) {
("In signOff_php");
("Parameters:");
(
"tCustSignInfo:"
+ tCustSignInfo
+ "###tRequestID:"
+ tRequestID
+ "###tCustomer:"
+ tCustomer
+ "###tCustName:"
+ tCustName
+ "###tMerchantName:"
+ tMerchantName);
Object[] result = new Object[4];
//1、生成签约请求对象s
SignUpRequest tRequest = new SignUpRequest();
(tCustSignInfo); //客户签名信息(必要信息)
(tRequestID); //请求流水号(必要信息)
(tCustomer);
();
(_SIGNOFF);
(tCustName); //客户名称(必要信息)
(tMerchantName); //交易市场名称(必要信息)
// 4、传送直接支付请求并取得支付网址
TrxResponse tResponse = ();
String sReturnMsg = ();
String sReturnCode = ();
String sCustomer = ();
String sMerchantID = ();
String sFunctionID = ();
if (()) {
//6、支付请求提交成功,将客户端导向支付页面
("客户编号(Customer)-->" + sCustomer);
("商户编号(MerchantID)-->" + sMerchantID);
("交易返回结果(ReturnMsg)-->" + sReturnMsg);
Object[] data1 = new Object[3]; //返回信息
result[0] = data1;
data1[0] = sMerchantID;
data1[1] = sCustomer;
data1[2] = sReturnMsg;
result[1] = new Boolean(true);
} else {
result[1] = new Boolean(false);
result[2] = ();
result[3] = ();
(
"ReturnCode = [" + () + "]");
(
"ErrorMessage = [" + () + "]");
}
return result;
}
和 jsp 程序中相仿,在 signOff_php 接口函数中,也是通过将所有输入参数封装成 java 接口包中的
SignUpRequest 对象(该对象既可以作为签约请求类也可以作为解约请求类),然后调用 postRequest()方
法与农行电子商务系统进行交互,从而得到农行系统的返回结果。signOff_php 接口函数通过将农行系统返
回的结果封装在 result 对象数组中,返回给 php 系统,php 系统提取出返回结果,进行下一步的操作。
可见,web services 接口编写,只需参考 java 接口包中提供的 jsp demo 程序即可完成。开发编译通
过后,将所有的 class 文件导出到$CATALINA_HOME\webapps\axis\WEB-INF\lib 目录下,命名为
(该文件在提供的 Tomcat 目录下已经存在,直接覆盖更新即可)。
重新启动 Tomcat,然后在浏览器中输入 :8080/axis/servlet/AxisServlet(如果是其他机器
上,则输入相应的 ip),查看页面上是否已经有开发的接口存在。
编写 php 接口
:8080/axis/servlet/AxisServlet
开发完成 Web Services 接口只是完成了 php 接口开发工作的一半,下一步工作就是如何在商户系
统中进行对 Web Services 接口的调用。
这里我们需要开发 php api 接口,通过这些接口完成对 Web Services 的调用,下面给出签约的 php
api 接口代码(在 demo 文档 中)。
/*
SignUp
*/
class SignUp{
protected
$address,
$tRequestID,
$tCustSignInfo,
$tCustName,
$tMerchantName,
$tNeedTwoCheck;
private $res;
public function __construct($address,$signUpRequest)
{
$this->address = $address;
$this->tRequestID = $signUpRequest->tRequestID;
$this->tCustSignInfo = $signUpRequest->tCustSignInfo;
$this->tCustName = $signUpRequest->tCustName;
$this->tMerchantName = $signUpRequest->tMerchantName;
$this->tNeedTwoCheck = $signUpRequest->tNeedTwoCheck;
}
public function invoke()
{
//print("<br>"."!!!!!!"."</br>");
$client=new SoapClient($this->address, array("style"=> SOAP_RPC,"use"=> SOAP_ENCODED,
"trace"=>0,"exceptions" =>0));
$client->soap_defencoding='utf-8';
$client->decode_utf8=false;
$result = $client->signUp_php($this->tCustSignInfo,$this->tRequestID,$this->tCustName,$this-
>tMerchantName,$this->tNeedTwoCheck);
$this->res = (array)$result;
return $this->generateResponse();
}
private function generateResponse()
{
if($this->res[1]==TRUE)
{
$signUpDetail = new SignUpDetail($this->res[0][0],$this->res[0][1],iconv("UTF-8",
"GBK",$this->res[0][2]));
}
$signUpResult = new SignUpResult($signUpDetail,$this->res[1],iconv("UTF-8", "GBK",$this-
>res[2]),iconv("UTF-8", "GBK",$this->res[3]));
return $signUpResult;
}
public function showResult()
{
if($this->res[1]==TRUE)
{
}
else
{
print("<br>Failed!!!"."</br>");
print("<br>return code:".iconv("UTF-8", "GBK",$this->res[2])."</br>");
print("<br>Error Message:".iconv("UTF-8", "GBK",$this->res[3])."</br>");
}
}
}
class SignUpRequest
{
public
$tRequestID,
$tCustSignInfo,
$tCustName,
$tMerchantName,
$tNeedTwoCheck;
public function __construct($tCustSignInfo,$tRequestID,$tCustName,$tMerchantName,$tNeedTwoCheck)
{
$this->tCustSignInfo = $tCustSignInfo;
$this->tRequestID = $tRequestID;
$this->tCustName = $tCustName;
$this->tMerchantName = $tMerchantName;
$this->tNeedTwoCheck = $tNeedTwoCheck;
}
}
class SignUpResult{
public $signUpDetail,$isSucess,$returnCode,$ErrorMessage;
public function __construct($signUpDetail,$isSucess,$returnCode,$ErrorMessage)
{
$this->signUpDetail=$signUpDetail;
$this->isSucess=$isSucess;
$this->returnCode=$returnCode;
$this->ErrorMessage=$ErrorMessage;
}
}
class SignUpDetail{
public $MerchantID,$CustomerNo,$ReturnMsg;
public function __construct($MerchantID,$CustomerNo,$ReturnMsg)
{
$this->MerchantID=$MerchantID;
$this->CustomerNo=$CustomerNo;
$this->ReturnMsg=$ReturnMsg;
}
}
在商户 php 系统中,将客户的签约页面输入封装成一个 SignUpRequest 类对象,然后构建一个
SignUp 类对象,该对象初始化时以 Web Services 访问地址和 SignUpRequest 类对象作为参数,然后通
过调用 php5 中 提供的 Web Services 调用模块进行 Web Services 调用。具体来说,就是构
建一个 SoapClient 对象,通过该对象调用 signUp_php 接口。得到的返回结果是一个含 4 个元素的对象
数组,最终被封装在 SignUpResult 中,返回给调用页面,从而进行后续操作。
下面给出签约的模拟商户页面程序 ,该页面程序是模仿 java 接口包中提供的
代码进行编写的, 的代码如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import = "" %>
<%@ page import = "" %>
<HTML>
<script language="javascript">
var now = new Date();
var year = ();
var month = eval(())+1 ;
month = eval(month)<10?'0'+month:month;
var day = () ;
day = eval(day)<10?'0'+day:day;
var reqID = "RSU"+(year+'').substring(2,4)+month+day+"001";
var sign_merchantid = '<%=_SIGN_MERCHANTID%>'
var sign_merchantid_desc = '<%=_SIGN_MERCHANTID_DESC%>'
var sign_merchanttrxno = '<%=_SIGN_TRXNO%>'
var sign_merchanttrxno_desc = '<%=_SIGN_TRXNO_DESC%>'
var sign_functionid = '<%=_SIGN_FUNCTIONID%>'
var sign_functionid_desc = '<%=_SIGN_FUNCTIONID_DESC%>'
var sign_MerchantName = '<%=_SIGN_MERCHANTNAME%>'
var sign_MerchantName_desc = '<%=_SIGN_MERCHANTNAME_DESC%>'
var sign_CustName = '<%=_SIGN_CUSTNAME%>'
var sign_CustName_desc = '<%=_SIGN_CUSTNAME_DESC%>'
var sign_time = '<%=_SIGN_SIGNTIME%>'
var sign_time_desc = '<%=_SIGN_SIGNTIME_DESC%>'
function doSign(){
var signdate = new Date();
//客户端签名必须用的 javascript 方法,可和其它 javascript 方法合并
//把 放进[[...]]中,和 组成字符串。所有签名字段合成一个字符串
var signstring = sign_merchantid +
+ sign_merchanttrxno +
+ sign_functionid + '<%=_SIGNUP%>'
+ sign_MerchantName +
+ sign_CustName +
+ sign_time + signdate;
var TempString;
TempString="<客户签约确认>\n\n";
TempString= TempString+sign_functionid_desc+"交易市场签约"+"\n";
TempString= TempString+sign_merchanttrxno_desc++"\n";
TempString= TempString+sign_MerchantName_desc++"\n";
TempString= TempString+sign_merchantid_desc++"\n";
TempString= TempString+sign_CustName_desc++"\n";
TempString= TempString+sign_time_desc+now;
var sure = confirm("请确认您要提交的签名信息:\n\n" + TempString);
if(sure == false) {
numIndex = 0;
return false;
}
(signstring);
(TempString);
();
= ;
if( == 0)
return false;
();
}
</script>
<HEAD><TITLE>农行网上支付平台-商户接口范例-签约请求</TITLE></HEAD>
<BODY BGCOLOR='#FFFFFF' TEXT='#000000' LINK='#0000FF' VLINK='#0000FF' ALINK='#FF0000'>
<object classid=clsid:62B938C4-4190-4F37-8CF0-A92B0A91CC77
codebase="" data=data:application/x-
oleobject;base64,xDi5YpBBN0+M8KkrCpHMdwADAACJEwAAPAcAAA==
id=InfoSecNetSign1 style="HEIGHT: 0px; WIDTH: 0px" VIEWASTEXT width="0" height="0">
<embed width="0" height="0" src="data:application/x-
oleobject;base64,xDi5YpBBN0+M8KkrCpHMdwADAACJEwAAPAcAAA==">
</embed>
</object>
<CENTER>用户注册</CENTER>
<FORM name='form1' action='' method='POST'>
<TABLE>
<TR>
<TD>请求流水号:</TD>
<TD><input type="text" name="RequestID" value=""></TD>
</TR>
<TR>
<TD>商户号:</TD>
<TD><input type="text" name="MerchantID" value="000010000200003"></TD>
</TR>
<TR>
<TD>商户名称:</TD>
<TD><input type="text" name="MerchantName" value="浙江测试商户"></TD>
</TR>
<TR>
<TD>客户名称:</TD>
<TD><input type="text" name="CustName" value="浙江测试客户"></TD>
</TR>
<TR>
<TD>是否需要双人复核:</TD>
<TD><input type="checkbox" name="NeedTwoCheck" value="2">是否需要双人复核 仅对企业设定
</TD>
</TR>
<TR>
<TD>客户签名:</TD>
<TD><input type="text" name="CustSignInfo" value=""></TD>
</TR>
<TR>
<TD colspan=2><INPUT type='BUTTON' VALUE='签约' onclick="doSign()"></TD>
<TR>
</TABLE>
</FORM>
<CENTER><a href=''>回商户首页</a></CENTER>
</BODY>
<script>
("RequestID").value = reqID;
</script>
</HTML>
的代码如下:
<HTML>
<?php
require("");
$tMarketTagName = new IMarketTagName();
?>
<script language="javascript">
var now = new Date();
var year = ();
var month = eval(())+1 ;
month = eval(month)<10?'0'+month:month;
var day = () ;
day = eval(day)<10?'0'+day:day;
var reqID = "RSU"+(year+'').substring(2,4)+month+day+"001";
var sign_merchantid = "[[MerchantID]]";
var sign_merchantid_desc = "交易市场编号:";
var sign_merchanttrxno = "[[MerchantTrxNo]]";
var sign_merchanttrxno_desc = "交易流水号:";
var sign_functionid = "[[FunctionID]]";
var sign_functionid_desc = "交易名称:";
var sign_MerchantName = "[[MerchantName]]";
var sign_MerchantName_desc = "交易市场名称:";
var sign_CustName = "[[CustName]]";
var sign_CustName_desc = "客户名称:";
var sign_time = "[[_time]]";
var sign_time_desc = "签约时间:";
function doSign(){
var signdate = new Date();
//客户端签名必须用的 javascript 方法,可和其它 javascript 方法合并
//把 放进[[...]]中,和 组成字符串。所有签名字段合成一个字符串
var signstring = sign_merchantid +
+ sign_merchanttrxno +
+ sign_functionid + '0000'
+ sign_MerchantName +
+ sign_CustName +
+ sign_time + signdate;
var TempString;
TempString="<客户签约确认>\n\n";
TempString= TempString+sign_functionid_desc+"交易市场签约"+"\n";
TempString= TempString+sign_merchanttrxno_desc++"\n";
TempString= TempString+sign_MerchantName_desc++"\n";
TempString= TempString+sign_merchantid_desc++"\n";
TempString= TempString+sign_CustName_desc++"\n";
TempString= TempString+sign_time_desc+now;
var sure = confirm("请确认您要提交的签名信息:\n\n" + TempString);
if(sure == false) {
numIndex = 0;
return false;
}
(signstring);
(TempString);
();
= ;
if( == 0)
return false;
();
}
</script>
<HEAD><TITLE>农行网上支付平台-商户接口范例-签约请求</TITLE></HEAD>
<BODY BGCOLOR='#FFFFFF' TEXT='#000000' LINK='#0000FF' VLINK='#0000FF' ALINK='#FF0000'>
<object classid=clsid:62B938C4-4190-4F37-8CF0-A92B0A91CC77
codebase="" data=data:application/x-
oleobject;base64,xDi5YpBBN0+M8KkrCpHMdwADAACJEwAAPAcAAA==
id=InfoSecNetSign1 style="HEIGHT: 0px; WIDTH: 0px" VIEWASTEXT width="0" height="0">
<embed width="0" height="0" src="data:application/x-
oleobject;base64,xDi5YpBBN0+M8KkrCpHMdwADAACJEwAAPAcAAA==">
</embed>
</object>
<CENTER>用户注册</CENTER>
<FORM name='form1' action='' method='POST'>
<TABLE>
<TR>
<TD>请求流水号:</TD>
<TD><input type="text" name="RequestID" value=""></TD>
</TR>
<TR>
<TD>商户号:</TD>
<TD><input type="text" name="MerchantID" value="333100000000022"></TD>
</TR>
<TR>
<TD>商户名称:</TD>
<TD><input type="text" name="MerchantName" value="浙江测试商户"></TD>
</TR>
<TR>
<TD>客户名称:</TD>
<TD><input type="text" name="CustName" value="浙江测试客户"></TD>
</TR>
<TR>
<TD>是否需要双人复核:</TD>
<TD><input type="checkbox" name="NeedTwoCheck" value="2">是否需要双人复核 仅对企业设定
</TD>
</TR>
<TR>
<TD>客户签名:</TD>
<TD><input type="text" name="CustSignInfo" value=""></TD>
</TR>
<TR>
<TD colspan=2><INPUT type='BUTTON' VALUE='签约' onclick="doSign()"></TD>
<TR>
</TABLE>
</FORM>
<CENTER><a href=''>回商户首页</a></CENTER>
</BODY>
<script>
//("RequestID").value = reqID;
</script>
</HTML>
对比可见,这两个文件代码基本相同,需要注意的修改的有以下几点:
1) 中将 中引用到的 java 常量值都写成了具体值,如:
var sign_merchantid = "[[MerchantID]]";
这些 java 常量值在 和 中可以查找得到。
备注,“<object classid”段为签名用到的控件。
页面显示客户需要输入的内容,客户输入完毕提交后, 会将此请求
提交到 , 就是负责封装客户输入参数,调用 php api 进行 web
services 调用的功能代码,代码如下:
<html>
<head>
<title>TrustPay - 农行网上支付平台-商户接口范例</title>
<meta http-equiv='Content-Type' content='text/html; charset=GB2312'>
</head>
<body>
<?php
require("");
//$add = ":8080/axis/services/MarketWrapper?wsdl";
//$add = ":8080/axis/services/MarketWrapper?wsdl";
$add = ":8080/axis/services/MarketWrapper?wsdl";
$tRequestID = $_POST['RequestID'];
$tCustSignInfo = $_POST['CustSignInfo'];
$tCustName = iconv("GBK","UTF-8",$_POST['CustName']);
$tMerchantName = iconv("GBK","UTF-8",$_POST['MerchantName']);
$tNeedTwoCheck = $_POST['NeedTwoCheck'];
$signUpRequest = new
SignUpRequest($tCustSignInfo,$tRequestID,$tCustName,$tMerchantName,$tNeedTwoCheck);
$signUp = new SignUp($add,$signUpRequest);
$signUpResult = $signUp->invoke();
//显示结果
if($signUpResult->isSucess==TRUE)
{
print("<br>签约请求"."</br>");
print "<br>商户编号(MerchantID):".$signUpResult->signUpDetail->MerchantID."</br>";
print "<br>客户编号(CustomerNo):".$signUpResult->signUpDetail->CustomerNo."</br>";
print "<br>交易返回结果(ReturnMsg):".$signUpResult->signUpDetail->ReturnMsg."</br>";
}
else
{
print("<br>Failed!!!"."</br>");
print("<br>return code:".$signUpResult->returnCode."</br>");
print("<br>Error Message:".$signUpResult->ErrorMessage."</br>");
}
?>
</body>
</html>
可见,该页面首先将客户输入参数封装成一个 SignUpRequest 对象,然后传入 Web Services 访问地址和
SignUpRequest 对象构建 SignUp 对象,再调用 invoke()方法进行 Web Services 调用,从而得到返回结果,进行下一步操
作。
解约的 php 接口与签约类似,具体参考 demo 代码文件。