x

1 官方下载sdk 包


2 修改sdk 包内容

alipay/aop/AopCertClient.php
133 行为:
return $dec;

修改函数,同时修改调用方法:AopClient.php

decrypt 改为 alipayDecrypt;同时修改调用方法
encrypt 改为 alipayEncrypt


3 sdk放入vendor 目录,composer引入并安装

"autoload": {
    "classmap": [
        "vendor/alipay/aop/",
        "vendor/alipay/aop/request"
    ],
 }


4 根据官网提示去完成证书配置,并且本地存储起来


5 支付参数配置:

public static function userOption(){
    $appId = config('alipay.user_app_id');// 支付宝应用id
    $rsaPrivateKeyPath = base_path() . config('alipay.rsaPrivateKeyPath');// 使用支付宝开放平台开发助手生成的应用私钥
    $appCertPath = base_path() . config('alipay.usr_appCertPath');// 上传证书后生成的crt文件 证书
    $rootCertPath = base_path() . config('alipay.usr_rootCertPath');// 上传证书后生成的crt文件 支付宝根证书
    $alipayrsaPublicKeyPath = base_path() . config('alipay.usr_alipayrsaPublicKeyPath');// 上传证书后生成的txt文件 支付宝公钥证书(不能使用支付宝开放平台开发助手生成的应用公钥,这样子会导致支付回调验签失败)

    $alipayrsaPublicKey = openssl_pkey_get_public($alipayrsaPublicKeyPath);// 代码示例中是这样获取的($aop->getPublicKey($alipayCertPath);//调用getPublicKey从支付宝公钥证书中提取公钥)
    $rsaPrivateKey = file_get_contents($rsaPrivateKeyPath);

    //1、execute 使用
    $aop = new \AopCertClient();
    $aop->gatewayUrl = config('alipay.gatewayUrl');//网关
    $aop->apiVersion = '1.0';
    $aop->signType = config('alipay.sign_type');
    $aop->postCharset = config('alipay.charset');
    $aop->format = config('alipay.format');
    $aop->isCheckAlipayPublicCert = true;//是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内

    $aop->appId = $appId;
    $aop->rsaPrivateKey = $rsaPrivateKey;
    $aop->alipayrsaPublicKey = $alipayrsaPublicKey;
    $aop->appCertSN = $aop->getCertSN($appCertPath);//调用getCertSN获取证书序列号
    $aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath);//调用getRootCertSN获取支付宝根证书序列号
    return $aop;
}


6 下单:(app 支付为例,其他支付方式调整参数即可)

public static function pay($subject, $total_amount, $sn) {
    $aop = self::userOption();
    $requestPay = new \AlipayTradeAppPayRequest();
    $bizcontent = json_encode([
        'body'=>'body',
        'subject'=>'name-'.$subject,
        'out_trade_no'=> $sn,//此订单号为商户唯一订单号
        'total_amount'=>strval($total_amount),//保留两位小数
        'product_code'=>'QUICK_MSECURITY_PAY'
    ]);
    $requestPay->setNotifyUrl('https://'.config('constants.FORMAL_URL').config('alipay.notify_url'));
    $requestPay->setBizContent($bizcontent);
    //这里和普通的接口调用不同,使用的是sdkExecute
    $response = $aop->sdkExecute($requestPay);
    return ['code' => 1, 'data' => $response];
}


7 退款示例(支付宝只允许退款一次)

public static function refund($transaction_id,$re_amount,$out_trade_no){
   
    $body['out_request_no'] = $out_trade_no;//系统订单号
    $body['refund_amount'] = $re_amount;
    $body['trade_no'] = $transaction_id;//交易流水号,商家返回

    $requestReturn = new \AlipayTradeRefundRequest();
    $requestReturn->setBizContent(json_encode($body));
    $responseResult = $aop->execute($requestReturn);
    $responseApiName = str_replace(".","_",$requestReturn->getApiMethodName())."_response";
    $response = $responseResult->$responseApiName;

    if(!empty($response->code)&&$response->code==10000){
        if($response->fund_change == 'N'){
            return ['0','已经退款了,无法二次退款!'];
        }else{
            return ['1','退款成功'];
        }
    }
    else{
        return ['0','退款申请失败,请稍后重试'];
    }
}



◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。