實現一個使用者使用支付寶成功後商家分賬的功能,支付寶文件:
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 協議》,轉載必須註明作者和本文連結