PHP 支付宝(单笔转账到银行账户接口)

alipay.fund.trans.tobank.transfer(单笔转账到银行账户接口)

小程序文档 - 支付宝文档中心

一、下载支付宝SDK,现有版本v1、v2、v3

https://github.com/alipay/alipay-sdk-php-all

github 慢的话,DNS 直达即可 140.82.112.3 github.com

【host文件路径c:\windows\system32\drivers\etc】

二、引用代码编写

php 复制代码
<?php
 //支付宝转账到银行卡配置
    function alipay_init_bank() {
        //调用支付宝身份证认证接口
        require_once WY_ROOT . '/includes/aop/AopCertClient.php'; //支付宝加载
        require_once WY_ROOT . '/includes/aop/AopClient.php'; //支付宝加载
        require_once WY_ROOT . '/includes/aop/AopCertification.php'; //支付宝加载
        require_once WY_ROOT . '/includes/libs/Config.php'; //配置加载
        require_once dirname(WY_ROOT) . '/ApiV1' . '/function_apiv1.php'; //引用 加载
        $aop = new AopCertClient ();
        $config = Config::getInstance();
        $appCertPath = ''; //应用证书路径(要确保证书文件可读),
        $alipayCertPath = ''; //支付宝公钥证书路径(要确保证书文件可读),
        $rootCertPath = ''; //支付宝根证书路径(要确保证书文件可读),
//        $alipay_config = ''; //支付宝配置文件
        $alipay_config = $config->alipay_bank_config;
        $appCertPath = WY_ROOT . '/includes/aop/cert3/appCertPublicKey_2021002131640271.crt'; //"例如:/home/admin/cert/appCertPublicKey.crt";
        $alipayCertPath = WY_ROOT . '/includes/aop/cert3/alipayCertPublicKey_RSA2.crt'; //"例如:/home/admin/cert/alipayCertPublicKey_RSA2.crt";
        $rootCertPath = WY_ROOT . '/includes/aop/cert3/alipayRootCert.crt'; //"例如:/home/admin/cert/alipayRootCert.crt";
        $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
//        $aop->method='alipay.fund.trans.tobank.transfer';
        $aop->appId = $alipay_config['appId'];
        $aop->rsaPrivateKey = $alipay_config['rsaPrivateKey'];
        $aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath);
        $aop->apiVersion = $alipay_config['apiVersion'];
        $aop->signType = $alipay_config['signType'];
        $aop->postCharset = $alipay_config['postCharset'];
        $aop->format = $alipay_config['format'];
        $aop->isCheckAlipayPublicCert = true; //是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内
        $aop->appCertSN = $aop->getCertSN($appCertPath); //调用getCertSN获取证书序列号
        $aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath); //调用getRootCertSN获取支付宝根证书序列号
        return $aop;
    }

 /**
     * 支付宝转账到银行卡
     * @param type $data    用户信息
     * @param type $orderId 订单号
     * @param type $money   订单金额
     * @param type $fee     手续费
     * @return type     $ret = array(
      'error' => false, //是否出错
      'error_msg' => '' //错误信息
      );
     */
    public function alipay_bank($data, $orderId, $money, $fee) {
        require_once dirname(WY_ROOT) . '/ApiV1' . '/function_apiv1.php'; //引用 加载
        $ret = array(
            'error' => false, //是否出错
            'error_msg' => '' //错误信息
        );
        $pub = new ALLClass();
        $realmoney = $money - $fee; //实际支付 
        $realmoney = sprintf("%.2f", $realmoney); //精确到小数点后两位
        require_once WY_ROOT . '/includes/aop/request/AlipayFundTransTobankTransferRequest.php';
        $request = new AlipayFundTransTobankTransferRequest ();
        $this->aop = $this->alipay_init_bank();
        $payee_card_no = $data['bank_account_id']; //银行卡号
        $payer_real_name = ''; //付款方名称
//        $payer_real_name='';//付款方名称
        $payee_account_name = $data['bank_account_name']; //收款名称,
        $payee_inst_name = $data['position']; //收款行

        $bizContentObj['out_biz_no'] = $orderId; //商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。201806300001
        $bizContentObj['amount'] = $realmoney; // $realmoney; //订单总金额,单位为元,精确到小数点后两位,STD_RED_PACKET产品取值范围[0.01,100000000];
        $bizContentObj['payer_real_name'] = $payer_real_name;
        $bizContentObj['payee_card_no'] = $payee_card_no;
        $bizContentObj['payee_account_name'] = $payee_account_name;
        $bizContentObj['payee_account_type'] = '2';
        $bizContentObj['payee_inst_name'] = $payee_inst_name;
        $bizContentObj['payee_inst_province'] = '';
        $bizContentObj['payee_inst_city'] = '';
        $bizContentObj['payee_inst_branch_name'] = '';
        $bizContentObj['payee_bank_code'] = '';
        $bizContentObj['time_liness'] = 'T0';
        $bizContentObj['memo'] = '';
        $bizContentObj['remark'] = '结算款'; //业务备注
        $pub->data_log($bizContentObj, __FUNCTION__ . '.log');
        $request->setNotifyUrl('https://alipay_notify_url.php');//回调地址
        $request->setBizContent(json_encode($bizContentObj, JSON_UNESCAPED_UNICODE));
        $result = $this->aop->execute($request);
        $pub->data_log('alipay_fund_transfer_new==' . json_encode($result, JSON_UNESCAPED_UNICODE), __FUNCTION__ . '.log');
        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode = $result->$responseNode->code;
        if (!empty($resultCode) && $resultCode == 10000) {
            $pub->data_log('Success', __FUNCTION__ . '.log');
        } else {
            $ret['error'] = true;
            $ret['error_msg'] = $result->$responseNode->sub_msg;
            $pub->data_log('error_msg==' . $ret['error_msg'], __FUNCTION__ . '.log');
        }
        return $ret;
    }

/**
回调验签
*/
function check_sign(){
$postData = parameters_certification();
require_once WY_ROOT . '/includes/aop/AopCertClient.php'; //支付宝加载
$aop = new AopCertClient ();
$alipayCertPath = ''; //支付宝公钥证书路径(要确保证书文件可读),
$alipayCertPath = WY_ROOT . '/includes/aop/cert3/alipayCertPublicKey_RSA2.crt'; //"例如:/home/admin/cert/alipayCertPublicKey_RSA2.crt";
$aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath);
$bool=$aop->rsaCheckV1($postData, $alipayCertPath,$postData['sign_type']);
if(!$bool){
    die('sign error.');
}

}

/**
 * 参数验证
 * @param array $field      参数索引数组【'a','b'】
 * @param array $data       需要验证数组,不传拿$_REQUEST
 * @return boolean | array  不存在参数,空参数返回false,否则返回验证数组
 */
function parameters_certification($field = [], $data = []) {
    if (empty($data)) {
        $data = $_REQUEST;
    }
    if (empty($field)) {
        return $data;
    }
    foreach ($field as $val) {
        if (isset($data[$val])) {
            if (is_array($data[$val])) {
                if (empty($data[$val])) {
                    return false;
                } else {
                    continue;
                }
            }
            if (strlen($data[$val]) > 0) {
                continue;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    return $data;
}

?>

回调的时候,默认签名使用的是 rsaCheckV1

暂时还没有碰到 rsaCheckV2 的,本来我以为我发送的是V2版本的签名,回调也是V2的

后面试了又试,rsaCheckV1 无疑了

支付宝的SDK无疑是很完善的,接入也方便很多

这里使用的是V2版本

相关推荐
ServBay9 小时前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户9623779544812 小时前
CTF 伪协议
php
BingoGo3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack6 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理6 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php