使用php实现快钱支付功能(涉及到接口)
程序员文章站
2022-05-26 13:39:44
本项目用zend framework框架实现的modules/default/controllers/indexcontroller.phpindexcontroller....
本项目用zend framework框架实现的
modules/default/controllers/indexcontroller.php
indexcontroller.php
<?php
class indexcontroller extends zend_controller_action
{
public function init()
{
/* initialize action controller here */
}
public function indexaction()
{
/*模拟订单
*$mockorder是从数据库取出来的信息,它包含一些块钱request的信息。这里我写死了。
*orderid订单号,数据库表的主键(唯一)。 //必要字段
*usr_idtype证件类型,根据自己需要。
*usr_idcode证件号,根据自己需要。
*etx_status是否优惠,根据自己需要。
*time_create验证是否符合优惠的时间,根据自己需要。
*ets_license套餐代码如同商品类别,根据自己需要。
*contact_type联系方式类型,固定选择值1,2。1电子邮件,2手机号,根据自己需要,块钱那边可以为空。
*contact_text联系方式,根据contact_type来填写,根据自己需要,块钱那边可以为空。
*etsprice套餐价格及商品价格,根据自己需要。
*orderprice实际价格,根据自己需要。
*orderamount订单实际支付金额,这个要加手续费的。 //必要字段
*ordertime订单时间。 //必要字段
*paysuccess订单是否支付成功。 //必要字段
*buysuccess账号是否生成功,根据自己需要
*paytime订单支付成功时间。 //必要字段
*总之凡是跟订单有关的都是必要字段
*orderid、orderamount、ordertime为 request所需字段
*paysuccess、paytime为response所需字段
*/
$mockorder = array();
$mockorder['orderid'] = '100000125';//订单号。--必要
$mockorder['usr_idtype'] = '1';//证件类型,身份证
$mockorder['usr_idcode'] = '371111199011111111';//身份证号
$mockorder['etx_status'] = '0';//是否优惠,否
$mockorder['time_create'] = '1352338189';//验证是否优惠时间
$mockorder['ets_license'] = '1';//套餐代码及商品类别
$mockorder['contact_type'] = '1';//联系方式类型 1,邮箱
$mockorder['contact_text'] = 'x@163.com';//联系方式,邮箱
$mockorder['etsprice'] = '30800';//套餐价格及商品价格
$mockorder['orderprice'] = '30800';//实际价格
$mockorder['orderamount'] = '31100';//订单实际支付价格,加手续费的。--必要
$mockorder['ordertime'] = '1352338199';//订单生成时间。--必要
$mockorder['paysuccess'] = '0';//订单是否支付成功。--必要
$mockorder['buysuccess'] = '0';//账号是否生成成功
$mockorder['paytime'] = '0';//订单支付时间。--必要
//billrequest就是快钱那边需要的的一些参数
$this->view->billrequest = new application_model_billrequest($mockorder);
zend_debug::dump($this->view->billrequest);exit;
}
//bgurl地址指向这里
public function receiveaction()
{
//receive数据库设计
/*用$mockreceive数组模拟
* $mockreceive = array();
* $mockreceive['id']主键;
* $mockreceive['orderid']商户订单号;
* $mockreceive['receivetime']接受时间;
* $mockreceive['querystring']http_build_encode($_request);
* $mockreceive['dealid']快钱交易号;
* $mockreceive['bankdealid']银行交易号;
* $mockreceive['payresult']处理结果10:支付成功;11:支付失败;
* $mockreceive['dealtime']快钱交易时间;
* $mockreceive['payamount']订单实际支付金额;
* $mockreceive['fee']费用;
* $mockreceive['errcode']错误代码;
*/
/*$_request是快钱那边返回来的数据
* merchantacctid人民币账号,与提交订单时的块钱账号保持一致。
* version网关版本,固定值:v2.0,与提交订单时的网关版本号保持一致。
* language网页显示语言种类,1中文显示,与提交订单时的网页显示语言种类保持一致
* signtype签名类型,4pki签名,与提交订单时的签名类型保持一致
* paytype支付方式,00全部,与提交订单时的支付方式保持一致
* bankid银行代码
* orderid商户订单号,与提交订单时的商户订单号保持一致
* ordertime商户订单提交时间,与提交订单时的商户订单提交时间保持一致
* orderamount商户订单金额,与提交订单时的商户订单金额保持一致。
* dealid快钱交易号
* bankdealid银行交易号
* dealtime快钱交易时间
* payamount订单实际支付金额
* fee费用
* ext1扩展字段1,与提交订单时的扩展字段1保持一致
* ext2扩展字段2,与提交订单时的扩展字段2保持一致
* payresult处理结果 10:支付成功;11:支付失败
* errcode错误代码,可为空
* signmsg签名字符串
*/
$billresponse = new application_model_billresponse($_request);
//$billresponse->checksignmsg验证签名字符串是否正确,防止bug漏洞等
if($billresponse->checksignmsg){
//判断订单支付是否成功
if($billresponse->issuccess){
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这里是成功页面
return "<result>1</result><redirecturl>http://99bill/default/index/sucess</redirecturl>";exit;
}else{
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面
return "<result>1</result><redirecturl>http://99bill/default/index/fail</redirecturl>";exit;
}
}
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面
return "<result>1</result><redirecturl>http://99bill/default/index/fail</redirecturl>";exit;
}
//redirecturl地址
//成功
public function success()
{
}
//失败
public function fail()
{
}
}
modules/default/views/scripts/index/index.phtml
https://www.99bill.com/gateway/recvmerchantinfoaction.htm
<?php $billrequest = (array)$this->billrequest;?>
<div style="display:none;">
<form name="kqpay" action="https://www.99bill.com/gateway/recvmerchantinfoaction.htm" method="post">
<?php foreach($billrequest as $key => $val):?>
<input type="hidden" name="<?php echo $key;?>" value="<?php echo $val;?>"/>
<?php endforeach;?>
<input type="submit" name="submit" value="提交到快钱" id="kqpay">
</form>
</div>
<script>
document.getelementbyid('kqpay').click();
</script>
models/billrequest.php
billrequest.php
<?php
class application_model_billrequest
{
public function __construct($mockorder){
/*
* 人民币网关账号。
*第一种方式:该账号为11位人民币网关商户编号+01,该参数必填。01对应工商银行。
*第二种方式:该账号为16位人民币网关商户
*/
$this->merchantacctid = "1001011111101";
//服务器接收支付结果的后台地址,该参数务必填写,绝对路径//不能为空。
$this->bgurl = "http://99bill/default/index/receive";
//商户订单号,以下采用时间来定义订单号,商户可以根据自己订单号的定义规则来定义该值//不能为空。
$this->orderid = 'tolpc'.sprintf("%09d", $mockorder['orderid']);
//订单金额,金额以“分”为单位,商户测试以1分测试即可,切勿以大金额测试,该参数必填//不能为空
$this->orderamount =$mockorder['orderamount'];
//订单提交时间,格式:yyyymmddhhmmss,如:20071117020101//不能为空。
$this->ordertime = date("ymdhis", $mockorder['ordertime']);
//支付人姓名,可以为空。
$this->payername= "";
//支付人联系类型,1 代表电子邮件方式;2 代表手机联系方式。可以为空。
$this->payercontacttype = "";
//支付人联系方式,与payercontacttype设置对应,payercontacttype为1,则填写邮箱地址;payercontacttype为2,则填写手机号码。可以为空。
$this->payercontact = "";
//商品名称,可以为空。
$this->productname= "tolpc";
//商品数量,可以为空。
$this->productnum = "1";
//商品代码,可以为空。
$this->productid = $mockorder['ets_license'];
//商品描述,可以为空。
$this->productdesc = "";
//支付方式,一般为00,代表所有的支付方式。如果是银行直连商户,该值为10,必填//不能为空
$this->paytype = "00";
//编码方式,1代表 utf-8; 2 代表 gbk; 3代表 gb2312 默认为1,该参数必填//不能为空
$this->inputcharset = "1";
//网关版本,固定值:v2.0,该参数必填//不能为空
$this->version = "v2.0";
//语言种类,1代表中文显示,2代表英文显示。默认为1,该参数必填//不能为空
$this->language = "1";
//签名类型,该值为4,代表pki加密方式,该参数必填//不能为空
$this->signtype = "4";
//接收支付结果的页面地址,该参数一般置为空即可。
$this->pageurl = "";
//扩展字段1,商户可以传递自己需要的参数,支付完快钱会原值返回,可以为空。
$this->ext1 = $mockorder['orderid'];
//扩展自段2,商户可以传递自己需要的参数,支付完快钱会原值返回,可以为空。
$this->ext2 = $mockorder['ordertime'];
//银行代码,如果paytype为00,该值可以为空;如果paytype为10,该值必须填写,具体请参考银行列表。
$this->bankid = "";
//同一订单禁止重复提交标志,实物购物车填1,虚拟产品用0。1代表只能提交一次,0代表在支付不成功情况下可以再提交。可为空。
$this->redoflag = "";
//快钱合作伙伴的帐户号,即商户编号,可为空。
$this->pid = "";
//快钱提供的request参数。
$keyorders = array('inputcharset','pageurl','bgurl','version','language','signtype','merchantacctid','payername','payercontacttype','payercontact',
'orderid','orderamount','ordertime','productname','productnum','productid','productdesc','ext1','ext2','paytype','bankid','redoflag','pid',);
//判断快钱提供的request参数的值是否为空,把非空的参数及值重新组建数组
foreach($keyorders as $key){
if(''==$this->{$key}){continue;}
$params[$key] = $this->{$key};
}
//http_build_query()生成url-encode之后的请求字符串
//urldecode()还原未编码的字符串
//getsignmsg() pki加密,也可使用md5加密
//md5加密方式 strtoupper(md5(urldecode(http_build_query($params))));这种不常用了。
//常用pki加密
$this->signmsg = $this->getsignmsg(urldecode(http_build_query($params)));
}
//pki加密技术
public function getsignmsg($param){
//99bill-rsa.pem是快钱的一个ca证书
//本地随机生成一个key,用此key加密数据 key为$priv_key_id
$priv_key_id = openssl_get_privatekey(file_get_contents("99bill-rsa.pem", "r"));
//用$priv_key_id给$param数据加密。
//计算一个签名字符串$param通过使用sha1哈希加密,随后$priv_key_id私钥加密。数据本身是不加密的。
openssl_sign($param, $signmsg, $priv_key_id, openssl_algo_sha1);
//从存储器上释放$priv_key_id
openssl_free_key($priv_key_id);
//使用base64对数据进行编码
return base64_encode($signmsg);
}
}
models/billresponse.php
billresponse.php
<?php
class application_model_billresponse
{
/*
* __construct()构造函数
* 生成19个参数及值,可能有一个参数的值为空,$this->errcode的值可能为空
*/
public function __construct($response){
$keyorders = array('merchantacctid','version','language','signtype','paytype','bankid','orderid','ordertime','orderamount',
'dealid','bankdealid','dealtime','payamount','fee','ext1','ext2','payresult','errcode', 'signmsg');
foreach($keyorders as $key){
$this->{$key} = $response[$key];
}
}
/*
* 检查签名字符串
* 快钱返回的签名字符串是$this->signmsg
* 使用base64对前面字符串进行解码
* 验证使用快钱给的公钥验证
* 快钱那边他们把返回来的参数值不为空的使用私钥加密生成了$this->signmsg
* 快钱给了我们私钥对应的公钥,我们使用这个公钥来验证。1成功,0失败,-1错误。
*/
public function checksignmsg(){
$keyorders = array('merchantacctid','version','language','signtype','paytype','bankid','orderid','ordertime','orderamount',
'dealid','bankdealid','dealtime','payamount','fee','ext1','ext2','payresult','errcode',);
foreach($keyorders as $key){
if(''==$this->{$key}){continue;}
$params[$key] = $this->{$key};
}
//$pub_key_id 公钥
$pub_key_id = openssl_get_publickey(file_get_contents("99bill-rsa.cer", "r"));
return openssl_verify(urldecode(http_build_query($params)), base64_decode($this->signmsg), $pub_key_id);
}
public function issuccess(){
//$this->payresult成功时10,失败时11
return '10'==$this->payresult;
}
public function getorderid(){
return str_replace('xxx', '', $this->orderid);
}
}
需要一个公钥和一个私钥,这个不是一对的
都是一半
99bill-rsa.cer
99bill-rsa.pem
modules/default/controllers/indexcontroller.php
indexcontroller.php
复制代码 代码如下:
<?php
class indexcontroller extends zend_controller_action
{
public function init()
{
/* initialize action controller here */
}
public function indexaction()
{
/*模拟订单
*$mockorder是从数据库取出来的信息,它包含一些块钱request的信息。这里我写死了。
*orderid订单号,数据库表的主键(唯一)。 //必要字段
*usr_idtype证件类型,根据自己需要。
*usr_idcode证件号,根据自己需要。
*etx_status是否优惠,根据自己需要。
*time_create验证是否符合优惠的时间,根据自己需要。
*ets_license套餐代码如同商品类别,根据自己需要。
*contact_type联系方式类型,固定选择值1,2。1电子邮件,2手机号,根据自己需要,块钱那边可以为空。
*contact_text联系方式,根据contact_type来填写,根据自己需要,块钱那边可以为空。
*etsprice套餐价格及商品价格,根据自己需要。
*orderprice实际价格,根据自己需要。
*orderamount订单实际支付金额,这个要加手续费的。 //必要字段
*ordertime订单时间。 //必要字段
*paysuccess订单是否支付成功。 //必要字段
*buysuccess账号是否生成功,根据自己需要
*paytime订单支付成功时间。 //必要字段
*总之凡是跟订单有关的都是必要字段
*orderid、orderamount、ordertime为 request所需字段
*paysuccess、paytime为response所需字段
*/
$mockorder = array();
$mockorder['orderid'] = '100000125';//订单号。--必要
$mockorder['usr_idtype'] = '1';//证件类型,身份证
$mockorder['usr_idcode'] = '371111199011111111';//身份证号
$mockorder['etx_status'] = '0';//是否优惠,否
$mockorder['time_create'] = '1352338189';//验证是否优惠时间
$mockorder['ets_license'] = '1';//套餐代码及商品类别
$mockorder['contact_type'] = '1';//联系方式类型 1,邮箱
$mockorder['contact_text'] = 'x@163.com';//联系方式,邮箱
$mockorder['etsprice'] = '30800';//套餐价格及商品价格
$mockorder['orderprice'] = '30800';//实际价格
$mockorder['orderamount'] = '31100';//订单实际支付价格,加手续费的。--必要
$mockorder['ordertime'] = '1352338199';//订单生成时间。--必要
$mockorder['paysuccess'] = '0';//订单是否支付成功。--必要
$mockorder['buysuccess'] = '0';//账号是否生成成功
$mockorder['paytime'] = '0';//订单支付时间。--必要
//billrequest就是快钱那边需要的的一些参数
$this->view->billrequest = new application_model_billrequest($mockorder);
zend_debug::dump($this->view->billrequest);exit;
}
//bgurl地址指向这里
public function receiveaction()
{
//receive数据库设计
/*用$mockreceive数组模拟
* $mockreceive = array();
* $mockreceive['id']主键;
* $mockreceive['orderid']商户订单号;
* $mockreceive['receivetime']接受时间;
* $mockreceive['querystring']http_build_encode($_request);
* $mockreceive['dealid']快钱交易号;
* $mockreceive['bankdealid']银行交易号;
* $mockreceive['payresult']处理结果10:支付成功;11:支付失败;
* $mockreceive['dealtime']快钱交易时间;
* $mockreceive['payamount']订单实际支付金额;
* $mockreceive['fee']费用;
* $mockreceive['errcode']错误代码;
*/
/*$_request是快钱那边返回来的数据
* merchantacctid人民币账号,与提交订单时的块钱账号保持一致。
* version网关版本,固定值:v2.0,与提交订单时的网关版本号保持一致。
* language网页显示语言种类,1中文显示,与提交订单时的网页显示语言种类保持一致
* signtype签名类型,4pki签名,与提交订单时的签名类型保持一致
* paytype支付方式,00全部,与提交订单时的支付方式保持一致
* bankid银行代码
* orderid商户订单号,与提交订单时的商户订单号保持一致
* ordertime商户订单提交时间,与提交订单时的商户订单提交时间保持一致
* orderamount商户订单金额,与提交订单时的商户订单金额保持一致。
* dealid快钱交易号
* bankdealid银行交易号
* dealtime快钱交易时间
* payamount订单实际支付金额
* fee费用
* ext1扩展字段1,与提交订单时的扩展字段1保持一致
* ext2扩展字段2,与提交订单时的扩展字段2保持一致
* payresult处理结果 10:支付成功;11:支付失败
* errcode错误代码,可为空
* signmsg签名字符串
*/
$billresponse = new application_model_billresponse($_request);
//$billresponse->checksignmsg验证签名字符串是否正确,防止bug漏洞等
if($billresponse->checksignmsg){
//判断订单支付是否成功
if($billresponse->issuccess){
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这里是成功页面
return "<result>1</result><redirecturl>http://99bill/default/index/sucess</redirecturl>";exit;
}else{
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面
return "<result>1</result><redirecturl>http://99bill/default/index/fail</redirecturl>";exit;
}
}
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面
return "<result>1</result><redirecturl>http://99bill/default/index/fail</redirecturl>";exit;
}
//redirecturl地址
//成功
public function success()
{
}
//失败
public function fail()
{
}
}
modules/default/views/scripts/index/index.phtml
https://www.99bill.com/gateway/recvmerchantinfoaction.htm
复制代码 代码如下:
<?php $billrequest = (array)$this->billrequest;?>
<div style="display:none;">
<form name="kqpay" action="https://www.99bill.com/gateway/recvmerchantinfoaction.htm" method="post">
<?php foreach($billrequest as $key => $val):?>
<input type="hidden" name="<?php echo $key;?>" value="<?php echo $val;?>"/>
<?php endforeach;?>
<input type="submit" name="submit" value="提交到快钱" id="kqpay">
</form>
</div>
<script>
document.getelementbyid('kqpay').click();
</script>
models/billrequest.php
billrequest.php
复制代码 代码如下:
<?php
class application_model_billrequest
{
public function __construct($mockorder){
/*
* 人民币网关账号。
*第一种方式:该账号为11位人民币网关商户编号+01,该参数必填。01对应工商银行。
*第二种方式:该账号为16位人民币网关商户
*/
$this->merchantacctid = "1001011111101";
//服务器接收支付结果的后台地址,该参数务必填写,绝对路径//不能为空。
$this->bgurl = "http://99bill/default/index/receive";
//商户订单号,以下采用时间来定义订单号,商户可以根据自己订单号的定义规则来定义该值//不能为空。
$this->orderid = 'tolpc'.sprintf("%09d", $mockorder['orderid']);
//订单金额,金额以“分”为单位,商户测试以1分测试即可,切勿以大金额测试,该参数必填//不能为空
$this->orderamount =$mockorder['orderamount'];
//订单提交时间,格式:yyyymmddhhmmss,如:20071117020101//不能为空。
$this->ordertime = date("ymdhis", $mockorder['ordertime']);
//支付人姓名,可以为空。
$this->payername= "";
//支付人联系类型,1 代表电子邮件方式;2 代表手机联系方式。可以为空。
$this->payercontacttype = "";
//支付人联系方式,与payercontacttype设置对应,payercontacttype为1,则填写邮箱地址;payercontacttype为2,则填写手机号码。可以为空。
$this->payercontact = "";
//商品名称,可以为空。
$this->productname= "tolpc";
//商品数量,可以为空。
$this->productnum = "1";
//商品代码,可以为空。
$this->productid = $mockorder['ets_license'];
//商品描述,可以为空。
$this->productdesc = "";
//支付方式,一般为00,代表所有的支付方式。如果是银行直连商户,该值为10,必填//不能为空
$this->paytype = "00";
//编码方式,1代表 utf-8; 2 代表 gbk; 3代表 gb2312 默认为1,该参数必填//不能为空
$this->inputcharset = "1";
//网关版本,固定值:v2.0,该参数必填//不能为空
$this->version = "v2.0";
//语言种类,1代表中文显示,2代表英文显示。默认为1,该参数必填//不能为空
$this->language = "1";
//签名类型,该值为4,代表pki加密方式,该参数必填//不能为空
$this->signtype = "4";
//接收支付结果的页面地址,该参数一般置为空即可。
$this->pageurl = "";
//扩展字段1,商户可以传递自己需要的参数,支付完快钱会原值返回,可以为空。
$this->ext1 = $mockorder['orderid'];
//扩展自段2,商户可以传递自己需要的参数,支付完快钱会原值返回,可以为空。
$this->ext2 = $mockorder['ordertime'];
//银行代码,如果paytype为00,该值可以为空;如果paytype为10,该值必须填写,具体请参考银行列表。
$this->bankid = "";
//同一订单禁止重复提交标志,实物购物车填1,虚拟产品用0。1代表只能提交一次,0代表在支付不成功情况下可以再提交。可为空。
$this->redoflag = "";
//快钱合作伙伴的帐户号,即商户编号,可为空。
$this->pid = "";
//快钱提供的request参数。
$keyorders = array('inputcharset','pageurl','bgurl','version','language','signtype','merchantacctid','payername','payercontacttype','payercontact',
'orderid','orderamount','ordertime','productname','productnum','productid','productdesc','ext1','ext2','paytype','bankid','redoflag','pid',);
//判断快钱提供的request参数的值是否为空,把非空的参数及值重新组建数组
foreach($keyorders as $key){
if(''==$this->{$key}){continue;}
$params[$key] = $this->{$key};
}
//http_build_query()生成url-encode之后的请求字符串
//urldecode()还原未编码的字符串
//getsignmsg() pki加密,也可使用md5加密
//md5加密方式 strtoupper(md5(urldecode(http_build_query($params))));这种不常用了。
//常用pki加密
$this->signmsg = $this->getsignmsg(urldecode(http_build_query($params)));
}
//pki加密技术
public function getsignmsg($param){
//99bill-rsa.pem是快钱的一个ca证书
//本地随机生成一个key,用此key加密数据 key为$priv_key_id
$priv_key_id = openssl_get_privatekey(file_get_contents("99bill-rsa.pem", "r"));
//用$priv_key_id给$param数据加密。
//计算一个签名字符串$param通过使用sha1哈希加密,随后$priv_key_id私钥加密。数据本身是不加密的。
openssl_sign($param, $signmsg, $priv_key_id, openssl_algo_sha1);
//从存储器上释放$priv_key_id
openssl_free_key($priv_key_id);
//使用base64对数据进行编码
return base64_encode($signmsg);
}
}
models/billresponse.php
billresponse.php
复制代码 代码如下:
<?php
class application_model_billresponse
{
/*
* __construct()构造函数
* 生成19个参数及值,可能有一个参数的值为空,$this->errcode的值可能为空
*/
public function __construct($response){
$keyorders = array('merchantacctid','version','language','signtype','paytype','bankid','orderid','ordertime','orderamount',
'dealid','bankdealid','dealtime','payamount','fee','ext1','ext2','payresult','errcode', 'signmsg');
foreach($keyorders as $key){
$this->{$key} = $response[$key];
}
}
/*
* 检查签名字符串
* 快钱返回的签名字符串是$this->signmsg
* 使用base64对前面字符串进行解码
* 验证使用快钱给的公钥验证
* 快钱那边他们把返回来的参数值不为空的使用私钥加密生成了$this->signmsg
* 快钱给了我们私钥对应的公钥,我们使用这个公钥来验证。1成功,0失败,-1错误。
*/
public function checksignmsg(){
$keyorders = array('merchantacctid','version','language','signtype','paytype','bankid','orderid','ordertime','orderamount',
'dealid','bankdealid','dealtime','payamount','fee','ext1','ext2','payresult','errcode',);
foreach($keyorders as $key){
if(''==$this->{$key}){continue;}
$params[$key] = $this->{$key};
}
//$pub_key_id 公钥
$pub_key_id = openssl_get_publickey(file_get_contents("99bill-rsa.cer", "r"));
return openssl_verify(urldecode(http_build_query($params)), base64_decode($this->signmsg), $pub_key_id);
}
public function issuccess(){
//$this->payresult成功时10,失败时11
return '10'==$this->payresult;
}
public function getorderid(){
return str_replace('xxx', '', $this->orderid);
}
}
需要一个公钥和一个私钥,这个不是一对的
都是一半
99bill-rsa.cer
99bill-rsa.pem
上一篇: cd命令 目录跳转
推荐阅读
-
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
-
使用php实现快钱支付功能(涉及到接口)
-
PHP支付宝接口支付功能可以实现,但是中间出现一个空白页面,里面是一个按钮,我现在想去掉这个按钮求教
-
如何使用PHP调用API接口实现天气查询功能
-
使用php实现快钱支付功能(涉及到接口)_PHP
-
使用php实现快钱支付功能(涉及到接口)_php技巧
-
PHP支付宝接口支付功能可以实现,但是中间出现一个空白页面,里面是一个按钮,我现在想去掉这个按钮求教
-
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子_PHP
-
使用php实现快钱支付功能(涉及到接口)
-
PHP支付宝接口支付功能可以实现,但是中间出现一个空白页面,里面是一个按钮,小弟我现在想去掉这个按钮求教