博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
支付宝即时到账DEMO配置与使用
阅读量:6336 次
发布时间:2019-06-22

本文共 6316 字,大约阅读时间需要 21 分钟。

支付宝网页即时到账功能,可让用户在线向开发者的支付宝账号支付资金,交易资金即时到账,帮助开发者快速回笼资金。

当用户进行支付操作时候可以直接跳转到支付宝支付页面进行支付 

准备

 关于支付宝签约即时到账和PID获取、密钥生成这里不做叙述,官方文档步骤也很清楚:

 支付宝即时到账DEMO下载:

DEMO目录结构

 

 简单使用需要的文件说明

 ./alipay.config.php --- 配置文件

 ./alipayapi.php ------- 接口文件

 ./notify_url.php ------ 服务器异步通知文件

 ./return_url.php ----- 服务器同步跳转文件

 ./log.txt -------------- 日志

配置alipay.config.php

在配置文件中有详细的说明,主要配置有

$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; 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(根据个人配置)

异步通知主要负责处理支付结果的业务逻辑,这个需要自己根据项目需求更改编写

例如

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;        }    }

关于交易状态

 其他一些细节性问题请大家参阅,文档永远是最好的教程!

转载于:https://www.cnblogs.com/bndong/p/6860949.html

你可能感兴趣的文章
IO/内存/文件系统
查看>>
在 Vue.js 中使用任意 JavaScript 第三方库
查看>>
JavaScript中的Date对象
查看>>
jq滑动箭头跟随,选项卡功能
查看>>
深入学习js的面向对象
查看>>
Vue常用组件的开发
查看>>
数据库厂商都怕低价竞争?阿里云说并不可惧
查看>>
从保障淘宝到全球市场“第一阵营”,阿里云的DDoS防护之路走了多远?
查看>>
Nodejs接入微信JS-SDK全过程
查看>>
Cookie、SessionStorage、LocalStorage应用及区别
查看>>
vue2.5全家桶 高仿vivo商城 百分之95
查看>>
北京大学严睿:虚火过旺?揭秘人机对话的技术现状与挑战
查看>>
AI是如何回答你提出的问题的?揭秘智能问答系统背后的深度学习网络
查看>>
C4C和CRM里获取当前登录用户分配的Organization Unit信息
查看>>
记一次重装nginx时遇到的问题
查看>>
webstorm(2017.3.2)搭建eslint,错误提示和自动修复
查看>>
深入浅出webpack学习(8)--配置DevServer
查看>>
最简单的序列帧动画canvas插件
查看>>
基于Docker的日志分析平台(四)平台整合
查看>>
java高并发之从零到放弃(四)
查看>>