thinkPHP6中实现支付宝支付

  • 我用的是沙箱环境做的测试, 步骤如下:

  • 获取配置信息 点击进入网站, 当然在此之前要先申请个沙箱应用

  • 下图是获取到 APPID, 后面会用到
    thinkPHP6中实现支付宝支付_第1张图片

  • 下面是获取到公钥和私钥, 由于我之前设置过公钥, 如果是刚刚创建的沙箱应用, 那么可能和我的页面稍有不同, 但是只需要按照提示操作获取公钥和私钥即可

  • 由于我忘记私钥是多少了, 所以需更换下公钥以重新获取私钥, 操作如下:

  • 重新生成私钥的话, 需要下载一个工具, 点击进入下载链接, 选择自己电脑操作系统对应的版本即可

thinkPHP6中实现支付宝支付_第2张图片

  • 生成秘钥
    thinkPHP6中实现支付宝支付_第3张图片
  • 生成秘钥之后, 复制下面的 应用公钥,然后回到之前获取 APPID 的页面
    thinkPHP6中实现支付宝支付_第4张图片
  • 将之前复制的 应用公钥 粘贴在如下图位置, 点击保存设置即可
    thinkPHP6中实现支付宝支付_第5张图片

  • 以上是配置信息的获取, 下面开始代码, 我用的一个第三方的扩展实现的支付: yansongda/pay, 下载对应的版本即可

declare (strict_types=1);

namespace app\Home\controller;

class Pay
{
    protected $config = [
        'app_id' => '沙箱应用的APPID',
        'notify_url' => '服务器端回调地址,必须是线上可访问的',
        'return_url' => '前端回调地址',
        'ali_public_key' => '支付宝公钥', // 注意: 这里不是应用公钥,是支付宝公钥
        'private_key' => '之前通过工具生成的私钥',
        'log' => [ // optional
            'file' => '',
            'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
            'type' => 'single', // optional, 可选 daily.
            'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
        ],
        'http' => [ // optional
            'timeout' => 5.0,
            'connect_timeout' => 5.0,
            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
        ],
        'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
    ];

    public function __construct()
    {
	    // thinkPHP 中我发现总是报文件写入权限不够, 哪怕我给了 777 仍然不行, 所以就有了下面这种写法
        $this->config['log']['file'] = app()->getRuntimePath() . 'log/alipay.log';
    }

    public function pay(Request $request)
    {
        $order = [
            'out_trade_no' => '订单号',
            'total_amount' => '订单价格',
            'subject' => '订单名称',
        ];

        $alipay = \Yansongda\Pay\Pay::alipay($this->config)->web($order);

        return $alipay->send();
    }

    // 前端回调
    public function alipayReturn()
    {
        $data = \Yansongda\Pay\Pay::alipay($this->config)->verify(); // 验签
        // ...
    }

    // 服务器回调
    public function alipayNotify()
    {
        $alipay = \Yansongda\Pay\Pay::alipay($this->config); 
        $data = $alipay->verify(); // 验签
        
        // $data->trade_status 表示订单状态,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
        // $data->out_trade_no 是我们自己之前生成的订单号
        // $data->trade_no 是支付宝返回给我们的订单号
        // 所有的信息都记录在 $config 中配置的文件中, 可以在其中查看信息,也可以查看支付宝文档 https://opendocs.alipay.com/open/203/105286
        if (!in_array($data->trade_status, ['TRADE_SUCCESS', 'TRADE_FINISHED'])) {
            return $alipay->success()->send();
        }
                
        return $alipay->success()->send();
    }
}

你可能感兴趣的:(ThinkPHP,thinkPHP,支付宝支付,PHP)