民生银行接口实例demo

接口文档

参数 N为不可空参数

1:from表单 提交商户数据给银行 通过跳转至epayapi.php页面

 <!-- 民生银行支付接口 -->
                  <form action="<?php echo $this->createUrl('Payment/cmbcpay')?>" method=post target="_blank">
                    <div style="display: none;">
                        <input type=hidden name="service"       value="create_direct_pay_by_user"/>
                        <input type=hidden name="partner_id"    value="1002201305272380"/><!--商户在民生支付平台的用户ID -->
                          <input type=hidden name="sign_type"     value="MD5"/>   
                          <input type=hidden name="out_trade_no"  value="<?php echo str_pad(@$OrderInfo['PayNumber'],30,"0",STR_PAD_LEFT)?>"/>
                          <input type=hidden name="amount"        value="<?php echo @$OrderInfo['TotalMoney']?>"/>
                          <input type=hidden name="payMethod"     value="bankPay"/>
                          <input type=hidden name="seller_email"  value="cmbc188@163.com"/><!--卖家账号 -->
                          <input type=hidden name="notify_url"    value="http://epay.cmbc.com.cn/payment/CmbcPayNotify.jsp"/><!--可以空-->
                         <input type=hidden name="subject"       value="<?php echo @XUtils::cutstr($OrderInfo['OrderName'],30)?>"/>
                          <input type=hidden name="buyer_email"   value=""/>
                          <input type=hidden name="body"          value="详细内容"/>
                          <input type=hidden name="input_charset" value="utf-8"/>
                          <input type=hidden name="show_url"      value=""/>
                          <input type=hidden name="default_bank"  value="300904"/>
                          <input type=hidden name="return_url"    value="http://epay.cmbc.com.cn"/> <!--返回商户页面 -->
                          <input type=hidden name="royalty_parameters"   value=""/>
                          <input type=hidden name="signkey"       value="d1738053d38616dc27d72a2642a1c0bb"/> <!--秘钥 -->
                          
                    </div>
                      <li>
                      <div class="pay_boxin pay_curr">
                     <span class="left"><img src="<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/msyh.png" height="40px">民生银行</span>
                        <span class="pay_money right">
                     <p>支付<strong><?php echo @sprintf('%0.2f',$OrderInfo['TotalMoney'])?></strong></p>
                        </span>
                     </div>
                         <input type="submit" style="220px; height:50px; border:0px; margin:30px 0 0 500px; background: url(<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/pay_quite.png) center no-repeat; cursor:pointer;" value="" >
                  <div class="pay_disno" style="margin:30px 0 0 500px;"><img src="<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/pay_quite.png"></div>
                    </li>    
             </form>
View Code

2:epayapi.php 接受提交的参数并进行验证 建立请求

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>e支付即时到账交易接口接口/验证</title>
</head>
<?php
/* *
 * 功能:即时到账交易接口接入页
 * 版本:1.0
 * 修改日期:2013-12-14
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究e支付接口使用,只是提供一个参考。

 */

require_once("lib/epay_submit.class.php");
/**************************请求参数**************************/

                $service = $_POST['service'];//接口名称
                $partner_id = $_POST['partner_id'];//合作商ID
                $input_charset = $_POST['input_charset'];//编码方式
                $sign_type = $_POST['sign_type'];//签名类型
                $out_trade_no = $_POST['out_trade_no'];//外部订单号 30位
                $amount = $_POST['amount'];//交易金额
                $payMethod = $_POST['payMethod'];//支付方式
                $seller_email = $_POST['seller_email'];//卖家账号
                $notify_url = $_POST['notify_url'];//通知地址
                $subject = $_POST['subject'];//交易标题
                $buyer_email = $_POST['buyer_email'];//买家账号
                $body = $_POST['body'];//交易详细内容
                $show_url = $_POST['show_url'];//商品展示网址
                $default_bank = $_POST['default_bank'];//默认银行
                $return_url = $_POST['return_url'];//跳转地址    
                $royalty_parameters = $_POST['royalty_parameters'];//分润账号    
                $signkey = $_POST['signkey'];//签约密钥


/************************************************************/

//构造要请求的参数数组,无需改动
$parameter = array(
        "service"    => $service,
        "partner_id"    => $partner_id,
        "input_charset"    => $input_charset,
        "sign_type"    => $sign_type,
        "out_trade_no"    => $out_trade_no,
        "amount"    => $amount,
        "payMethod"    => $payMethod,
        "seller_email"    => $seller_email,
        "notify_url"    => $notify_url,
        "subject"    => $subject,
        "buyer_email"    => $buyer_email,
        "body"    => $body,
        "show_url"    => $show_url,
        "default_bank"    => $default_bank,
        "return_url"    => $return_url,
        "royalty_parameters"    => $royalty_parameters
);

//建立请求
$epaySubmit = new EpaySubmit();
$html_text = $epaySubmit->buildRequestForm($parameter, $signkey,"get", "确认");
echo $html_text;

?>
</body>
</html>
View Code

3:lib/epay_submit.class.php 接口请求提交类  

<?php
/* 
 * 类名:EpaySubmit
 * 功能:e支付各接口请求提交类
 * 详细:构造e支付各接口表单HTML文本,获取远程HTTP数据
 * 版本:1.0
 * 修改日期:2013-12-14
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究e支付接口使用,只是提供一个参考。
 */
require_once("epay_core.function.php");
require_once("epay_md5.function.php");

class EpaySubmit {
    /**
     *e支付网关地址(新)
     */
    var $epay_gateway_new = 'https://epay.cmbc.com.cn/ipad/service.html?';

    function __construct(){
    }
    function EpaySubmit() {
    }
    
    /**
     * 生成签名结果
     * @param $para_sort 已排序要签名的数组
     * return 签名结果字符串
     */
    function buildRequestMysign($para_sort, $signkey) {
        //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
        $prestr = createLinkstring($para_sort);
        
        $mysign = md5Sign($prestr, $signkey);
        return $mysign;
    }

    /**
     * 生成要请求给e支付的参数数组
     * @param $para_temp 请求前的参数数组
     * @return 要请求的参数数组
     */
    function buildRequestPara($para_temp, $signkey) {
        //除去待签名参数数组中的空值和签名参数
        $para_filter = paraFilter($para_temp);

        //对待签名参数数组排序
        $para_sort = argSort($para_filter);

        //生成签名结果
        $mysign = $this->buildRequestMysign($para_sort, $signkey);
        
        //签名结果与签名方式加入请求提交参数组中
        $para_sort['sign'] = $mysign;
        
        return $para_sort;
         
    }

    
    /**
     * 建立请求,以表单HTML形式构造(默认)
     * @param $para_temp 请求参数数组
     * @param $method 提交方式。两个值可选:post、get
     * @param $button_name 确认按钮显示文字
     * @return 提交表单HTML文本
     */
    function buildRequestForm($para_temp, $signkey, $method, $button_name) {
        //待请求参数数组
        $para = $this->buildRequestPara($para_temp, $signkey);
        
        $sHtml = "<form id='epaysubmit' name='epaysubmit' action='".$this->epay_gateway_new."_input_charset=utf-8"."' method='".$method."'>";
        while (list ($key, $val) = each ($para)) {
            $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
        }

        //submit按钮控件请不要含有name属性
        $sHtml = $sHtml."<input id='submt' style='display:none;' type='submit' value='".$button_name."'></form>";
        
        $sHtml = $sHtml."<script>document.getElementById('submt').click();</script>";
        //document.forms['epaysubmit'].submit();
        return $sHtml;
    }
}
?>
View Code

4:epay_md5.function.php MD5加密

<?php
/* *
 * MD5
 * 详细:MD5加密
 * 版本:1.0
 * 修改日期:2013-12-14
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究e支付接口使用,只是提供一个参考。
 */

/**
 * 签名字符串
 * @param $prestr 需要签名的字符串
 * @param $key 私钥
 * return 签名结果
 */
function md5Sign($prestr, $key) {
    $prestr = $prestr . $key;
    return md5($prestr);
}

/**
 * 验证签名
 * @param $prestr 需要签名的字符串
 * @param $sign 签名结果
 * @param $key 私钥
 * return 签名结果
 */
function md5Verify($prestr, $sign, $key) {
    $prestr = $prestr . $key;
    $mysgin = md5($prestr);

    if($mysgin == $sign) {
        return true;
    }
    else {
        return false;
    }
}
?>
View Code

5:epay_core.function.php 接口公用函数

<?php
/* *
 * e支付接口公用函数
 * 详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件
 * 版本:1.0
 * 修改日期:2013-12-14
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究e支付接口使用,只是提供一个参考。
 */

/**
 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
 * @param $para 需要拼接的数组
 * return 拼接完成以后的字符串
 */
function createLinkstring($para) {
    $arg  = "";
    while (list ($key, $val) = each ($para)) {
        $arg.=$key."=".$val."&";
    }
    //去掉最后一个&字符
    $arg = substr($arg,0,count($arg)-2);
    
    //如果存在转义字符,那么去掉转义
    if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
    
    return $arg;
}
/**
 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
 * @param $para 需要拼接的数组
 * return 拼接完成以后的字符串
 */
function createLinkstringUrlencode($para) {
    $arg  = "";
    while (list ($key, $val) = each ($para)) {
        $arg.=$key."=".urlencode($val)."&";
    }
    //去掉最后一个&字符
    $arg = substr($arg,0,count($arg)-2);
    
    //如果存在转义字符,那么去掉转义
    if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
    
    return $arg;
}
/**
 * 除去数组中的空值和签名参数
 * @param $para 签名参数组
 * return 去掉空值与签名参数后的新签名参数组
 */
function paraFilter($para) {
    $para_filter = array();
    while (list ($key, $val) = each ($para)) {
        if($val == "")continue;
        else    $para_filter[$key] = $para[$key];
    }
    return $para_filter;
}
/**
 * 对数组排序
 * @param $para 排序前的数组
 * return 排序后的数组
 */
function argSort($para) {
    ksort($para);
    reset($para);
    return $para;
}
/**
 * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
 * 注意:服务器需要开通fopen配置
 * @param $word 要写入日志里的文本内容 默认值:空值
 */
function logResult($word='') {
    $fp = fopen("log.txt","a");
    flock($fp, LOCK_EX) ;
    fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."
".$word."
");
    flock($fp, LOCK_UN);
    fclose($fp);
}

/**
 * 远程获取数据,POST模式
 * 注意:
 * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
 * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\cacert.pem'
 * @param $url 指定URL完整路径地址
 * @param $cacert_url 指定当前工作目录绝对路径
 * @param $para 请求的数据
 * @param $input_charset 编码格式。默认值:空值
 * return 远程输出的数据
 */
function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '') {

    if (trim($input_charset) != '') {
        $url = $url."_input_charset=".$input_charset;
    }
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
    curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
    curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
    curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
    curl_setopt($curl,CURLOPT_POST,true); // post传输数据
    curl_setopt($curl,CURLOPT_POSTFIELDS,$para);// post传输数据
    $responseText = curl_exec($curl);
    //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
    curl_close($curl);
    
    return $responseText;
}

/**
 * 远程获取数据,GET模式
 * 注意:
 * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
 * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\cacert.pem'
 * @param $url 指定URL完整路径地址
 * @param $cacert_url 指定当前工作目录绝对路径
 * return 远程输出的数据
 */
function getHttpResponseGET($url,$cacert_url) {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
    curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
    curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
    $responseText = curl_exec($curl);
    //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
    curl_close($curl);
    
    return $responseText;
}

/**
 * 实现多种字符编码方式
 * @param $input 需要编码的字符串
 * @param $_output_charset 输出的编码格式
 * @param $_input_charset 输入的编码格式
 * return 编码后的字符串
 */
function charsetEncode($input,$_output_charset ,$_input_charset) {
    $output = "";
    if(!isset($_output_charset) )$_output_charset  = $_input_charset;
    if($_input_charset == $_output_charset || $input ==null ) {
        $output = $input;
    } elseif (function_exists("mb_convert_encoding")) {
        $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
    } elseif(function_exists("iconv")) {
        $output = iconv($_input_charset,$_output_charset,$input);
    } else die("sorry, you have no libs support for charset change.");
    return $output;
}
/**
 * 实现多种字符解码方式
 * @param $input 需要解码的字符串
 * @param $_output_charset 输出的解码格式
 * @param $_input_charset 输入的解码格式
 * return 解码后的字符串
 */
function charsetDecode($input,$_input_charset ,$_output_charset) {
    $output = "";
    if(!isset($_input_charset) )$_input_charset  = $_input_charset ;
    if($_input_charset == $_output_charset || $input ==null ) {
        $output = $input;
    } elseif (function_exists("mb_convert_encoding")) {
        $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
    } elseif(function_exists("iconv")) {
        $output = iconv($_input_charset,$_output_charset,$input);
    } else die("sorry, you have no libs support for charset changes.");
    return $output;
}
?>
View Code

另外  参数default_bank 默认为民生银行 如果要接入其他银行 可以填写参数,下面是民生银行支持接入的银行参数

      

原文地址:https://www.cnblogs.com/huii/p/4727169.html