支付宝TP5 手机网站支付

支付宝支付配置

  1. 下载密钥生成器

生成器下载地址

  1. 选择RSA2(JAVA选择JAVA,其它选择非JAVA)

在这里插入图片描述

  1. 在应用里配置公钥
    在这里插入图片描述

  2. 再在代码里配置

 'alipayConfig' => [
        'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//        'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//沙箱
        'appId' => "2021001123456789",//应用appId
        'rsaPrivateKey' => "MIIEpAIBAAKCAQEAlI...",//私钥
        'format' => "json",
        'charset' => "UTF-8",
        'signType' => "RSA2",
        'appRsaPublicKey' => "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQIIB...",//应用公钥
        'alipayRsaPublicKey' => "MIIBIjANBgkqhkiG9w0BAQEFAAO...",//支付宝公钥(回调需要)
        'notifyUrl' => "http://test.myweb.com/channelindex/Pay/aliNotify",//异步地址
        //'returnUrl' => "http://test.myweb.com/yxfw/",//支付完成返回地址
    ]
  1. 调起支付代码
/**
     *Describe:支付宝支付
     *User:yeungz
     *Date:2021/3/15 16:15
     */
    public function alipayOrder()
    {
        Vendor('payment.yxalipay.aop.AopClient');
        Vendor('payment.yxalipay.aop.request.AlipayTradeAppPayRequest');
        //验证登录
        $token = input('token');;
        $session = Session::get('user');
        if (!$token || $session == NULL) {
            echo json_encode(array('status' => 0, 'msg' => '用户未登录'));
            exit;
        }
        $userId = $session['id'];
        $projectId = input('post.projectId');
        $isDiscount = input('post.isDiscount');
        $inviteCode = input('post.inviteCode');
        $scenarioType = input('post.scenarioType');//支付场景类型:1app内,2外链
        checkParam(['scenarioType' => $scenarioType], 0, 1);
        if ($scenarioType == 1) {
            $returnUrl = "http://test.myweb.com/yxfw/project?projectId=" . $projectId;
        } else if ($scenarioType == 1) {
            $returnUrl = "http://www.baidu.com/#/download";
        } else {
            echo json_encode(array('status' => 0, 'msg' => '场景类型错误'));
            exit;
        }
        //创建本地order
        $orderData = [
            'projectId' => $projectId,
            'userId' => $userId,
            'type' => 1,//项目类型:1直接购买,2其它方式分账
            'isDiscount' => $isDiscount,
            'inviteCode' => $inviteCode,
            'detail' => '优选服务',
            'payment' => 'alipay',
            'total_fee' => 0,
        ];
        $out_trade_no = $this->createOrder($orderData);//创建本地订单并返回订单号
        $money = Db::name('channel_order')->where(['order_no' => $out_trade_no])->value('money');

        $aop = new \AopClient ();
        $config = Config::get('alipayConfig');
        $aop->gatewayUrl = $config['gatewayUrl'];
        $aop->appId = $config['appId'];
        $aop->rsaPrivateKey = $config['rsaPrivateKey'];
        $aop->format = $config['format'];
        $aop->charset = $config['charset'];
        $aop->signType = $config['signType'];
        $aop->alipayrsaPublicKey = $config['appRsaPublicKey'];//应用公钥
        //实例化具体API对应的request类,类名称和接口名称对应,alipay/aop/request/AlipayTradeAppPayRequest.php/getApiMethodName方法内下配置Api类型:alipay.trade.app.pay(app支付) / alipay.trade.wap.pay(手机网站支付)


        $request = new \AlipayTradeAppPayRequest();
        // 异步通知地址
        $notify_url = $config['notifyUrl'];
        // 返回地址
        $return_url = $returnUrl;
        // 订单标题
        $subject = '优选服务';
        // 订单详情
        $body = '优选服务';
        //SDK已经封装掉了公共参数,这里只需要传入业务参数
        $bizcontent = "{\"body\":\"" . $body . "\","
            . "\"subject\": \"" . $subject . "\","
            . "\"out_trade_no\": \"" . $out_trade_no . "\","
            . "\"timeout_express\": \"30m\","
            . "\"total_amount\": \"" . $money . "\","
            . "\"product_code\":\"QUICK_MSECURITY_PAY\""
            . "}";

        $request->setNotifyUrl($notify_url);
        $request->setReturnUrl($return_url);
        $request->setBizContent($bizcontent);
        //这里和普通的接口调用不同,使用的是sdkExecute
//        $response = $aop->sdkExecute($request);
        $response = $aop->pageExecute($request);
        // 注意:这里不需要使用htmlspecialchars进行转义,直接返回即可

        echo json_encode(array('aliData' => $response, 'orderNo' => $out_trade_no));
    }
  1. 回调代码
/**
     *Describe:支付宝回调
     *User:yeungz
     *Date:2021/3/18 15:42
     */
    public function aliNotify()
    {
        $orderTab = Db::name('channel_order');
        $projectTab = Db::name('channel_project');
        $facilitatorTab = Db::name('channel_facilitator');
        $businessTab = Db::name('channel_business');
        $platformTab = Db::name('channel_platform');
        $commission = Db::name('channel_commission_order');
        $response = $_POST;
        file_put_contents('./uploads/aliPayNofity.log', date('YmdHis') . json_encode($response) . '', FILE_APPEND);

        Vendor('payment.yxalipay.aop.AopClient');
        $aop = new \AopClient ();
        $config = Config::get('alipayConfig');
        $aop->alipayrsaPublicKey = $config['alipayRsaPublicKey'];//支付宝公钥
        $orderNo = $response['out_trade_no'];

        //付款成功回调
        if ($response['trade_status'] == 'TRADE_SUCCESS') {
            //验签
            if (!$aop->rsaCheckV1($response, null, "RSA2")) {
                file_put_contents('./uploads/aliPayNofity.log', date('YmdHis') . ' sign error', FILE_APPEND);
                exit;
            }

            //查询订单
            $orderInfo = $orderTab->where(['order_no' => $orderNo])->find();
            file_put_contents('./uploads/aliPayNofity.log', json_encode($orderInfo) . ' sign right', FILE_APPEND);
            if (!$orderInfo)
                exit;

            if ($orderInfo['status'] == 1) {
                echo 'success';
                exit;
            }
            //处理订单
            $projectInfo = $projectTab->where(['id' => $orderInfo['project_id']])->find();
            $money = $orderInfo['money'] * 0.5;
            if ($projectInfo['commission_type'] == 1) {//佣金类型:1固定占比,2固定金额
                $businessCommission = $money * ($projectInfo['business_commission'] / 100);//商务占比分佣金额
                $facilitatorCommission = $money * ($projectInfo['facilitator_commission'] / 100);//邀请者服务商占比分佣金额
                $platformCommision = $money - $businessCommission - $facilitatorCommission;//平台占比分佣金额
            } elseif ($projectInfo['commission_type'] == 2) {
                $businessCommission = $projectInfo['business_commission'];//商务固定分佣金额
                $facilitatorCommission = $projectInfo['facilitator_commission'];//邀请者服务商固定分佣金额
                $platformCommision = $money - $businessCommission - $facilitatorCommission;//平台固定分佣金额
            }
            if ($orderInfo['inviter_user_id'] > 0) {//有邀请人
                $inviterUid = $orderInfo['inviter_user_id'];//商务:邀请人
                $facilitatorId = $businessTab->where(['user_id' => $inviterUid])->value('facilitator_id');//服务商:邀请人的服务商
                $facilitatorUid = $facilitatorTab->where(['id' => $facilitatorId])->value('user_id');
                $facilitatorUid = $facilitatorUid ? $facilitatorUid : 0;
            } else {//无邀请人
                $myBusiness = $businessTab->where(['user_id' => $orderInfo['user_id']])->find();
                if ($myBusiness) {
                    $inviterUid = $businessTab->where(['user_id' => $orderInfo['user_id']])->value('inviter_user_id');//商务:邀请人
                    $facilitatorId = $businessTab->where(['user_id' => $orderInfo['user_id']])->value('facilitator_id');//服务商:自己的服务商
                    $facilitatorUid = $facilitatorTab->where(['id' => $facilitatorId])->value('user_id');
                } else {
                    $inviterUid = 0;
                    $facilitatorUid = $facilitatorTab->where(['type' => 1])->value('user_id');
                }
                $facilitatorUid = $facilitatorUid ? $facilitatorUid : 0;
            }
            $platformUid = $platformTab->value('user_id');
            $userData = [
                'business' => [
                    'type' => 1,
                    'userId' => $inviterUid,
                    'commission' => $businessCommission,
                ],
                'facilitator' => [
                    'type' => 2,
                    'userId' => $facilitatorUid,
                    'commission' => $facilitatorCommission,
                ],
                'platform' => [
                    'type' => 3,
                    'userId' => $platformUid,
                    'commission' => $platformCommision,
                ],
            ];
            $checkOrder = $commission->where(['order_id' => $orderInfo['id']])->count();
            if ($checkOrder <= 0) {
                $orderModel = new orderModel();
                $res = $orderModel->createComissionOrder($userData, $orderInfo);
                if ($res) {
                    echo 'success';
                    echo json_encode(['status' => 1, 'msg' => '分账成功']);
                    exit;
                } else {
                    echo json_encode(['status' => 0, 'msg' => '分账异常']);
                    exit;
                }
            } else {
                echo json_encode(['status' => 0, 'msg' => '请勿重复操作']);
                exit;
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Oct zz拾月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值