当前位置:  编程技术>php
本页文章导读:
    ▪使用php实现快钱支付功能(涉及到接口)       本项目用zend framework框架实现的modules/default/controllers/IndexController.phpIndexController.php 代码如下:<?phpclass IndexController extends Zend_Controller_Action{    public function init()    {        /* Initialize ac.........
    ▪在wamp集成环境下升级php版本(实现方法)       wamp集成环境下升级php版本1.下载php版本压缩包,解压php版本压缩包2.停掉wamp服务3.替换wamp\php文件4.替换wamp\Apache2\bin目录下的php5nsapi.dll 和 php5ts.dll(对应当前php版本的)5.重启wamp服务6.phpinfo().........
    ▪mongo Table类文件 获取MongoCursor(游标)的实现方法分析       MongoCursor Object 游标类MongoConfig.php配置文件Table.php(mongodb操作数据库类文件)Config.php配置文件 代码如下:<?phprequire_once 'Zend/Exception.php';class Hrs_Mongo_Config{    const VERSION = '1.7.0';    const DEFA.........

[1]使用php实现快钱支付功能(涉及到接口)
    来源: 互联网  发布时间: 2013-11-30
本项目用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 >
<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

    
[2]在wamp集成环境下升级php版本(实现方法)
    来源: 互联网  发布时间: 2013-11-30
wamp集成环境下升级php版本
1.下载php版本压缩包,解压php版本压缩包
2.停掉wamp服务
3.替换wamp\php文件
4.替换wamp\Apache2\bin目录下的php5nsapi.dll 和 php5ts.dll(对应当前php版本的)
5.重启wamp服务
6.phpinfo()测试

我遇到的问题 时区设置问题
解决方案:
wamp\Apache2\bin\php.ini

; Module Settings ;

;新增时区设置
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = UTC
;新增时区设置

注意事项
php版本升级时
因为我们替换的是php目录
php/php.ini文件中的一些路径不一定和现在wamp的路径匹配。
需要修改
搜索d:
查出一些路径然后修改以匹配现在wamp路径

    
[3]mongo Table类文件 获取MongoCursor(游标)的实现方法分析
    来源: 互联网  发布时间: 2013-11-30
MongoCursor Object
游标类

Mongo
Config.php配置文件
Table.php(mongodb操作数据库类文件)

Config.php配置文件
代码如下:

<?php
require_once 'Zend/Exception.php';
class Hrs_Mongo_Config
{
    const VERSION = '1.7.0';
    const DEFAULT_HOST = 'localhost';
    const DEFAULT_PORT = 27017;
    private static $host = self::DEFAULT_HOST ;
    private static $port = self::DEFAULT_PORT ;
    private static $options = array(
            'connect' => true,
            'timeout' => 30,
            //'replicaSet' => '' //If this is given, the master will be determined by using the ismaster database command on the seeds
    );
    public static $conn = '';
    public static $defaultDb = '';
    public static $linkStatus = '';
    public static function set($server = 'mongodb://localhost:27017', $options = array('connect' => true)) {
        if(!$server){
            $url = 'mongodb://'.self::$host.':'.self::$port;
        }
        if(is_array($server)){
            if(isset($server['host'])){
                self::$host = $server['host'];
            }
            if(isset($server['port'])){
                self::$port = $server['port'];
            }
            if(isset($server['user']) && isset($server['pass'])){
                $url = 'mongodb://'.$server['user'].':'.$server['pass'].'@'.self::$host.':'.self::$port;
            }else{
                $url = 'mongodb://'.self::$host.':'.self::$port;
            }
        }
        if(is_array($options)){
            foreach (self::$options as $o_k=>$o_v){
                if(isset($options[$o_k]))
                    self::$options[$o_k] = $o_v;
            }
        }
        try{                       
            self::$conn = new Mongo($url, self::$options);
            self::$linkStatus = 'success';
        }catch (Exception $e){
            self::$linkStatus = 'failed';
        }
        if(isset($server['database'])){
            self::selectDB($server['database']);
        }
    }
    public static function selectDB($database){
        if($database){
            try {
                if(self::$linkStatus=='success')
                    self::$defaultDb = self::$conn->selectDB($database);
                return self::$defaultDb;
            }
            catch(InvalidArgumentException $e) {
                throw new Zend_Exception('Mongodb数据库名称不正确');
            }
        }else{
            throw new Zend_Exception('Mongodb数据库名称不能为空');
        }
    }
}

Table.php(mongodb操作数据库类文件)
代码如下:

<?php
require_once 'Hrs/Mongo/Config.php';
abstract class Hrs_Mongo_Table
{
    protected $_db = '';
    protected $_name = '';
    protected $_data = array();
    protected $c_options = array(
            'fsync'=>true,
            'safe'=>true
    );
    protected $u_options = array(
    //'upsert'=>false,
            'multiple'=>true,
            'fsync'=>true,
            'safe'=>true
    );
    /*
     protected $r_options = array(
     );*/
    protected $d_options = array(
            'fsync'=>true,
            'justOne'=>false,
            'safe'=>true
    );
    protected function _setAdapter($database=''){
        if(!$database)
            throw new Zend_Exception('Mongodb数据库名称不能为空');
        Hrs_Mongo_Config::selectDB($database);
    }
    public function __construct() {
        if(Hrs_Mongo_Config::$conn instanceof Mongo){
            $name = $this->_name;
            $defDb = Hrs_Mongo_Config::$defaultDb;
            $this->_db = $defDb->$name;
        }else{
            throw new Zend_Exception('Mongodb服务器连接失败');
        }
    }
    public function insert($data){
        if(!$this->testLink()) return false;
        $ret = $this->_db->insert($data, $this->c_options);
        return $ret;
    }
    public function update($data, $where){
        if(!$this->testLink()) return false;
        return $this->_db->update($where, $data, $this->u_options);
    }
    public function find($where=array(),$limit=0){
        if($this->testLink()) {
            if($limit>0){
                $this->_data = $where ? $this->_db->find($where)->limit($limit)->snapshot() : $this->_db->find()->limit($limit)->snapshot();
            }else{
                $this->_data = $where ? $this->_db->find($where)->limit($limit)->snapshot() : $this->_db->find()->limit($limit)->snapshot();
            }
        }
        return $this;
    }
    //find cursor
    /*
     * 获取游标对象
     */
    public function look($where=array(),$fields=array()){
        if($this->testLink()) {
            if($fields){
                return $where ? $this->_db->find($where,$fields): $this->_db->find()->fields($fields);
            }else{
                return $where ? $this->_db->find($where) : $this->_db->find();
            }
        }
        return false;
    }
    public function delete($where){
        if(!$this->testLink()) return false;
        return $this->_db->remove($where, $this->d_options);
    }
    public function dropMe(){
        if(!$this->testLink()) return false;
        return $this->_db->drop();
    }
    public function __toString(){
        return $this->_data;
    }
    public function toArray(){
        $tmpData = array();
        foreach($this->_data as $id=>$row){
            $one_row = array();
            foreach($row as $key=>$col){
                $one_row[$key] = $col;
            }
            $one_row['_id'] = $id;
            $tmpData[] = $one_row;
        }
        return $tmpData;
    }
    protected function testLink(){
        return Hrs_Mongo_Config::$linkStatus == 'success' ? true :false;
    }
}

要点注意!!!
第一种方法
代码如下:

    //find cursor
    /*
     * 获取游标对象
     */
    public function look($where=array(),$fields=array()){
        if($this->testLink()) {
            if($fields){
                return $where ? $this->_db->find($where,$fields): $this->_db->find()->fields($fields);
            }else{
                return $where ? $this->_db->find($where) : $this->_db->find();
            }
        }
        return false;
    }

第二种方法
代码如下:

    public function find($where=array(),$field=array()){
        if($this->testLink()) {
            $this->_data = $this->_db->find($where,$field)->sort(array("_id" => -1));
        }
        return $this;
    }

代码如下:

    /*
     * 获取游标对象
     */
    public function getCursor(){
     return $this->_data;
    }

第二种需要的是find得到的不是数组
find($where)->getCursor();是MongoCursor Object

注意注意
find()返回的是当前对象
toArray()方法是把当前对象转换为数组
getCursor()方法是把当前对象转换为MongoCursor Object(游标对象)

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3