tp5实现支付宝支付二维码,扫码(当面付)

这里只说扫码支付,使用官方的代码,为什么没使用yansongda之类的组件,因为这个封装的太深了问题不好找,所以使用了官方的代码

支付宝支付文档:https://opendocs.alipay.com/open/270/01didh?pathHash=a6ccbe9a

官方代码仓库:https://github.com/alipay/alipay-sdk-php-all   选v2还是v3看自己的情况

首先要开通当面付~   自己看文档(产品介绍 - 支付宝文档中心 (alipay.com)

流程:1,调用统一收单线下交易预创建接口,传入订单数据价格,订单号等,生成二维码返回给前端,我这里是用在PC网页上 (统一收单线下交易预创建接口 - 支付宝文档中心 (alipay.com)

           2,用户扫码,付款->回调->回调逻辑->入库  (异步通知说明 - 支付宝文档中心 (alipay.com)

使用场景:PC前端调用接口,接到二维码地址,放到canvas展示

<view>
   <canvas canvas-id="qrcode" class="cz_wx"></canvas>
</view>

 

 

 

 

 php代码:调用下单接口,返回二维码给前端

    /**
     * 支付宝支付(独立)
     */
    public function alipay($out_trade_no, $total_amount, $subject)
    {
        require_once('../extend/alipay/aop/AopClient.php');
        require_once('../extend/alipay/aop/request/AlipayTradePrecreateRequest.php');
        $aop = new \AopClient();
        $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
        $aop->appId = '自己的appid';
        $aop->rsaPrivateKey = '写自己的应用私钥';
        $aop->alipayrsaPublicKey = '写自己的公钥';
        $aop->apiVersion = '1.0';
        $aop->signType = 'RSA2';
        $aop->postCharset = 'UTF-8';
        $aop->format = 'json';
        $object = new \stdClass();
        $object->out_trade_no = $out_trade_no; //订单号
        $object->total_amount = $total_amount; //金额
        $object->subject = $subject; //商品名称

        $json = json_encode($object);
        $request = new \AlipayTradePrecreateRequest();
        $notify = 'http://zsscadmin.vhost.chengzhanheng.cn/api/paynotify/alinotify';
        $request->setNotifyUrl($notify);
        $request->setBizContent($json);
        $result = $aop->execute($request);

        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode = $result->$responseNode->code;
        if (!empty($resultCode) && $resultCode == 10000) {
            return $result->$responseNode->qr_code;
            // $this->success('生成成功', $result->$responseNode->qr_code);
            // echo "成功";
        } else {
            echo false;
        }
    }
}

php代码:回调

/**
     * 支付宝回调
     */
    public function alinotify()
    {
        require_once('../extend/alipay/config.php');
        require_once('../extend/alipay/pagepay/service/AlipayTradeService.php');

        $arr = $_POST;
        $alipaySevice = new \AlipayTradeService($config);
        $alipaySevice->writeLog(var_export($_POST, true));
        $result = $alipaySevice->check($arr);
        if ($result) {
            if ($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED') {
                $payamount = $_POST['total_amount']; //支付金额
                $out_trade_no = $_POST['out_trade_no']; //订单号
                //找出该订单
                $pay_map = [];
                $pay_map['pay_no'] = ['=', $out_trade_no];
                $PayLog = (new RechargeOrder())->where($pay_map)->find();
$userInfo = (new \app\common\model\User())->where('id', '=', $PayLog['userid'])->find();
if (!$userInfo) {
           echo 'fail';
                    exit();
                }
                if ($PayLog['is_pay'] == 1 && $PayLog['paytime']) {
                 echo 'fail';
                    exit();
                }

                //开启事务
                $user_model = (new \app\common\model\User());
                $log_model = (new RechargeOrder());

                $log_model->startTrans();
                $user_model->startTrans();

                try {
                    //通过账单获取充值记录
                    $updatedata = [
                        'id' => $PayLog['id'],
                        'payamount' => $payamount,
                        'is_pay' => 1,
                        'pay_json' => 'xxxxxx',
                        'paytime' => time(),
                        'updatetime' => time(),
                    ];
                    $pay_log_res = $log_model->isUpdate(true)->save($updatedata);
                    //$pay_log_res = Db::name('recharge_order')->where('id', $PayLog['id'])->update($updatedata);
                    //增加速写豆
                    $title = '充值速写豆¥' . $payamount;

                    $bili = 10;
                    //            充值比例计算
                    if (!empty($this->config['pay_ratio'])) {
                        $bili = $this->config['pay_ratio'];
                    }
                    // $money = floatval($PayLog['pay_price'])*$bili;
                    $money = $PayLog['pay_price'] * $bili;$user_model::umoney($money, $userInfo['id'], '充值编号:' . $PayLog['pay_no'], '2', 'alipay', $title, 1);
                    if ($pay_log_res) {
                        $log_model->commit(); //事务提交
                        $user_model->commit(); //事务提交
                    }
                    echo 'success';
                    exit();
                    // 提交
                    //你可以在此编写订单逻辑
                } catch (Exception $e) {
                    $log_model->rollback(); //事务回滚
                    $user_model->rollback(); //事务回滚
                    //回滚
                }
                echo 'success';
            } else {
                echo 'fail';
            }
        }
    }

回调中容易出现问题,根据自己的业务逻辑写

 


 

posted @ 2023-10-18 16:17  文彬哦  阅读(142)  评论(0编辑  收藏  举报