Laravel实现支付宝分账

实现一个用户使用支付宝成功后商家分账的功能,支付宝文档:
opendocs.alipay.com/apis/api_31/al...
opendocs.alipay.com/apis/api_1/ali...

一.添加分账接收方

先引入支付宝SDK,composer dump-autoload 即可

     //   添加支付宝分账接收方
    public function ali_sub_adduser(Request $request){
        $name = $request->get('name');
        $loginName = $request->get('loginName');

        $config = $this->ali_config();
        $aop = new \AopClient();
        $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
        $aop->appId = $config['app_id'];
        $aop->rsaPrivateKey = $config['private_key'];
        $aop->alipayrsaPublicKey = $config['ali_public_key'];
        $aop->apiVersion = '1.0';
        $aop->signType = 'RSA2';
        $aop->postCharset = 'UTF-8';
        $aop->format = 'json';

        // 支付宝分账关系绑定
        $req = new \AlipayTradeRoyaltyRelationBindRequest();

        $json_data = json_encode([
            'receiver_list' => [
                'type' => 'loginName', //     分账方类型。userId:表示是支付宝账号对应的支付宝唯一用户号;loginName:表示是支付宝登录号。
                'account' => $loginName, //     分账方帐号。当分账方类型是userId时,本参数为用户的支付宝账号对应的支付宝唯一用户号,以2088开头的纯16位数字;当分账方类型是loginName时,本参数为用户的支付宝登录号。
                'name' => $name, // 分账方全称
                'memo' => $name, //     分账关系描述
            ],
            'out_request_no' =>  rand(1000, 9999).time(),
        ]);

        $req->setBizContent($json_data);
        $result = $aop->execute($req);
        $responseNode = str_replace(".", "_", $req->getApiMethodName()) . "_response";
        $resultCode = $result->$responseNode->code;

        if (!empty($resultCode) && $resultCode == 10000) {
            echo  "成功";
        }
    }

二.队列处理完成分账

在支付成功回调中使用队列异步处理分账

  // 支付宝统一收单交易结算接口
    public function ali_split_order($trade_no, $order, $type)
    {
        $ali_config = $this->ali_config();
        $aop = new \AopClient();
        $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
        $aop->appId = $ali_config['app_id'];
        $aop->rsaPrivateKey = $ali_config['private_key'];
        $aop->alipayrsaPublicKey = $ali_config['ali_public_key'];
        $aop->apiVersion = '1.0';
        $aop->signType = 'RSA2';
        $aop->postCharset = 'UTF-8';
        $aop->format = 'json';

        $rand_str = date('YmdHis', time()) . rand(100000, 999999);
        $request = new \AlipayTradeOrderSettleRequest();

        // 查询需要分账的用户
        $data = DB::table('ali_sub')->get()->toArray();
        $data1 = [];
        $sub_user = [];
        foreach ($data as $key => $value) {
            $data1[$key]['royalty_type'] = 'transfer'; // 分账类型.  普通分账为:transfer;补差为:replenish;
            $data1[$key]['trans_in_type'] = 'loginName'; //     收入方账户类型
            $data1[$key]['trans_in'] = $value->loginName; // 收入方账户。
            $data1[$key]['amount'] = $order->money*($value->proportion/100); // 分账的金额,单位为元
            $data1[$key]['desc'] = $value->name; // 分账描述
        }
        $json_data = json_encode([
            'trade_no' => $trade_no, // 支付宝订单号
            'out_request_no' => "$rand_str",
            'royalty_parameters' => $data1
        ]);

        $request->setBizContent($json_data);
        $result = $aop->execute($request);
        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode = $result->$responseNode->code;

        // 一次分账请求中,有任意一个收入方分账失败,则这次分账请求的全部分账处理均会失败;
        if (!empty($resultCode) && $resultCode == 10000) {
           echo  "成功";
        }

    }
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!