Laravel实现支付宝分账
实现一个用户使用支付宝成功后商家分账的功能,支付宝文档:
opendocs.alipay.com/apis/api_31/al...
opendocs.alipay.com/apis/api_1/ali...
一.添加分账接收方
先引入支付宝SDK,composer dump-autoload 即可
// 添加支付宝分账接收方
public function ali_sub_adduser(Request $request){
$name = $request->get('name');
$loginName = $request->get('loginName');
$config = $this->ali_config();
$aop = new \AopClient();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = $config['app_id'];
$aop->rsaPrivateKey = $config['private_key'];
$aop->alipayrsaPublicKey = $config['ali_public_key'];
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset = 'UTF-8';
$aop->format = 'json';
// 支付宝分账关系绑定
$req = new \AlipayTradeRoyaltyRelationBindRequest();
$json_data = json_encode([
'receiver_list' => [
'type' => 'loginName', // 分账方类型。userId:表示是支付宝账号对应的支付宝唯一用户号;loginName:表示是支付宝登录号。
'account' => $loginName, // 分账方帐号。当分账方类型是userId时,本参数为用户的支付宝账号对应的支付宝唯一用户号,以2088开头的纯16位数字;当分账方类型是loginName时,本参数为用户的支付宝登录号。
'name' => $name, // 分账方全称
'memo' => $name, // 分账关系描述
],
'out_request_no' => rand(1000, 9999).time(),
]);
$req->setBizContent($json_data);
$result = $aop->execute($req);
$responseNode = str_replace(".", "_", $req->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
echo "成功";
}
}
二.队列处理完成分账
在支付成功回调中使用队列异步处理分账
// 支付宝统一收单交易结算接口
public function ali_split_order($trade_no, $order, $type)
{
$ali_config = $this->ali_config();
$aop = new \AopClient();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = $ali_config['app_id'];
$aop->rsaPrivateKey = $ali_config['private_key'];
$aop->alipayrsaPublicKey = $ali_config['ali_public_key'];
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset = 'UTF-8';
$aop->format = 'json';
$rand_str = date('YmdHis', time()) . rand(100000, 999999);
$request = new \AlipayTradeOrderSettleRequest();
// 查询需要分账的用户
$data = DB::table('ali_sub')->get()->toArray();
$data1 = [];
$sub_user = [];
foreach ($data as $key => $value) {
$data1[$key]['royalty_type'] = 'transfer'; // 分账类型. 普通分账为:transfer;补差为:replenish;
$data1[$key]['trans_in_type'] = 'loginName'; // 收入方账户类型
$data1[$key]['trans_in'] = $value->loginName; // 收入方账户。
$data1[$key]['amount'] = $order->money*($value->proportion/100); // 分账的金额,单位为元
$data1[$key]['desc'] = $value->name; // 分账描述
}
$json_data = json_encode([
'trade_no' => $trade_no, // 支付宝订单号
'out_request_no' => "$rand_str",
'royalty_parameters' => $data1
]);
$request->setBizContent($json_data);
$result = $aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
// 一次分账请求中,有任意一个收入方分账失败,则这次分账请求的全部分账处理均会失败;
if (!empty($resultCode) && $resultCode == 10000) {
echo "成功";
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: