为什么80%的码农都做不了架构师?>>>
在沙箱测试篇讲过的我在这里就不再做重复,详情请见上一篇PHP开发电脑网站支付宝支付详细流程(沙箱测试篇)
在沙箱测试的时候使用的是沙箱环境中的配置,现在进行线上测试,需要创建应用
1、创建应用
登录蚂蚁金服开放平台商户账号,进入管理中心
选择开发者中心->网页&移动应用
选择支付接入
根据开发需求填写基本信息
创建完成后,完善基本信息
上传应用图标
选择需要的功能(注:功能需要签约)
在开发配置这里,按照沙箱测试的时候一样,生成密钥,设置授权回调地址等,然后提交审核(审核需要1个工作日)
审核通过后会显示状态已上线,同样也可以看到appid
可以点击查看->应用信息查看你需要的信息和配置
官方创建应用详细流程请见(https://docs.open.alipay.com/399/106843/)
2、封装类库,选择需要的功能放入框架
我自己选择了支付模块的功能,找到付款需要的类库,全部放入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);
-
/* 实际验证过程建议商户添加以下校验。
-
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
-
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
-
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
-
4、验证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为网页重定向通知,是由客户的浏览器触发的一个通知,若客户去网银支付,也会受银行接口影响,由于各种影响因素特别多,所以该种类型的通知支付宝不保证其到达率。