您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

使用php实现快钱支付功能(涉及到接口)_PHP教程

2025/6/12 19:35:24发布24次查看
本项目用zend framework框架实现的
modules/default/controllers/indexcontroller.php
indexcontroller.php
复制代码 代码如下:
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 1http://99bill/default/index/sucess;exit;
   }else{
    //返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面
    return 1http://99bill/default/index/fail;exit;
   }
  }
  //返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面
  return 1http://99bill/default/index/fail;exit;
    }
//redirecturl地址
    //成功
    public function success()
    {
}
//失败
    public function fail()
    {
}
}
modules/default/views/scripts/index/index.phtml
https://www.99bill.com/gateway/recvmerchantinfoaction.htm
复制代码 代码如下:
billrequest;?>
$val):?>
models/billrequest.php
billrequest.php
复制代码 代码如下:
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
复制代码 代码如下:
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
http://www.bkjia.com/phpjc/327972.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/327972.htmltecharticle本项目用zend framework框架实现的 modules/default/controllers/indexcontroller.php indexcontroller.php 复制代码 代码如下: ?php class indexcontroller extends zend_con...
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product