栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

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

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本项目用zend framework框架实现的
modules/default/controllers/IndexController.php
IndexController.php
复制代码 代码如下:
class IndexController extends Zend_Controller_Action
{
    public function init()
    {
       
    }
    public function indexAction()
    { 

     
  $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数据库设计
     

     
     
  $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;?>





models/BillRequest.php
BillRequest.php
复制代码 代码如下:
class Application_Model_BillRequest
{
 public function __construct($MockOrder){
  
  $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
复制代码 代码如下:
class Application_Model_BillResponse
{
 
 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];
  }
 }
 
 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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/49437.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号