Thinkphp6支付宝App支付

  1. 下载支付宝支付SDK放入extend文件下。
    Thinkphp6支付宝App支付_第1张图片
  2. 将需要用到的文件加入命名空间方便后续使用,如订单验签等…。
    Thinkphp6支付宝App支付_第2张图片Thinkphp6支付宝App支付_第3张图片 3. 将alipay下所有文件中带有Exception的地方前面加斜杠(\)不然无法捕获到错误。
    Thinkphp6支付宝App支付_第4张图片
  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. 测试可用
    Thinkphp6支付宝App支付_第5张图片
  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;
    }

你可能感兴趣的:(alipay,PHP,php)