接口文档
参数 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>
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>
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; } } ?>
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; } } ?>
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; } ?>
另外 参数default_bank 默认为民生银行 如果要接入其他银行 可以填写参数,下面是民生银行支持接入的银行参数