财付通接口示例

 前阵子做了几个第三方支付接口,写下来跟大家分享下,我用的是yii1框架做的。

1:from表单,提交商户给银行的数据,通过$this->createUrl('Payment/tenpay')?>" 跳转

 

<!-- 财付通支付页面 -->
                <form name=tenpayment action="<?php echo $this->createUrl('Payment/tenpay')?>" method=post target="_blank">
                    <div style="display: none;"><input size="30" name="WIDseller_email" value="xxxx.com" />
                    <input size="30" name="order_no" value="<?php echo @$OrderInfo['PayNumber']?>" />
                    <input size="30" name="product_name" value="<?php echo @XUtils::cutstr($OrderInfo['OrderName'],30)?>" />
                    <input size="30" name="order_price" value="<?php echo @$OrderInfo['TotalMoney']?>" />
                    <input size="30" name="trade_mode"  value="1"/>
                    <input size="30" name="remarkexplain" /></div>
                    <li>
                        <div class="pay_boxin pay_curr">
                            <span class="left"><img src="<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/tenpay.png" height="30px"></span>
                        <span class="pay_money right">
                            <p>支付<strong><?php echo @sprintf('%0.2f',$OrderInfo['TotalMoney'])?></strong></p>
                        </span>
                        </div>
                        <input type="submit" style="width: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:跳转页面 通过控制器跳转

3:tenpay.php页面 验证商户提交的数据 并进行加密处理

<?php
//---------------------------------------------------------
//财付通即时到帐支付请求示例,商户按照此文档进行开发即可
//---------------------------------------------------------

require_once ("classes/RequestHandler.class.php");
require_once ("tenpay_config.php");

/* 获取提交的订单号 */
$out_trade_no = $_REQUEST["order_no"];
/* 获取提交的商品名称 */
$product_name = $_REQUEST["product_name"];
/* 获取提交的商品价格 */
$order_price = $_REQUEST["order_price"];
/* 获取提交的备注信息 */
$remarkexplain = $_REQUEST["remarkexplain"];
/* 支付方式 */
$trade_mode=$_REQUEST["trade_mode"];

$strDate = date("Ymd");
$strTime = date("His");

/* 商品价格(包含运费),以分为单位 */
$total_fee = $order_price*100;

/* 商品名称 */
$desc = "商品:".$product_name.",备注:".$remarkexplain;

/* 创建支付请求对象 */
$reqHandler = new RequestHandler();
$reqHandler->init();
$reqHandler->setKey($key);
$reqHandler->setGateUrl("https://gw.tenpay.com/gateway/pay.htm");

//----------------------------------------
//设置支付参数 
//----------------------------------------
$reqHandler->setParameter("partner", $partner);
$reqHandler->setParameter("out_trade_no", $out_trade_no);
$reqHandler->setParameter("total_fee", $total_fee);  //总金额
$reqHandler->setParameter("return_url", $return_url);
$reqHandler->setParameter("notify_url", $notify_url);
$reqHandler->setParameter("body", $desc);
$reqHandler->setParameter("bank_type", "DEFAULT");        //银行类型,默认为财付通
//用户ip
$reqHandler->setParameter("spbill_create_ip", $_SERVER['REMOTE_ADDR']);//客户端IP
$reqHandler->setParameter("fee_type", "1");               //币种
$reqHandler->setParameter("subject",$desc);          //商品名称,(中介交易时必填)

//系统可选参数
$reqHandler->setParameter("sign_type", "MD5");             //签名方式,默认为MD5,可选RSA
$reqHandler->setParameter("service_version", "1.0");       //接口版本号
$reqHandler->setParameter("input_charset", "utf-8");         //字符集
$reqHandler->setParameter("sign_key_index", "1");          //密钥序号

//业务可选参数
$reqHandler->setParameter("attach", "");                   //附件数据,原样返回就可以了
$reqHandler->setParameter("product_fee", "");              //商品费用
$reqHandler->setParameter("transport_fee", "0");            //物流费用
$reqHandler->setParameter("time_start", date("YmdHis"));  //订单生成时间
$reqHandler->setParameter("time_expire", "");             //订单失效时间
$reqHandler->setParameter("buyer_id", "");                //买方财付通帐号
$reqHandler->setParameter("goods_tag", "");               //商品标记
$reqHandler->setParameter("trade_mode",$trade_mode);              //交易模式(1.即时到帐模式,2.中介担保模式,3.后台选择(卖家进入支付中心列表选择))
$reqHandler->setParameter("transport_desc","");              //物流说明
$reqHandler->setParameter("trans_type","1");              //交易类型
$reqHandler->setParameter("agentid","");                  //平台ID
$reqHandler->setParameter("agent_type","");               //代理模式(0.无代理,1.表示卡易售模式,2.表示网店模式)
$reqHandler->setParameter("seller_id","");                //卖家的商户号



//请求的URL
$reqUrl = $reqHandler->getRequestURL();

//获取debug信息,建议把请求和debug信息写入日志,方便定位问题
/**/
//$debugInfo = $reqHandler->getDebugInfo();
//echo "<br/>" . $reqUrl . "<br/>";
//var_dump($reqUrl);die;

?>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>财付通即时到帐交易接口</title>
</head>
<body>
<br/><!--a href="<?php echo $reqUrl ?>" target="_blank">财付通支付</a-->

<form action="<?php echo $reqHandler->getGateUrl() ?>" method="post">

<?php
$params = $reqHandler->getAllParameters();

foreach($params as $k => $v) {
    echo "<input type=\"hidden\" name=\"{$k}\" value=\"{$v}\" />\n";
}

?>
<input type="submit" id="submitPay" value="财付通支付" style="display:none">
<script type="text/javascript">
document.getElementById("submitPay").click();
</script>
</form>
</body>
</html>
View Code

4:payNotifyUrl.php 后台回调页面 显示用户支付的结果信息 银行通过秘钥与商户进行签名 确认商户信息

<META http-equiv=Content-Type content="text/html; charset=utf-8">
<?php

//---------------------------------------------------------
//财付通即时到帐支付后台回调示例,商户按照此文档进行开发即可
//---------------------------------------------------------

require ("classes/ResponseHandler.class.php");
require ("classes/RequestHandler.class.php");
require ("classes/client/ClientResponseHandler.class.php");
require ("classes/client/TenpayHttpClient.class.php");
require ("./classes/function.php");
require_once ("./tenpay_config.php");

        log_result("进入后台回调页面");


    /* 创建支付应答对象 */
        $resHandler = new ResponseHandler();
        $resHandler->setKey($key);

    //判断签名
        if($resHandler->isTenpaySign()) {
    
    //通知id
        $notify_id = $resHandler->getParameter("notify_id");
    
    //通过通知ID查询,确保通知来至财付通
    //创建查询请求
        $queryReq = new RequestHandler();
        $queryReq->init();
        $queryReq->setKey($key);
        $queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml");
        $queryReq->setParameter("partner", $partner);
        $queryReq->setParameter("notify_id", $notify_id);
        
    //通信对象
        $httpClient = new TenpayHttpClient();
        $httpClient->setTimeOut(5);
    //设置请求内容
        $httpClient->setReqContent($queryReq->getRequestURL());
    
    //后台调用
        if($httpClient->call()) {
    //设置结果参数
            $queryRes = new ClientResponseHandler();
            $queryRes->setContent($httpClient->getResContent());
            $queryRes->setKey($key);
        
        if($resHandler->getParameter("trade_mode") == "1"){
    //判断签名及结果(即时到帐)
    //只有签名正确,retcode为0,trade_state为0才是支付成功
        if($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $resHandler->getParameter("trade_state") == "0") {
                log_result("即时到帐验签ID成功");
    //取结果参数做业务处理
                $out_trade_no = $resHandler->getParameter("out_trade_no");
    //财付通订单号
                $transaction_id = $resHandler->getParameter("transaction_id");
    //金额,以分为单位
                $total_fee = $resHandler->getParameter("total_fee");
    //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
                $discount = $resHandler->getParameter("discount");
                
                //------------------------------
                //处理业务开始
                //------------------------------
                
                //处理数据库逻辑
                //注意交易单不要重复处理
                //注意判断返回金额
                
                //------------------------------
                //处理业务完毕
                //------------------------------
                log_result("即时到帐后台回调成功");
                echo "success";
                
            } else {
    //错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
    //echo "验证签名失败 或 业务错误信息:trade_state=" . $resHandler->getParameter("trade_state") . ",retcode=" . $queryRes->                         getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
               log_result("即时到帐后台回调失败");
               echo "fail";
            }
        }elseif ($resHandler->getParameter("trade_mode") == "2")
        
        {
    //判断签名及结果(中介担保)
    //只有签名正确,retcode为0,trade_state为0才是支付成功
        if($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" ) 
        {
                log_result("中介担保验签ID成功");
    //取结果参数做业务处理
                $out_trade_no = $resHandler->getParameter("out_trade_no");
    //财付通订单号
                $transaction_id = $resHandler->getParameter("transaction_id");

                
                //------------------------------
                //处理业务开始
                //------------------------------
                
                //处理数据库逻辑
                //注意交易单不要重复处理
                //注意判断返回金额
    
            log_result("中介担保后台回调,trade_state=".$resHandler->getParameter("trade_state"));
                switch ($resHandler->getParameter("trade_state")) {
                        case "0":    //付款成功
                        
                            break;
                        case "1":    //交易创建
                        
                            break;
                        case "2":    //收获地址填写完毕
                        
                            break;
                        case "4":    //卖家发货成功
                        
                            break;
                        case "5":    //买家收货确认,交易成功
                        
                            break;
                        case "6":    //交易关闭,未完成超时关闭
                        
                            break;
                        case "7":    //修改交易价格成功
                        
                            break;
                        case "8":    //买家发起退款
                        
                            break;
                        case "9":    //退款成功
                        
                            break;
                        case "10":    //退款关闭            
                            
                            break;
                        default:
                            //nothing to do
                            break;
                    }
                    
                
                //------------------------------
                //处理业务完毕
                //------------------------------
                echo "success";
            } else
            
             {
    //错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
    //echo "验证签名失败 或 业务错误信息:trade_state=" . $resHandler->getParameter("trade_state") . ",retcode=" . $queryRes->                                                            getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
               log_result("中介担保后台回调失败");
                echo "fail";
             }
          }
        
        
        
    //获取查询的debug信息,建议把请求、应答内容、debug信息,通信返回码写入日志,方便定位问题
    /*
        echo "<br>------------------------------------------------------<br>";
        echo "http res:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
        echo "query req:" . htmlentities($queryReq->getRequestURL(), ENT_NOQUOTES, "GB2312") . "<br><br>";
        echo "query res:" . htmlentities($queryRes->getContent(), ENT_NOQUOTES, "GB2312") . "<br><br>";
        echo "query reqdebug:" . $queryReq->getDebugInfo() . "<br><br>" ;
        echo "query resdebug:" . $queryRes->getDebugInfo() . "<br><br>";
        */
    }else
     {
    //通信失败
        echo "fail";
    //后台调用通信失败,写日志,方便定位问题
    echo "<br>call err:" . $httpClient->getResponseCode() ."," . $httpClient->getErrInfo() . "<br>";
     } 
    
    
   } else 
     {
    echo "<br/>" . "认证签名失败" . "<br/>";
    echo $resHandler->getDebugInfo() . "<br>";
}

 

?>
View Code

5:payReturnUrl.php 前台回调页面 银行回调信息给商户

<META http-equiv=Content-Type content="text/html; charset=utf-8">
<?php

//---------------------------------------------------------
//财付通即时到帐支付页面回调示例,商户按照此文档进行开发即可
//---------------------------------------------------------
require_once ("classes/ResponseHandler.class.php");
require_once ("classes/function.php");
require_once ("tenpay_config.php");

log_result("进入前台回调页面");


/* 创建支付应答对象 */
$resHandler = new ResponseHandler();
$resHandler->setKey($key);

//判断签名
if($resHandler->isTenpaySign()) {
    
    //通知id
    $notify_id = $resHandler->getParameter("notify_id");
    //商户订单号
    $out_trade_no = $resHandler->getParameter("out_trade_no");
    //财付通订单号
    $transaction_id = $resHandler->getParameter("transaction_id");
    //金额,以分为单位
    $total_fee = $resHandler->getParameter("total_fee");
    //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
    $discount = $resHandler->getParameter("discount");
    //支付结果
    $trade_state = $resHandler->getParameter("trade_state");
    //交易模式,1即时到账
    $trade_mode = $resHandler->getParameter("trade_mode");
    
    if($out_trade_no){        
        $this->actionSetPayN($out_trade_no,2);
        $this->redirect(array('/UserCenter'));
    }
    
    if("1" == $trade_mode ) {
        if( "0" == $trade_state){ 
        
            
            echo "<br/>" . "即时到帐支付成功" . "<br/>";
    
        } else {
            //当做不成功处理
            echo "<br/>" . "即时到帐支付失败" . "<br/>";
        }
    }elseif( "2" == $trade_mode  ) {
        if( "0" == $trade_state) {
        
        
            
            echo "<br/>" . "中介担保支付成功" . "<br/>";
        
        } else {
            //当做不成功处理
            echo "<br/>" . "中介担保支付失败" . "<br/>";
        }
    }
    
} else {
    echo "<br/>" . "认证签名失败" . "<br/>";
    echo $resHandler->getDebugInfo() . "<br>";
}

?>
View Code

6:设置页面 设置商户信息,以及商户秘钥和商户账号

<?php
$spname="财付通双接口测试";
$partner = "";                                      //财付通商户号
$key = "";                                            //财付通密钥

$return_url = "http://www.xxx.com".$this->createUrl('Payment/Returns'); //显示支付结果页面,*替换成payReturnUrl.php所在路径
    
$notify_url = "http://www.xxx.com".$this->createUrl('Payment/payNotifyUrl'); //支付完成后的回调处理页面,*替换成payNotifyUrl.php所在路径
?>

 

转载于:https://www.cnblogs.com/huii/p/4726686.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

财付 API 接口文档样例代码 引言 文档概述 本文描述了财付开放平台的 JAVA SDK,帮助开发者轻松实现在线支、收款等功能。文档 详细介绍了财付开放平台的工作方式和开发过程,可以帮助开发人员快速入门并掌握开发技能,同时也 可以作为日后接口参数以及参数类型的速查手册。 阅读对象 具有 WEB 程序开发背景,了解 JAVA 语言。 业务术语 术语 ISV 说明 独立软件供应商 / Independent Software Vendor,可以是商户、个人或者第三方中介开发者 指 ISV 使用财付开放平台 SDK 开发的 WEB 应用程序, 运行于第三方服务器上为最终用户提供 服务 指财付的商户,商家可以是 ISV。 财付提供给 ISV 的开发注册、应用管理、沙箱测试平台。 指财付开放平台使用财付 APP 的财付用户 财付 APP 商户 开放平台 最终用户 接口业务流程 支流程 支流程中, 用户在财付 APP 中购买业务, 财付平台进行支。 典型业务流程如下: 买家在财付 APP 上浏览下单购买一个商品,财付 APP 会生成一个支链接,此链接过用 户的浏览器跳转到财付开放平台,财付过此链接获取支请求的参数,引导用户完成支过程。 用户在财付完成支后, 财付过 return_url 将用户浏览重新定向到财付 APP, 财付 APP 向用户提示订单状态和后续操作。同时,财付过后台回调财付 APP 的 notify_url,财付 APP 在 收到支结果知后可以根据知 ID 查询知内容,在确保支成功后再进行业务逻辑处理(例如发货) , 这样可以进一步提高安全性,防止伪支成功结果的诈骗。 知查询/订单查询流程 知查询/订单查询是指财付 APP 向财付系统发送查询请求,并同步等待财付系统处理完 毕后返回的响应数据数据交互是财付 APP 与财付服务器直接信。 例如用户在财付 APP 查询时,财付 APP 要确认用户某个订单是否支成功,可以向财付 发送一个查询请求,财付收到请求后返回查询结果,财付 APP 处理结果后再显示给用户。 后台知流程 后台知是指财付系统主动向财付 APP 发送数据,并同步等待财付 APP 处理完毕后 返回的响应数据数据交互是财付服务器与财付 APP 直接信,一般请求采用 http 的 get 或 post, 应答用字符串格式。 用户在财付成功后,财付会在后台过 notify_url 向财付 APP 发起知,财付 APP 处理后成功返回 success,失败返回 fail 或其他字符。 补单机制 对后台知流程, 如果财付收到财付 APP 的应答不是 success 或由于网络异常超时, 财付 认为知失败,财付过一定的策略(如1分钟、2分钟、4分钟、8分钟、16分钟、32分钟,共6次) 定期重新发起知,尽可能提高知的成功率,但财付不保证知最终能成功。 由于上述原因,可能存在同样的知多次发送给财付 APP 的情况。财付 APP 必须能够正确 处理,在收到重复的后台知不重复引发业务流程(例如发货) 。 财付推荐的做法是,当收到财付发送的知消息时,需要检查本系统内订单的状态,判断该 知是否已经处理过。为防止并发产生的问题,在对业务数据进行状态检查和处理之前,要求采用加锁判 断进行并发控制。 功能划分 财付 APP 负责与之业务相关的代码和页面。 财付开放平台提供支相关的业务功能和页面。具体业务功能请参照后面章节 SDK 说明 支页面如下: 在小钱包中: 在普浏览器中: SDK 说明 概述 API 说明 类名 com.tenpay.api.PayRequest com.tenpay.api.PayResponse com.tenpay.api.OrderQueryRequest com.tenpay.api.OrderQueryResponse com.tenpay.api.NotifyQueryRequest com.tenpay.api.NotifyQueryResponse com.tenpay.api.ShareLoginState 共享登录用户信息接口: ? 用户跳转到应用时,初始化 ShareLoginState 对象,ShareLoginState.getUserId()即可获得当前用 说明 支请求 支响应 订单查询请求 订单查询响应 知查询请求 知查询响应 共享登录用户信息 户的 id 支接口,常见开发步骤如下: ? ? ? ? ? 初始化请求对象 PayRequest 设置请求系统级参数(应用 ID 等) ,例如 PayRequest.setAppid(应用 ID) 设置请求业务级参数,例如 PayRequest.setParameters(参数名称, 参数值) 生成跳转 URL,例如 PayRequest.getURL() 将用户重定向到跳转 URL,例如 Servlet/JSP 中的重定向方法 response.sendRedirect()或用 Javascript 进行页面跳转 知查询或订单查询,常见开发步骤如下: ? ? ? 初始化请求对象,例如 NotifyQueryRequest 或 OrderQueryRequest 设置请求系统级参数(应用 ID 等) ,例如 NotifyQueryRequest.setAppid(应用 ID) 设置请求业务级参数,例如 NotifyQueryRequest.setParameters(参数名称, 参数值) ?? 过 NotifyQueryRequest.send() 方 法 将 请 求 发 送 到 接 口 并 获 得 响 应 对 象 , 例 如 NotifyQueryResponse response = NotifyQueryRequest.send() ?? 判断订单支状态,例如 NotifyQueryResponse.isPaySuccessful() ?? 从响应对象中获取参数值,进行相应处理,例如 NotifyQueryResponse.getParameter(参数名) 后台知交互模式,常见开发步骤如下: ?? 构造一个 Servlet 或 JSP 接收开放平台的回调 ?? 初始化响应对象 PayResponse ?? 判断订单支状态,例如 PayResponse.isPaySuccessful() ?? 从响应对象中获取参数值,进行相应处理,例如 PayResponse.getParameter(参数名) 调用过程 支类 支跳转 ·业务功能 买家在财付 APP 中下订单后款,财付 APP 调用财付开放平台支接口生成支 URL, 页面跳转到财付中心或银行。用户完成支后,财付把用户引导回财付 APP 指定的页面 (return_url) ,并过回调支请求中的 notify_url 反馈支结果。 ·接口调用方向 开发者开发应用调用财付开放接口 ·请求 com.tenpay.api.NotifyQueryRequest 方法列表 /** * 构造方法
参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值