支付宝支付配置
- 下载密钥生成器
- 选择RSA2(JAVA选择JAVA,其它选择非JAVA)
-
在应用里配置公钥
-
再在代码里配置
'alipayConfig' => [
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
// 'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//沙箱
'appId' => "2021001123456789",//应用appId
'rsaPrivateKey' => "MIIEpAIBAAKCAQEAlI...",//私钥
'format' => "json",
'charset' => "UTF-8",
'signType' => "RSA2",
'appRsaPublicKey' => "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQIIB...",//应用公钥
'alipayRsaPublicKey' => "MIIBIjANBgkqhkiG9w0BAQEFAAO...",//支付宝公钥(回调需要)
'notifyUrl' => "http://test.myweb.com/channelindex/Pay/aliNotify",//异步地址
//'returnUrl' => "http://test.myweb.com/yxfw/",//支付完成返回地址
]
- 调起支付代码
/**
*Describe:支付宝支付
*User:yeungz
*Date:2021/3/15 16:15
*/
public function alipayOrder()
{
Vendor('payment.yxalipay.aop.AopClient');
Vendor('payment.yxalipay.aop.request.AlipayTradeAppPayRequest');
//验证登录
$token = input('token');;
$session = Session::get('user');
if (!$token || $session == NULL) {
echo json_encode(array('status' => 0, 'msg' => '用户未登录'));
exit;
}
$userId = $session['id'];
$projectId = input('post.projectId');
$isDiscount = input('post.isDiscount');
$inviteCode = input('post.inviteCode');
$scenarioType = input('post.scenarioType');//支付场景类型:1app内,2外链
checkParam(['scenarioType' => $scenarioType], 0, 1);
if ($scenarioType == 1) {
$returnUrl = "http://test.myweb.com/yxfw/project?projectId=" . $projectId;
} else if ($scenarioType == 1) {
$returnUrl = "http://www.baidu.com/#/download";
} else {
echo json_encode(array('status' => 0, 'msg' => '场景类型错误'));
exit;
}
//创建本地order
$orderData = [
'projectId' => $projectId,
'userId' => $userId,
'type' => 1,//项目类型:1直接购买,2其它方式分账
'isDiscount' => $isDiscount,
'inviteCode' => $inviteCode,
'detail' => '优选服务',
'payment' => 'alipay',
'total_fee' => 0,
];
$out_trade_no = $this->createOrder($orderData);//创建本地订单并返回订单号
$money = Db::name('channel_order')->where(['order_no' => $out_trade_no])->value('money');
$aop = new \AopClient ();
$config = Config::get('alipayConfig');
$aop->gatewayUrl = $config['gatewayUrl'];
$aop->appId = $config['appId'];
$aop->rsaPrivateKey = $config['rsaPrivateKey'];
$aop->format = $config['format'];
$aop->charset = $config['charset'];
$aop->signType = $config['signType'];
$aop->alipayrsaPublicKey = $config['appRsaPublicKey'];//应用公钥
//实例化具体API对应的request类,类名称和接口名称对应,alipay/aop/request/AlipayTradeAppPayRequest.php/getApiMethodName方法内下配置Api类型:alipay.trade.app.pay(app支付) / alipay.trade.wap.pay(手机网站支付)
$request = new \AlipayTradeAppPayRequest();
// 异步通知地址
$notify_url = $config['notifyUrl'];
// 返回地址
$return_url = $returnUrl;
// 订单标题
$subject = '优选服务';
// 订单详情
$body = '优选服务';
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$bizcontent = "{\"body\":\"" . $body . "\","
. "\"subject\": \"" . $subject . "\","
. "\"out_trade_no\": \"" . $out_trade_no . "\","
. "\"timeout_express\": \"30m\","
. "\"total_amount\": \"" . $money . "\","
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
$request->setNotifyUrl($notify_url);
$request->setReturnUrl($return_url);
$request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
// $response = $aop->sdkExecute($request);
$response = $aop->pageExecute($request);
// 注意:这里不需要使用htmlspecialchars进行转义,直接返回即可
echo json_encode(array('aliData' => $response, 'orderNo' => $out_trade_no));
}
- 回调代码
/**
*Describe:支付宝回调
*User:yeungz
*Date:2021/3/18 15:42
*/
public function aliNotify()
{
$orderTab = Db::name('channel_order');
$projectTab = Db::name('channel_project');
$facilitatorTab = Db::name('channel_facilitator');
$businessTab = Db::name('channel_business');
$platformTab = Db::name('channel_platform');
$commission = Db::name('channel_commission_order');
$response = $_POST;
file_put_contents('./uploads/aliPayNofity.log', date('YmdHis') . json_encode($response) . '', FILE_APPEND);
Vendor('payment.yxalipay.aop.AopClient');
$aop = new \AopClient ();
$config = Config::get('alipayConfig');
$aop->alipayrsaPublicKey = $config['alipayRsaPublicKey'];//支付宝公钥
$orderNo = $response['out_trade_no'];
//付款成功回调
if ($response['trade_status'] == 'TRADE_SUCCESS') {
//验签
if (!$aop->rsaCheckV1($response, null, "RSA2")) {
file_put_contents('./uploads/aliPayNofity.log', date('YmdHis') . ' sign error', FILE_APPEND);
exit;
}
//查询订单
$orderInfo = $orderTab->where(['order_no' => $orderNo])->find();
file_put_contents('./uploads/aliPayNofity.log', json_encode($orderInfo) . ' sign right', FILE_APPEND);
if (!$orderInfo)
exit;
if ($orderInfo['status'] == 1) {
echo 'success';
exit;
}
//处理订单
$projectInfo = $projectTab->where(['id' => $orderInfo['project_id']])->find();
$money = $orderInfo['money'] * 0.5;
if ($projectInfo['commission_type'] == 1) {//佣金类型:1固定占比,2固定金额
$businessCommission = $money * ($projectInfo['business_commission'] / 100);//商务占比分佣金额
$facilitatorCommission = $money * ($projectInfo['facilitator_commission'] / 100);//邀请者服务商占比分佣金额
$platformCommision = $money - $businessCommission - $facilitatorCommission;//平台占比分佣金额
} elseif ($projectInfo['commission_type'] == 2) {
$businessCommission = $projectInfo['business_commission'];//商务固定分佣金额
$facilitatorCommission = $projectInfo['facilitator_commission'];//邀请者服务商固定分佣金额
$platformCommision = $money - $businessCommission - $facilitatorCommission;//平台固定分佣金额
}
if ($orderInfo['inviter_user_id'] > 0) {//有邀请人
$inviterUid = $orderInfo['inviter_user_id'];//商务:邀请人
$facilitatorId = $businessTab->where(['user_id' => $inviterUid])->value('facilitator_id');//服务商:邀请人的服务商
$facilitatorUid = $facilitatorTab->where(['id' => $facilitatorId])->value('user_id');
$facilitatorUid = $facilitatorUid ? $facilitatorUid : 0;
} else {//无邀请人
$myBusiness = $businessTab->where(['user_id' => $orderInfo['user_id']])->find();
if ($myBusiness) {
$inviterUid = $businessTab->where(['user_id' => $orderInfo['user_id']])->value('inviter_user_id');//商务:邀请人
$facilitatorId = $businessTab->where(['user_id' => $orderInfo['user_id']])->value('facilitator_id');//服务商:自己的服务商
$facilitatorUid = $facilitatorTab->where(['id' => $facilitatorId])->value('user_id');
} else {
$inviterUid = 0;
$facilitatorUid = $facilitatorTab->where(['type' => 1])->value('user_id');
}
$facilitatorUid = $facilitatorUid ? $facilitatorUid : 0;
}
$platformUid = $platformTab->value('user_id');
$userData = [
'business' => [
'type' => 1,
'userId' => $inviterUid,
'commission' => $businessCommission,
],
'facilitator' => [
'type' => 2,
'userId' => $facilitatorUid,
'commission' => $facilitatorCommission,
],
'platform' => [
'type' => 3,
'userId' => $platformUid,
'commission' => $platformCommision,
],
];
$checkOrder = $commission->where(['order_id' => $orderInfo['id']])->count();
if ($checkOrder <= 0) {
$orderModel = new orderModel();
$res = $orderModel->createComissionOrder($userData, $orderInfo);
if ($res) {
echo 'success';
echo json_encode(['status' => 1, 'msg' => '分账成功']);
exit;
} else {
echo json_encode(['status' => 0, 'msg' => '分账异常']);
exit;
}
} else {
echo json_encode(['status' => 0, 'msg' => '请勿重复操作']);
exit;
}
}
}