admin/addon/alipay/model/Pay.php

395 lines
16 KiB
PHP

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都云之牛科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* =========================================================
*/
namespace addon\alipay\model;
use addon\alipay\data\sdk\AopClient;
use addon\alipay\data\sdk\request\AlipayFundTransToaccountTransferRequest;
use addon\alipay\data\sdk\request\AlipayTradeAppPayRequest;
use addon\alipay\data\sdk\request\AlipayTradeCloseRequest;
use addon\alipay\data\sdk\request\AlipayTradePagePayRequest;
use addon\alipay\data\sdk\request\AlipayTradeRefundRequest;
use addon\alipay\data\sdk\request\AlipayTradeWapPayRequest;
use addon\alipay\data\sdk\request\AlipayTradeCreateRequest;
use app\exception\ApiException;
use app\model\BaseModel;
use app\model\system\Pay as PayCommon;
use addon\alipay\data\sdk\request\AlipayFundTransUniTransferRequest;
use addon\alipay\data\sdk\AopCertClient;
use app\model\system\Pay as PayModel;
/**
* 支付宝支付配置
*/
class Pay extends BaseModel
{
public $aop;
public $config;
function __construct($site_id)
{
try {
// 获取支付宝支付参数(统一支付到平台账户)
$config_model = new Config();
$config_result = $config_model->getPayConfig($site_id);
$config = $config_result["data"];
if (!empty($config)) {
$config_info = $config["value"];
}
if($config_info['is_isp']==1){
$platform=config('alipay.zmAlipay');
$config_info['app_id']=$platform['appid'];
$config_info['public_key']=$platform['public_key'];
$config_info['private_key']=$platform['private_key'];
$config_info['alipay_public_key']=$platform['alipay_public_key'];
$config_info['encryptKey']=$platform['encryptKey'];
// $authConfig = new \addon\aliapp\model\Config();
// $uniInfo=$authConfig->getAppConfig($site_id)['data']['value'];
// $config_info['app_auth_token']=$uniInfo['app_auth_token'];//$authConfig->getAppConfig($site_id)['data']['value'];
}
$this->config=$config_info;
$countersign_type = $config_info['countersign_type'] ?? 0; //加密模式
if ($countersign_type == 1) {
$appCertPath = $config_info["public_key_crt"] ?? "";
$alipayCertPath = $config_info["alipay_public_key_crt"] ?? "";
$rootCertPath = $config_info["alipay_with_crt"] ?? "";
$this->aop = new AopCertClient();
//调用getPublicKey从支付宝公钥证书中提取公钥
$this->aop->alipayrsaPublicKey = $this->aop->getPublicKey($alipayCertPath);
//是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内
$this->aop->isCheckAlipayPublicCert = false;
//调用getCertSN获取证书序列号
$this->aop->appCertSN = $this->aop->getCertSN($appCertPath);
//调用getRootCertSN获取支付宝根证书序列号
$this->aop->alipayRootCertSN = $this->aop->getRootCertSN($rootCertPath);
} else {
// 获取支付宝支付参数(统一支付到平台账户)
$this->aop = new AopClient();
$this->aop->alipayrsaPublicKey = $config_info['public_key'] ?? "";
$this->aop->alipayPublicKey = $config_info['alipay_public_key'] ?? "";
}
if($config_info['is_isp']==1){
// $this->aop->appAuthToken= $config_info['app_auth_token']; //'202301BB4cac4962a7194c0483136df3df1a2X84';
$this->aop->encryptKey=$config_info['encryptKey'];
}
$this->aop->appId = $config_info["app_id"] ?? "";
$this->aop->rsaPrivateKey = $config_info['private_key'] ?? "";
$this->aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$this->aop->apiVersion = '1.0';
$this->aop->signType = 'RSA2';
$this->aop->postCharset = 'UTF-8';
$this->aop->format = 'json';
} catch (\Exception $e) {
throw new ApiException(-1, '支付宝配置错误');
}
}
/**
* 生成支付
* @param $param
*/
public function pay($param)
{
//构造要请求的参数数组,无需改动
$parameter = array(
"out_trade_no" => $param["out_trade_no"],
"subject" => str_sub($param["pay_body"], 15),
"total_amount" => (float)$param["pay_money"],
"body" => str_sub($param["pay_body"], 60),
"product_code" => 'FAST_INSTANT_TRADE_PAY',
);
if($param["hb_fq_num"] > 0){
$parameter['extend_params'] = [
'hb_fq_num' => $param["hb_fq_num"],
'hb_fq_seller_percent' => 100
];
}else{
$parameter['disable_pay_channels'] = 'pcreditpayInstallment';
}
switch ($param["app_type"]) {
case "h5":
$request = new AlipayTradeWapPayRequest();
break;
case "pc":
$request = new AlipayTradePagePayRequest();
break;
case "app":
$request = new AlipayTradeAppPayRequest();
break;
case 'wechat':
$request = new AlipayTradeWapPayRequest();
break;
case "applet":
$request = new AlipayTradeWapPayRequest();
break;
case "applet_hb_fq":
$request = new AlipayTradeWapPayRequest();
break;
case "alipay_stages":
$request = new AlipayTradeWapPayRequest();
break;
case "aliapp":
$parameter['product_code']='FACE_TO_FACE_PAYMENT';
$parameter['buyer_id']=model('member')->getValue(['member_id'=>$param['member_id']],'ali_openid');
$parameter['sub_merchant']['merchant_id']=$this->config['merchant_smid']; //'2088420482043304'; //子商户支付
//$parameter['sub_merchant']['merchant_id']='2088420482043304'; //子商户支付
$parameter['settle_info']['settle_detail_infos']=[
[
'trans_in_type'=>'defaultSettle',
'amount'=>$parameter['total_amount'], //结算金额
]
]; //子商户支付
$request = new AlipayTradeCreateRequest();
break;
default:
$request = new AlipayTradeWapPayRequest();
break;
}
$parameter = json_encode($parameter);
$request->setBizContent($parameter);
$request->SetReturnUrl($param["return_url"]);
$request->SetNotifyUrl($param["notify_url"]);
if (in_array($param["app_type"], ['h5'])) {
$result = $this->aop->pageExecute($request, 'get');
return $this->success([
'type' => 'url',
'data' => $result
]);
}else{
$result = $this->aop->execute($request, null, $this->aop->appAuthToken);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
return $this->success($result->$responseNode);
} else {
return $this->error("", $result->$responseNode->sub_msg);
}
}
}
/**
* 支付关闭
* @param unknown $orderNumber
* @return multitype:number string |multitype:number mixed
*/
public function close($param)
{
$parameter = array(
"out_trade_no" => $param["out_trade_no"]
);
// 建立请求
$request = new AlipayTradeCloseRequest();
$request->setBizContent(json_encode($parameter));
$result = $this->aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
return $this->success();
} else {
return $this->error("", $resultCode->sub_msg);
}
}
/**
* 支付宝支付原路返回
* @param unknown $param 支付参数
*/
public function refund($param)
{
$pay_info = $param["pay_info"];
$refund_no = $param["refund_no"];
$out_trade_no = $pay_info["trade_no"] ?? '';
$refund_fee = $param["refund_fee"];
$parameter = array(
'trade_no' => $out_trade_no,
'refund_amount' => sprintf("%.2f", $refund_fee),
'out_request_no' => $refund_no
);
// 建立请求
$request = new AlipayTradeRefundRequest ();
$request->setBizContent(json_encode($parameter));
$result = $this->aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
return $this->success();
} else {
return $this->error("", $resultCode->sub_msg);
}
}
/**
* 支付宝转账
* @param $param
* @return array
* @throws \think\Exception
*/
public function payTransfer($param)
{
try {
$config_model = new Config();
$config_result = $config_model->getPayConfig($param['site_id']);
if ($config_result['code'] < 0) return $config_result;
$config = $config_result['data']['value'];
if (empty($config)) return $this->error([], '未配置支付宝支付');
if (!$config['transfer_status']) return $this->error([], '未启用支付宝转账');
$parameter = [
'out_biz_no' => $param['out_trade_no'],
'payee_type' => 'ALIPAY_LOGONID',
'payee_account' => $param["account_number"],
'amount' => sprintf("%.2f", $param['amount']),
'payee_real_name' => $param["real_name"],
'remark' => $param["desc"]
];
// 建立请求
$request = new AlipayFundTransToaccountTransferRequest();
$request->setBizContent(json_encode($parameter));
$result = $this->aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
return $this->success([
'out_trade_no' => $result->$responseNode->out_biz_no, // 商户交易号
'payment_no' => $result->$responseNode->order_id, // 微信付款单号
'payment_time' => date_to_time($result->$responseNode->pay_date) // 付款成功时间
]);
} else {
return $this->error([], $result->$responseNode->sub_msg);
}
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 异步完成支付
* @param $param
*/
public function payNotify()
{
// Log::write('pay_notifiy_log:alipay:'.json_encode(input()), 'notice');
try {
$res = $this->aop->rsaCheckV1($_POST, $this->aop->alipayrsaPublicKey, $this->aop->signType);
if ($res) { // 验证成功
$out_trade_no = $_POST['out_trade_no'];
// 支付宝交易号
$trade_no = $_POST['trade_no'];
// 交易状态
$trade_status = $_POST['trade_status'];
$pay_common = new PayCommon();
if ($trade_status == "TRADE_SUCCESS") {
$retval = $pay_common->onlinePay($out_trade_no, "alipay", $trade_no, "alipay");
}
echo "success";
} else {
// 验证失败
echo "fail";
}
} catch (\Exception $e) {
echo "fail";
}
}
public function payNewTransfer($param)
{
try {
$config_model = new Config();
$config_result = $config_model->getPayConfig($param['site_id']);
if ($config_result['code'] < 0) return $config_result;
$config = $config_result['data']['value'];
if (empty($config)) return $this->error([], '未配置支付宝支付');
if (!$config['transfer_status']) return $this->error([], '未启用支付宝转账');
$parameter = [
'out_biz_no' => $param['out_trade_no'],
'trans_amount' => sprintf("%.2f", $param['amount']),
'product_code' => 'TRANS_ACCOUNT_NO_PWD',
'biz_scene' => 'DIRECT_TRANSFER',
'order_title' => '支付宝转账',
'remark' => $param["desc"],
'payee_info' => [
'identity' => $param["account_number"],
'identity_type' => "ALIPAY_LOGON_ID",
'name' => $param["real_name"]
]
];
// 建立请求
$request = new AlipayFundTransUniTransferRequest();
$request->setBizContent(json_encode($parameter));
$result = $this->aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
return $this->success([
'out_trade_no' => $result->$responseNode->out_biz_no, // 商户交易号
'payment_no' => $result->$responseNode->order_id, // 微信付款单号
'payment_time' => date_to_time($result->$responseNode->trans_date) // 付款成功时间
]);
} else {
return $this->error([], $result->$responseNode->sub_msg);
}
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 付款码支付
* @param $param
*/
public function micropay($param)
{
try {
//构造要请求的参数数组,无需改动
$parameter = array(
"out_trade_no" => $param["out_trade_no"],
"subject" => str_sub($param["pay_body"], 15),
"total_amount" => (float)$param["pay_money"],
"scene" => "bar_code",
"auth_code" => $param['auth_code'],
);
$parameter = json_encode($parameter);
$request = new \AlipayTradePayRequest();
$request->setBizContent($parameter);
$result = $this->aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
$pay_common = new PayModel();
return $res = $pay_common->onlinePay($param['out_trade_no'], 'alipay', $result->$responseNode->trade_no, 'alipay');
} else {
return $this->error([], $result->$responseNode->sub_msg);
}
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* Common: 判断:是否开启 花呗分期
* Author: wu-hui
* Time: 2023/01/15 11:50
* @param $siteId
* @return int
*/
public static function isOpenStages($siteId){
$configResult = (new Config())->getPayConfig($siteId);
if(!$configResult['data']) return 0;// 没有配置数据 未开启花呗
if(!$configResult['data']['value']) return 0;// 没有配置数据 未开启花呗
return @(int)$configResult['data']['value']['alipay_stages'];
}
}