当用户进行支付操做时候能够直接跳转到支付宝支付页面进行支付 php
关于支付宝签约即时到帐和PID获取、密钥生成这里不作叙述,官方文档步骤也很清楚:传送门前端
支付宝即时到帐DEMO下载:下载json
简单使用须要的文件说明后端
./alipay.config.php --- 配置文件api
./alipayapi.php ------- 接口文件安全
./notify_url.php ------ 服务器异步通知文件服务器
./return_url.php ----- 服务器同步跳转文件curl
./log.txt -------------- 日志异步
在配置文件中有详细的说明,主要配置有函数
$alipay_config['partner'] = '208862160xxxxxxx'; // 合做者身份ID $alipay_config['private_key'] = "xxxxxxxxxxxxx”; // 商户的私钥,此处填写原始私钥去头去尾 $alipay_config['notify_url'] = "http://xxxx/alipay/notify_url.php"; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网能够正常访问 $alipay_config['return_url'] = "http://xxxx/alipay/return_url.php"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网能够正常访问
其余配置按实际状况配置
请求通常都是form表单post请求alipayapi.php,涉及到金钱操做的咱们都要当心严谨,这种请求代码须要封装到后端,不能前端展现出来
例如,咱们能够后端封装个方法来进行处理,请求这个方法将代码echo到页面直接进行二次跳转
/** * 支付宝支付 * @param string $id ID */ public function getAlipayParam($id) { $form = <<<FORM <form style='display: none;' action='提交URL' name='payForm' method='post'> <input name='WIDout_trade_no' value='订单编号'> <input name='WIDsubject' value='订单名称'> <input name='WIDtotal_fee' value='金额'> <input name='WIDbody' value='商品描述'> <input name='extra_common_param' value='公共回参'> </form> <script> function submitForm() { document.payForm.submit(); } submitForm(); </script> FORM; echo $form; }
在DEMO中(alipay.php)接受的请求参数并很少,实际上请求参数是很全面的:请求参数列表
咱们能够根据实际需求进行扩展,实际开发中为了安全,请求的name能够适当的进行改变
/**************************请求参数**************************/ //商户订单号,商户网站订单系统中惟一订单号,必填 $out_trade_no = $_POST['WIDout_trade_no']; //订单名称,必填 $subject = $_POST['WIDsubject']; //付款金额,必填 $total_fee = $_POST['WIDtotal_fee']; //商品描述,可空 $body = $_POST['WIDbody']; //公共回传参数 $extra_common_param = $_POST['extra_common_param'];
跳转到支付页面进行支付
关于异步通知的参数:服务器异步通知参数列表
前面提到异步通知请求到notify_url.php(根据我的配置)
异步通知主要负责处理支付结果的业务逻辑,这个须要本身根据项目需求更改编写
例如
<?php /* * * 功能:支付宝服务器异步通知页面 * 版本:3.5 * 日期:2016-06-25 * 说明: * 如下代码只是为了方便商户测试而提供的样例代码,商户能够根据本身网站的须要,按照技术文档编写,并不是必定要使用该代码。 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 *************************页面功能说明************************* * 建立该页面文件时,请留心该页面文件中无任何HTML代码及空格。 * 该页面不能在本机电脑测试,请到服务器上作测试。请确保外部能够访问该页面。 * 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyNotify * 若是没有收到该页面返回的 success 信息,支付宝会在24小时内按必定的时间策略重发通知 */ require_once("alipay.config.php"); require_once("admin.config.php"); require_once("lib/alipay_notify.class.php"); require_once("log.php"); //计算得出通知验证结果 $alipayNotify = new AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); //初始化日志 $logHandler = new CLogFileHandler('logs/'.date('y-m-d').'.log'); $log = Log::Init($logHandler, 15); if($verify_result) {//验证成功 Log::DEBUG(json_encode($_POST)); // 操做类型 $extra_common_param = $_POST['extra_common_param']; // 订单编号 $code = $_POST['out_trade_no']; // 支付宝交易号 $trade_no = $_POST['trade_no']; // 交易状态 $trade_status = $_POST['trade_status']; /** * 判断交易状态 * ------------------------------------------------------------------------ * 判断该笔订单是否在商户网站中已经作过处理 * 若是没有作过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 * 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 * 若是有作过处理,不执行商户的业务程序 * ------------------------------------------------------------------------ * 调试用,写文本函数记录程序运行状况是否正常 * logResult("这里写入想要调试的代码变量值,或其余运行的结果记录"); */ if ($trade_status == 'TRADE_FINISHED') { //注意:退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 } elseif ($trade_status == 'TRADE_SUCCESS') { //注意:付款完成后,支付宝系统发送该交易状态通知 switch ($extra_common_param) { case AdminConfig::OPER_PLACE_ORDER: // 判断该订单是否处理过 $url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no; $is_order = request($url); if ($is_order == 'success') { // 订单未处理 // 修改订单的相关状态为已支付 $url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no; request($url); } break; case AdminConfig::OPER_RECHARGE: //修改充值订单支付状态为已支付 $id = $_POST['out_trade_no']; $outtrade_no = $_POST['trade_no']; $money = $_POST['total_fee']; $url = AdminConfig::ORDER_URL . 'xxx/xxx/id/'.$id.'/money/'.$money.'/outtradeno/'.$outtrade_no; request($url); break; } } echo "success"; //请不要修改或删除 } else { //验证失败 echo "fail"; } /** * 发送请求 * @param string $url 请求地址 * @param array $data 请求数据 * @param string $type 请求类型 * @param boolean $ssl 是不是HTTPS请求 * @return string 响应主体Content */ function request($url, $data=array(), $type='get', $ssl=false) { // curl请求 $curl = curl_init(); // 设置curl选项 curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_AUTOREFERER, true); // referer 请求来源 curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 设置超时时间 // SSL相关 if ($ssl) { curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 是否在服务端进行验证 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, '2'); // 检查服务器SSL证书中是否存在一个公用名 } // POST请求 if ($type == 'post') { curl_setopt($curl, CURLOPT_POST, true); // 是否为post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // 处理请求数据 } // 处理响应结果 curl_setopt($curl, CURLOPT_HEADER, false); // 是否处理响应头 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 是否返回响应结果 // 发送请求 $response = curl_exec($curl); if (false === $response) { return false; } return $response; } ?>
关于同步通知的参数:服务器同步通知参数列表
前面提到同步通知请求到return_url.php(根据我的配置)
同步通知主要负责处理支付结果的结果展现,这个须要本身根据项目需求更改编写
例如
/** * 判断该笔订单是否在商户网站中已经作过处理 * 若是没有作过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 * 若是有作过处理,不执行商户的业务程序 */ if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { // 交易成功或交易成功且订单结束 switch ($extra_common_param) { case AdminConfig::OPER_PLACE_ORDER: // 订单支付 $url = AdminConfig::ORDER_URL . 'xxx/orderPaySuccessShow'; header("Location:$url"); break; case AdminConfig::OPER_RECHARGE: $url = AdminConfig::ORDER_URL . 'xxx/rechargeSuccessShow'; header("Location:$url"); break; default: echo 'Undefined operation type!!'; break; } } else { // 交易状态未成功 switch ($extra_common_param) { case AdminConfig::OPER_PLACE_ORDER: // 订单支付 $url = AdminConfig::ORDER_URL . 'xxx/orderPayFailShow'; header("Location:$url"); break; case AdminConfig::OPER_RECHARGE: $url = AdminConfig::ORDER_URL . 'xxx/rechargeFailShow'; break; default: echo 'Undefined operation type!!'; break; } }
其余一些细节性问题请你们参阅官方文档,文档永远是最好的教程!