三、在项目配置文件中加入接口配置参数
//财付通配置参数 'tenpay_config' => array( 'partner' => '**********', //这里是你在成功申请财付通接口后获取到的商户号; 'key' => '*******************', //这里是你在成功申请财付通接口后获取到的密钥 'return_url' => '********/tenreturnurl', 'notify_url' => '********/tennotifyurl', ),
三、在支付操作的控制器中加入代码如下
public function tenpay($data) { $tenpay_config = C('tenpay_config'); /* 获取提交的订单号 */ $out_trade_no = $data["orderid"]; /* 获取提交的商品名称 */ $product_name = $data["title"]; /* 获取提交的商品价格 */ $order_price = $data["money"]; /* 获取提交的备注信息 */ $remarkexplain = $data["remark"]; /* 支付方式 */ $trade_mode = 1; $strDate = date("Ymd"); $strTime = date("His"); /* 商品价格(包含运费),以分为单位 */ $total_fee = $order_price * 100; /* 商品名称 */ $desc = "商品:" . $product_name . ",备注:" . $remarkexplain; /* 创建支付请求对象 */ $reqHandler = new \Think\Tenpay\RequestHandler(); $reqHandler->init(); $reqHandler->setKey(trim($tenpay_config['key'])); $reqHandler->setGateUrl("https://gw.tenpay.com/gateway/pay.htm"); //---------------------------------------- //设置支付参数 //---------------------------------------- $reqHandler->setParameter("partner", trim($tenpay_config['partner'])); $reqHandler->setParameter("out_trade_no", $out_trade_no); $reqHandler->setParameter("total_fee", $total_fee); //总金额 $reqHandler->setParameter("return_url", $tenpay_config['return_url']); $reqHandler->setParameter("notify_url", $tenpay_config['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信息写入日志,方便定位问题 /**/ $reqHandler->doSend2($reqUrl); $debugInfo = $reqHandler->getDebugInfo(); }
声明一下,$data是商品的参数,里面必须包含订单号,商品名称,订单描述,商品价格。上述代码中的doSend2函数是一个跳转函数,修改的是ResponseHandler.class.php中的dosend函数。
function doSend2($url) { header("Location:" . $url); exit; }
四、支付成功跳转处理
/* 财付通页面跳转处理方法; */ function tenreturnurl() { /* 创建支付应答对象 */ $tenpay_config = C('tenpay_config'); $resHandler = new \Think\Tenpay\ResponseHandler(); $resHandler->setKey(trim($tenpay_config['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"); //支付完成时间 $time_end = $resHandler->getParameter("time_end"); $parameter = array( "out_trade_no" => $out_trade_no, //商户订单编号; "trade_no" => $transaction_id, //财付通订单号; "total_fee" => $total_fee, //交易金额; "trade_status" => $trade_state, //交易状态 "notify_id" => $notify_id, //通知校验ID。 "notify_time" => $time_end, //通知的发送时间。 ); if ("1" == $trade_mode) { if ("0" == $trade_state) { $status = CommonController::checkorderstatus($out_trade_no); if (!$status) { CommonController::orderhandle($parameter); //进行订单处理,并传送从支付宝返回的参数; } $this->success("支付成功", U('Home/Order/Payscuess', array('id' => $out_trade_no))); } else { //当做不成功处理 $this->error("支付失败"); } } } else { $this->error("认证签名失败," . $resHandler->getDebugInfo()); } } /* 财付通异步通知处理方法; */ function tennotifyurl() { $tenpay_config = C('tenpay_config'); /* 创建支付应答对象 */ $resHandler = new \Think\Tenpay\ResponseHandler(); $resHandler->setKey(trim($tenpay_config['key'])); //判断签名 if ($resHandler->isTenpaySign()) { //通知id $notify_id = $resHandler->getParameter("notify_id"); //通过通知ID查询,确保通知来至财付通 //创建查询请求 $queryReq = new \Think\Tenpay\RequestHandler(); $queryReq->init(); $queryReq->setKey(trim($tenpay_config['key'])); $queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml"); $queryReq->setParameter("partner", trim($tenpay_config['partner'])); $queryReq->setParameter("notify_id", $notify_id); //通信对象 $httpClient = new \Think\Tenpay\client\TenpayHttpClient(); $httpClient->setTimeOut(5); //设置请求内容 $httpClient->setReqContent($queryReq->getRequestURL()); //后台调用 if ($httpClient->call()) { //设置结果参数 $queryRes = new \Think\Tenpay\client\ClientResponseHandler(); $queryRes->setContent($httpClient->getResContent()); $queryRes->setKey(trim($tenpay_config['key'])); if ($resHandler->getParameter("trade_mode") == "1") { //判断签名及结果(即时到帐) //只有签名正确,retcode为0,trade_state为0才是支付成功 if ($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $resHandler->getParameter("trade_state") == "0") { //通知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"); //支付完成时间 $time_end = $resHandler->getParameter("time_end"); $parameter = array( "out_trade_no" => $out_trade_no, //商户订单编号; "trade_no" => $transaction_id, //财付通订单号; "total_fee" => $total_fee, //交易金额; "trade_status" => $trade_state, //交易状态 "notify_id" => $notify_id, //通知校验ID。 "notify_time" => $time_end, //通知的发送时间。 ); $status = CommonController::checkorderstatus($out_trade_no); if (!$status) { CommonController::orderhandle($parameter); //进行订单处理,并传送从支付宝返回的参数; } echo "success"; } else { echo "fail"; } } } else { //通信失败 echo "fail"; //后台调用通信失败,写日志,方便定位问题 echo "<br>call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>"; } } else { echo "<br/>" . "认证签名失败" . "<br/>"; echo $resHandler->getDebugInfo() . "<br>"; } }
其中的checkorderstatus和orderhandle用的是上述支付宝即时交易案例中的订单处理函数
//处理订单函数 //更新订单状态,写入订单支付后返回的数据 function orderhandle($parameter) { $ordid = $parameter['out_trade_no']; $data['trade_no'] = $parameter['trade_no']; $data['trade_status'] = $parameter['trade_status']; $data['notify_id'] = $parameter['notify_id']; $data['notify_time'] = $parameter['notify_time']; $data['buyer_email'] = $parameter['buyer_email']; $data['paystatus'] = 1; $Ord = M('order'); $Ord->where('orderid=' . $ordid)->save($data); } //在线交易订单支付处理函数 //函数功能:根据支付接口传回的数据判断该订单是否已经支付成功; //返回值:如果订单已经成功支付,返回true,否则返回false; function checkorderstatus($ordid) { $Ord = M('order'); $ordstatus = $Ord->where('orderid=' . $ordid)->getField('paystatus'); if ($ordstatus == 1) { return true; } else { return false; } }
php(utf8).zip ( 60.83 KB 下载:280 次 )