Thinkphp5开发电脑网站支付宝支付详细流程(线上测试篇)

在沙箱测试篇讲过的我在这里就不再做重复,详情请见上一篇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为网页重定向通知,是由客户的浏览器触发的一个通知,若客户去网银支付,也会受银行接口影响,由于各种影响因素特别多,所以该种类型的通知支付宝不保证其到达率。 

本章转载自 https://blog.csdn.net/yuijar/article/details/80291726

猜你喜欢

转载自blog.csdn.net/jartins/article/details/81115689