php支付宝单笔转账到支付宝账户
下载官方sdk:
https://opendocs.alipay.com/open/54/106370
接口文档地址:
https://opendocs.alipay.com/open/309
官方接口地址:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/
编写支付宝类
1、将sdk下载集成到项目中,thinkphp5为例:
2、在 Alipay.php 中编写方法
<?php
/**
* 支付宝类
* Created by PhpStorm.
* User: smt
*/
namespace Alipay;
require_once 'alipay-sdk-PHP-3.4.2/AopSdk.php';
class Alipay
{
// 商户配置信息
public static function getAlipayAppConfig()
{
return \config('alipay_app');
}
/**
* 单笔转账接口
* @param $order_number 订单号
* @param $pay_user_id 收款方user_id
* @param $amount 转账金额,单位为元,精确到小数点后两位
* @param $remark 备注
*/
public static function alipayTransfer($order_number, $pay_user_id, $amount, $remark = '提现')
{
// 我这里打印结果:项目根目录/public/cert/
$isdir = getCertRootPath();//证书位置;绝对路径
$alipay_conf = self::getAlipayAppConfig();
$aop = new \AopCertClient();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = $alipay_conf['app_id'];
$aop->rsaPrivateKey = $alipay_conf['rsa_private_key']; // 开发者私钥
$aop->alipayrsaPublicKey = $aop->getPublicKey($isdir . 'alipayCertPublicKey_RSA2.crt');//调用getPublicKey从支付宝公钥证书中提取公钥
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset = 'utf-8';
$aop->format = 'json';
$aop->isCheckAlipayPublicCert = true;//是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内
$aop->appCertSN = $aop->getCertSN($isdir . 'alipayappCertPublicKey_2021001153673295.crt');//调用getCertSN获取证书序列号
$aop->alipayRootCertSN = $aop->getRootCertSN($isdir . 'alipayRootCert.crt');//调用getRootCertSN获取支付宝根证书序列号
$request = new \AlipayFundTransToaccountTransferRequest ();
$request->setBizContent("{" .
"\"out_biz_no\":\"" . $order_number . "\"," .
"\"payee_type\":\"ALIPAY_USERID\"," .
"\"trade_no\":\"" . $order_number . "\"," .
"\"payee_account\":\"" . $pay_user_id . "\"," .
"\"payee_real_name\":\"\"," .
"\"amount\":\"" . $amount . "\"," .
"\"remark\":\"" . $remark . "\"" .
"}");
$result = $aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
// 成功,返回业务需要的信息
$data = [
'code' => $result->$responseNode->code,
'msg' => $result->$responseNode->msg,
// 支付宝转账订单号
'order_id' => $result->$responseNode->order_id,
// 商户订单号
'out_biz_no' => $result->$responseNode->out_biz_no,
// 支付时间
'pay_date' => $result->$responseNode->pay_date
];
return $data;
} else {
// 失败记录错误查日志
logs($result, 'alipay_transfer_error');
return false;
}
}
}
3、公共方法:
/**
* 获取证书根路径
*/
function getCertRootPath() {
return ROOT_PATH.'public/cert/';
}
/**
* 写日志
* @param $data : 数据
* @param $fileName : 写入哪个日志
*/
function logs($data = null, $fileName = null)
{
if (is_null($data) || is_null($fileName)) {
$out_arr['code'] = '400004';
return $out_arr;
}
$path = RUNTIME_PATH . 'log/' . $fileName;
if (!is_dir($path)) {
$mkdir_re = mkdir($path, 0777, TRUE);
if (!$mkdir_re) {
$this->logs($data, $fileName);
}
}
$filePath = $path . "/" . date("Y-m-d", time());
$time = date("Y-m-d H:i:s", time());
$re = file_put_contents($filePath, $time . " " . var_export($data, TRUE) . "\r\n\r\n", FILE_APPEND);
if (!$re) {
$this->logs($data, $fileName);
} else {
$out_arr['code'] = '000000';
return $out_arr;
}
}
4、证书位置:
5、调用方式:
// 支付宝提现
$result = Alipay::alipayTransfer('12345678901234567890', '7564347564', 0.1, '提现');
if ($result) {
// 提现成功,处理业务逻辑
} else {
// 失败,处理业务逻辑
}
end