PHP-SDK实现支付宝 付款码支付、刷脸支付

一、实战

上篇文章介绍了微信的付款码支付,今天介绍支付宝的付款码支付和刷脸支付实现。感兴趣的童鞋也可以阅读微信付款码支付。

微信付款码支付链接:https://blog.csdn.net/u013715754/article/details/103334261

第一步

请自行完成支付宝商户号的注册流程

【支付宝多端发布:https://opendocs.alipay.com/mini/multi-platform】

【下图是前端开发具体的位置】

PHP-SDK实现支付宝 付款码支付、刷脸支付_第1张图片

第二步

支付宝PHP-SDK

【PHP-SDK下载链接 https://docs.open.alipay.com/54/103419/】

第三步

采用证书模式开发【统一支付接口文档https://docs.open.alipay.com/api_1/alipay.trade.pay】

SDK目录说明文件

PHP-SDK实现支付宝 付款码支付、刷脸支付_第2张图片

 

alipay.php 文件内部源码说明

#引入证书支付类
require_once './aop/AopCertClient.php';
require_once './aop/request/AlipayTradePayRequest.php';
require_once './aop/request/AlipayTradePagePayRequest.php';

header('content-type:application/json;charset=utf-8');
/**
 * 证书类型AopCertClient功能方法使用测试,特别注意支付宝更证书预计2037年会过期,请在适当时间下载更新支付更证书
 * 1、execute 证书模式调用示例
 * 2、sdkExecute 证书模式调用示例
 * 3、pageExecute 证书模式调用示例
 */
#接收参数 bar_code

$server = $_SERVER;
$addr = $server['REMOTE_ADDR'];
$port = $server['REMOTE_PORT'];

$params = $_REQUEST;
$bar_code = $params['bar_code'];
$total_amount = $params['total_amount'];
$pay_type = $params['pay_type'];#刷脸支付face 扫码支付code

#验证支付宝 | 微信支付
#支付授权码,25~30开头的长度为16~24位的数字,实际字符串长度以开发者获取的付款码长度为准
#微信授权码,扫码支付授权码,设备读取用户微信中的条码或者二维码信息(注:用户付款码条形码规则:18位纯数字,以10、11、12、13、14、15开头)

$bar_code_header = $bar_code[0].$bar_code[1];
if($bar_code_header >= 10 && $bar_code_header <= 15){
    echo json_encode(['code'=>'10003','msg'=>'目前暂未开放别的支付方式']);
    exit;
}elseif($bar_code_header >= 25 && $bar_code_header <= 30){
    $zfb = true;
}else{
    echo json_encode(['code'=>'10003','msg'=>'目前暂未开放别的支付方式']);
    exit;
}

//execute 使用
$aop = new AopCertClient ();
$appCertPath = "./aop/crt/appCertPublicKey_2019110468928224.crt";
$alipayCertPath = "./aop/crt/alipayCertPublicKey_RSA2.crt";
$rootCertPath = "./aop/crt/alipayRootCert.crt";
$private = file_get_contents('./aop/crt/www.qingzhoudata.com_private');


#支付调用URL不需要修改
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = 'xxxxxxxxxxx';#APPID
$aop->rsaPrivateKey = $private;
$aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath);//调用getPublicKey从支付宝公钥证书中提取公钥
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='utf-8';
$aop->format='json';
$aop->isCheckAlipayPublicCert = true;//是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内
$aop->appCertSN = $aop->getCertSN($appCertPath);//调用getCertSN获取证书序列号
$aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath);//调用getRootCertSN获取支付宝根证书序列号

#商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
$out_trade_no = date("YmdHis").md5(microtime(true).$addr.$port);
$sys_service_provider_id = '2088721901222682';

#处理支付方式
switch ($pay_type){
    case 'face':
        $biz = json_encode([
            "out_trade_no"=>$out_trade_no,
            "scene"=>"bar_code",
            "subject"=>"亲情支付-支付订单",
            "auth_code"=>$bar_code,
            "total_amount"=>$total_amount,
            "extend_params"=>[
                "sys_service_provider_id"=>$sys_service_provider_id
            ]
        ],JSON_UNESCAPED_UNICODE);
        $request = new AlipayTradePayRequest();
        $request->setBizContent($biz);
        $result = $aop->execute($request);
        break;
    case 'code':
        $request = new AlipayTradePagePayRequest();
        $biz = json_encode([
            "out_trade_no"=>$out_trade_no,
            "product_code"=>'FAST_INSTANT_TRADE_PAY',
            "scene"=>"bar_code",
            "subject"=>"亲情支付-支付订单",
            "body"=>'亲情支付-支付订单',
            "auth_code"=>$bar_code,
            "total_amount"=>$total_amount,
            "extend_params"=>[
                "sys_service_provider_id"=>$sys_service_provider_id
            ]
        ],JSON_UNESCAPED_UNICODE);
        $request->setBizContent($biz);
        $result = $aop->pageExecute($request);
        #下单完成,处理支付流程
        $biz = json_encode([
            "out_trade_no"=>$out_trade_no,
            "scene"=>"bar_code",
            "subject"=>"亲情支付-支付订单",
            "auth_code"=>$bar_code,
            "total_amount"=>$total_amount,
            "extend_params"=>[
                "sys_service_provider_id"=>$sys_service_provider_id
            ]
        ],JSON_UNESCAPED_UNICODE);
        $request = new AlipayTradePayRequest();
        $request->setBizContent($biz);
        $result = $aop->execute($request);
        break;
}
#处理返回值
$data = [
    "code"=>$result->alipay_trade_pay_response->code,
    "msg"=>$result->alipay_trade_pay_response->msg,
    "buyer_logon_id"=>$result->alipay_trade_pay_response->buyer_logon_id,
    "buyer_pay_amount"=>$result->alipay_trade_pay_response->buyer_pay_amount,
    "buyer_user_id"=>$result->alipay_trade_pay_response->buyer_user_id,
    "invoice_amount"=>$result->alipay_trade_pay_response->invoice_amount,
    "out_trade_no"=>$result->alipay_trade_pay_response->out_trade_no,
    "point_amount"=>$result->alipay_trade_pay_response->point_amount,
    "receipt_amount"=>$result->alipay_trade_pay_response->receipt_amount,
    "total_amount"=>$result->alipay_trade_pay_response->total_amount,
    "trade_no"=>$result->alipay_trade_pay_response->trade_no
];
echo json_encode($data);

 

 

特别说明:

微信和支付的付款码区别在于前两位数字

微信 以 10、11、12、13、14、15开头的数字,长度18位

支付宝 以 25、26、27、28、29、30开头的数字,长度16-24位

 

 

你可能感兴趣的:(支付宝支付)