在沙箱测试篇讲过的我在这里就再也不作重复,详情请见上一篇PHP开发电脑网站支付宝支付详细流程(沙箱测试篇)php
在沙箱测试的时候使用的是沙箱环境中的配置,如今进行线上测试,须要建立应用数据库
登陆蚂蚁金服开放平台商户帐号,进入管理中心数组
选择开发者中心->网页&移动应用浏览器
选择支付接入服务器
根据开发需求填写基本信息网络
建立完成后,完善基本信息app
上传应用图标框架
选择须要的功能(注:功能须要签约)异步
在开发配置这里,按照沙箱测试的时候同样,生成密钥,设置受权回调地址等,而后提交审核(审核须要1个工做日)函数
审核经过后会显示状态已上线,一样也能够看到appid
能够点击查看->应用信息查看你须要的信息和配置
官方建立应用详细流程请见(https://docs.open.alipay.com/399/106843/)
二、封装类库,选择须要的功能放入框架
我本身选择了支付模块的功能,找到付款须要的类库,所有放入extend
(须要的能够下载https://pan.baidu.com/s/17A2YMahZX6nNmS2sCwJKzQ)
我拿出配置文件放入application/extra目录下,格式改为return的数组形式
注意:我在配置文件里加入了seller_id的配置(seller_id能够在帐户信息中查看)
创建一个支付的控制器,引入文件,具体代码以下
<?php
namespace app\index\controller;
use think\Controller;
//支付控制器
class Pay extends Controller{
//发起电脑网站支付请求
public function pagePay(){
//商户订单号,商户网站订单系统中惟一订单号,必填
$out_trade_no = trim($_POST['out_trade_no']);
//订单名称,必填
$subject = trim($_POST['subject']);
//付款金额,必填
$total_amount = trim($_POST['total_amount']);
//商品描述,可空
//$body = trim($_POST['body']);
//构造参数
$payRequestBuilder = new \alipay\AlipayTradePagePayContentBuilder();
// $payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$aop = new \alipay\AlipayTradeService();
/**
* pagePay 电脑网站支付请求
* @param $builder 业务参数,使用buildmodel中的对象生成。
* @param $return_url 同步跳转地址,公网能够访问
* @param $notify_url 异步通知地址,公网能够访问
* @return $response 支付宝返回的信息
*/
$response = $aop->pagePay($payRequestBuilder,config('alipay.return_url'),config('alipay.notify_url'));
}
//回调地址
public function notify_url(){
$arr=$_POST;
$alipaySevice = new \alipay\AlipayTradeService();
$alipaySevice->writeLog(var_export($_POST,true));
$result = $alipaySevice->check($arr);
/* 实际验证过程建议商户添加如下校验。
一、商户须要验证该通知数据中的out_trade_no是否为商户系统中建立的订单号,
二、判断total_amount是否确实为该订单的实际金额(即商户订单建立时的金额),
三、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操做方(有的时候,一个商户可能有多个seller_id/seller_email)
四、验证app_id是否为该商户自己。
*/
if($result) {//验证成功
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(如下代码仅做参考)
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经作过处理
//若是没有作过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//若是有作过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
}
else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经作过处理
//若是没有作过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//若是有作过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
}
//——请根据您的业务逻辑来编写程序(以上代码仅做参考)——
echo "success";//请不要修改或删除
}else {
//验证失败
echo "fail";
}
}
}
在生成订单后,访问pagePay这个函数,发起电脑网站的支付请求
在请求回应后跳转到回调地址notify_url,如果支付正常,则更新数据库的信息,具体代码就再也不这里进行展现了(若是实在须要能够私聊我)
注意:return_url 和 notify_url 的区别
notify_url为服务器通知,支付宝能够保证99.9999%的通知到达率,前提是您的网络通畅。
return_url为网页重定向通知,是由客户的浏览器触发的一个通知,若客户去网银支付,也会受银行接口影响,因为各类影响因素特别多,因此该种类型的通知支付宝不保证其到达率。