Laravel實現支付寶分賬

liang986發表於2021-01-24

實現一個使用者使用支付寶成功後商家分賬的功能,支付寶文件:
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 協議》,轉載必須註明作者和本文連結

相關文章