IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Thinkphp6支付宝App支付 -> 正文阅读

[PHP知识库]Thinkphp6支付宝App支付

  1. 下载支付宝支付SDK放入extend文件下。
    在这里插入图片描述
  2. 将需要用到的文件加入命名空间方便后续使用,如订单验签等…。
    在这里插入图片描述在这里插入图片描述 3. 将alipay下所有文件中带有Exception的地方前面加斜杠(\)不然无法捕获到错误。
    在这里插入图片描述
  3. 添加测试数据返回唤起支付宝支付数据。
    public function aliArousePay()
    {
        $order_id     = $this->request->post('order_id/d', null);
        $order_number = $this->request->post('order_number/s', null);
        if (!$order_id and !$order_number) {
            return self::fail('订单ID或订单号必须存在其中一个');
        }
        $order_map = array(
            ['uid', '=', $this->userinfo['account']],
            ['pay_state', '<>', 20]
        );
        if ($order_id) {//订单ID
            $order_map[] = ['order_id', '=', $order_id];
        }
        if ($order_number) {//订单号
            $order_map[] = ['order_number', '=', $order_number];
        }
        $order_info = Order::where($order_map)->find();
        if (!$order_info) {
            return self::fail('该订单不存在或已支付');
        }
        if ($order_info['total_price'] <= 0) {
            return self::fail('订单支付金额不合法!');
        }
        //实例化阿里支付类
        $AliPayModel = new AopClient();
        //订单参数
        $unifiedOrderBody = array_filter([
            'total_amount'      => $order_info['total_price'],//订单总金额单位为元,[必填]
            'body'              => 'xxxxx',//订单描述
            'subject'           => $order_info['remark'] ?? '订单',//订单标题。注意:不可使用特殊字符,如 /,=,& 等。[必填]
            'out_trade_no'      => $order_info['order_number'],//商户订单号。由商家自定义,64个字符以内,仅支持字母、数字、下划线且需保证在商户端不重复。[必填]
            'goods_type'        => 0,//商品主类型,取值如下:0:虚拟类商品;1:实物类商品。
            'merchant_order_no' => $order_info['order_number'],//商户的原始订单号
        ]);
        //支付宝设置参数
        $param_data = array_filter([
            'app_id'      => config('alipay.app_id'),//支付宝分配给开发者的应用ID
            'method'      => 'alipay.trade.app.pay',//接口名称
            'charset'     => 'utf-8',//请求使用的编码格式
            'sign_type'   => 'RSA2',//商户生成签名字符串所使用的签名算法类型
            'timestamp'   => date("Y-m-d H:i:s"),  //发送请求的时间
            'version'     => 1.0,//调用的接口版本,固定为:1.0
            'notify_url'  => config('alipay.notify_url') . 'client/payment.xxxx/aliNotify',//支付宝服务器主动通知地址
            'biz_content' => json_encode($unifiedOrderBody),//业务请求参数的集合,长度不限,json格式
        ]);
        //组装请求签名参数
        $paramStr = $AliPayModel->getSignContent($param_data);
        //生成签名
        $sign = $AliPayModel->alonersaSign($paramStr, config('alipay.private_key'), 'RSA2');
        //赋值sign给支付宝设置参数
        $param_data['sign'] = $sign;
        //最终请求参数
        $result = $AliPayModel->getSignContentUrlencode($param_data);
        //返回唤起支付数据
        return self::successful('success', $result);
    }
  1. 测试可用
    在这里插入图片描述
  2. 支付宝订单验签
   public function aliNotify()
    {
        $data         = $_POST;
        $order_number = $data['out_trade_no'];//商户订单号
        $trade_no     = $data['trade_no'];//支付宝交易号
        $result_data  = $this->authAliOrder($order_number, $trade_no);
        if (!$result_data) {
            exit('FAIL');
        }
        $Order = new Order();
        $Order::startTrans();
        $order_info = $result_data;//订单信息
        try {
            $chang_data               = array(
                'pay_state'      => 20,//支付状态
                'pay_style'      => 30,//支付方式
                'pay_time'       => strtotime($data['gmt_payment']),//支付完成时间
                'payment_price'  => $data['buyer_pay_amount'],//支付金额
                'transaction_id' => $data['trade_no'],//微信支付订单号
                'notify_json'    => $data,
                'openid'         => $data['buyer_id'],
            );
            $chang_data['need_price'] = bcsub($order_info['total_price'], $chang_data['payment_price'], 2);
            $result                   = $Order->where([['order_id', '=', $order_info['order_id']]])->update($chang_data);
            if ($result) {
                $Order::commitTrans();
                exit("SUCCESS");
            }
            throw new Exception('操作失败');
        } catch (\Exception $exception) {
            $Order::rollbackTrans();
            exit("FAIL");
        }
    }


    public function authAliOrder(string $out_trade_no, string $trade_no)
    {
        if (!$out_trade_no || !$trade_no) {
            return false;
        }
        $AliPayModel = new AopClient ();
        $Order       = new Order();
        $request     = new AlipayTradeQueryRequest();
        $order_info  = $Order->where([['order_number', '=', $out_trade_no]])->find();
        if (!$order_info) {
            return false;
        }
        $AliPayModel->gatewayUrl         = 'https://openapi.alipay.com/gateway.do';
        $AliPayModel->appId              = config('alipay.app_id');
        $AliPayModel->rsaPrivateKey      = config('alipay.private_key');//'请填写开发者私钥去头去尾去回车,一行字符串'
        $AliPayModel->alipayrsaPublicKey = config('alipay.public_key');//'请填写支付宝公钥,一行字符串'
        $AliPayModel->apiVersion         = '1.0';
        $AliPayModel->signType           = 'RSA2';
        $AliPayModel->postCharset        = 'utf-8';
        $AliPayModel->format             = 'json';
        $request->setBizContent(json_encode(['out_trade_no' => $out_trade_no, 'trade_no' => $trade_no]));
        $result       = $AliPayModel->execute($request);
        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode   = $result->$responseNode->code;
        if (!empty($resultCode) && $resultCode == 10000) {
            return $order_info;
        }
        return false;
    }
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:09:09  更:2021-08-17 15:10:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 12:15:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码