<?php

use AopCertClient;
use think\Controller;
use think\Request;


class AliSub 
{
    //支付宝分账

    /**
     * 资料部分
     * 1.证书类型:公钥证书模式
     * 2.申请分账产品---支付宝商户平台(资金-分账)
     * 3.提升分账额度---申请分账产品完成之后提升分账额度
     * 4.应用公钥证书--app_cert_public_key
     * 5.支付宝根证书--alipay_root_cert
     * 6.支付宝公钥--ali_public_key
     * 7.文档 https://opendocs.alipay.com/open/repo-0038ln?ref=api
     * 8.sdk--v2--Alipay SDK(通用版也叫alipay-sdk-php-all)(extend/aop)
     * 9.appId--商户号
     * 10.应用私钥--private_key
     */


    /**
     * @return AopCertClient
     * 提取公共部分
     */
    public function getC(): AopCertClient
    {
        $c = new AopCertClient;
        $appCertPath = '应用公钥证书的路径';
        $alipayCertPath = '支付宝公钥证书路径';
        $rootCertPath = '支付宝根证书路径';
        $c->gatewayUrl = "https://openapi.alipay.com/gateway.do";//写死
        $c->appId = "2021****6**83902";//商户号
        $c->rsaPrivateKey = '应用私钥内容,不是路径,不带begin的内容';
        $c->format = "json";
        $c->charset = "utf-8";
        $c->signType = "RSA2";
        //调用getPublicKey从支付宝公钥证书中提取公钥
        $c->alipayrsaPublicKey = $c->getPublicKey($alipayCertPath);
        //是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内
        $c->isCheckAlipayPublicCert = false;
        //调用getCertSN获取证书序列号
        $c->appCertSN = $c->getCertSN($appCertPath);
        //调用getRootCertSN获取支付宝根证书序列号
        $c->alipayRootCertSN = $c->getRootCertSN($rootCertPath);
        return $c;
    }

    /**
     * 添加分账接收方
     */
    public function addAliMember($data)
    {
        $c = $this->getC();
        $request = new \AlipayTradeRoyaltyRelationBindRequest();
        $info = [
            'receiver_list' => $data,
            'out_request_no' => '请求单号保证唯一性',
        ];
        $request->setBizContent(json_encode($info));
        $response= $c->execute($request);
        $a = json_encode($response);
        return json_decode($a,true);
    }

    /**
     * @title 删除分账接收方
     * alipay.trade.royalty.relation.unbind
     */
    public function deleteMember($aliPaySubMemberArray)
    {
        $c = $this->getC();

        $data = [];
        foreach ($aliPaySubMemberArray as $k => $v) {
            $data[$k]['type'] = 'userId';
            $data[$k]['account'] = $v['account'];
        }
        $request = new \AlipayTradeRoyaltyRelationUnbindRequest();
        $info = [
            'receiver_list' => $data,
            'out_request_no' => '请求单号保证唯一性'
        ];
        $request->setBizContent(json_encode($info));
        try {
            $response = $c->execute($request);
        }catch ( \Throwable $e){halt($e);}
        $a = json_encode($response);
        return json_decode($a,true);
    }

    /**
     * @title 查询分账接收方
     * alipay.trade.royalty.relation.batchquery
     */
    public function subMember()
    {
        $c = $this->getC();
        $request = new \AlipayTradeRoyaltyRelationBatchqueryRequest ();
        $info = [
            'out_request_no' => '123456',
        ];
        $request->setBizContent(json_encode($info));
        try {
            $response = $c->execute($request);
        }catch ( \Throwable $e){halt($e);}
        $a = json_encode($response);
        return json_decode($a,true);
    }

    /**
     * @title 分账
     * alipay.trade.order.settle
     */
    public function sub($orderInfo)
    {
        $c = $this->getC();
        $request = new \AlipayTradeOrderSettleRequest ();
        $data = [];
        if ($orderInfo->status == 2) {
            //业务逻辑
            $data = [
                'trans_in_type' => 'loginName',
                'trans_in' => '手机号或者邮箱',
                'amount' => '返佣金额',//单位为元
                'desc' => '返佣'
            ];
        }

        $info = [
            'out_request_no' => '请求分账的订单号',//请求分账的单号,自己生成的,这个需要存下来
            'trade_no' => $orderInfo->ali_order_num,//对A订单进行分账,A订单的订单号(这个订单号是支付宝生成的订单号)
            'royalty_parameters' => $data,
            'royalty_mode' => 'sync'//不传默认同步执行
        ];
        $request->setBizContent(json_encode($info));
        try {
            $response = $c->execute($request);
        }catch ( \Throwable $e){halt($e);}
        $a = json_encode($response);
        return json_decode($a,true);
    }


    /**
     * @title 查询分账结果
     * alipay.trade.order.settle.query
     */
    public function subInfo()
    {
        $c = $this->getC();
        $request = new \AlipayTradeOrderSettleQueryRequest ();

        $info = [
            'settle_no' => '20220722002530020007170379270291'
        ];

        $request->setBizContent(json_encode($info));
        try {
            $result = $c->execute($request);
        }catch ( \Throwable $e){halt($e);}
        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode = $result->$responseNode->code;
        if(!empty($resultCode)&&$resultCode == 10000){
            echo "成功";
        } else {
            echo "失败";
        }
    }
}

aop 支付宝扩展

最后检测日期:2023/10/09