|
@@ -0,0 +1,165 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Services;
|
|
|
+
|
|
|
+use BsPaySdk\core\BsPay;
|
|
|
+use BsPaySdk\request\V2TradePaymentJspayRequest;
|
|
|
+use BsPaySdk\request\V2TradePaymentScanpayRequest;
|
|
|
+use BsPaySdk\request\V2TradePaymentWappayRequest;
|
|
|
+use BsPaySdk\request\V2TradePaymentPayscanpayRequest;
|
|
|
+use BsPaySdk\request\V2TradePaymentQueryRequest;
|
|
|
+use BsPaySdk\request\V2TradePaymentRefundRequest;
|
|
|
+use Illuminate\Support\Facades\Log;
|
|
|
+
|
|
|
+class DgPayService
|
|
|
+{
|
|
|
+ public function __construct()
|
|
|
+ {
|
|
|
+ // 初始化SDK
|
|
|
+ $config = array(
|
|
|
+ 'app_id' => config('dgpay.app_id'),
|
|
|
+ 'app_secret' => config('dgpay.app_secret'),
|
|
|
+ 'merchant_no' => config('dgpay.merchant_no'),
|
|
|
+ 'notify_url' => config('dgpay.notify_url'),
|
|
|
+ 'return_url' => config('dgpay.return_url'),
|
|
|
+ 'is_sandbox' => config('dgpay.is_sandbox'),
|
|
|
+ 'gateway' => config('dgpay.is_sandbox') ? config('dgpay.sandbox_gateway') : config('dgpay.gateway'),
|
|
|
+ );
|
|
|
+
|
|
|
+ BsPay::init($config);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建支付订单
|
|
|
+ *
|
|
|
+ * @param string $orderNo 商户订单号
|
|
|
+ * @param float $amount 支付金额
|
|
|
+ * @param string $subject 商品标题
|
|
|
+ * @param string $payType 支付方式:ALIPAY_H5/WECHAT_H5等
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public function createOrder(string $orderNo, float $amount, string $subject, string $payType): array
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $request = match ($payType) {
|
|
|
+ 'ALIPAY_H5', 'WECHAT_H5' => new V2TradePaymentWappayRequest(),
|
|
|
+ 'ALIPAY_JSAPI', 'WECHAT_JSAPI' => new V2TradePaymentJspayRequest(),
|
|
|
+ 'ALIPAY_NATIVE', 'WECHAT_NATIVE' => new V2TradePaymentScanpayRequest(),
|
|
|
+ default => throw new \InvalidArgumentException('Unsupported pay type: ' . $payType),
|
|
|
+ };
|
|
|
+
|
|
|
+ $request->setOutOrderNo($orderNo);
|
|
|
+ $request->setTransAmt($amount);
|
|
|
+ $request->setGoodsDesc($subject);
|
|
|
+ $request->setPayType($payType);
|
|
|
+
|
|
|
+ $response = BsPay::request($request);
|
|
|
+
|
|
|
+ if ($response->isSuccess()) {
|
|
|
+ return [
|
|
|
+ 'success' => true,
|
|
|
+ 'data' => $response->getData()
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => $response->getMsg()
|
|
|
+ ];
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('DgPay create order error: ' . $e->getMessage());
|
|
|
+ return [
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => $e->getMessage()
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询订单
|
|
|
+ *
|
|
|
+ * @param string $orderNo 商户订单号
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public function queryOrder(string $orderNo): array
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $request = new V2TradePaymentQueryRequest();
|
|
|
+ $request->setOutOrderNo($orderNo);
|
|
|
+
|
|
|
+ $response = BsPay::request($request);
|
|
|
+
|
|
|
+ if ($response->isSuccess()) {
|
|
|
+ return [
|
|
|
+ 'success' => true,
|
|
|
+ 'data' => $response->getData()
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => $response->getMsg()
|
|
|
+ ];
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('DgPay query order error: ' . $e->getMessage());
|
|
|
+ return [
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => $e->getMessage()
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 退款
|
|
|
+ *
|
|
|
+ * @param string $orderNo 商户订单号
|
|
|
+ * @param string $refundNo 退款单号
|
|
|
+ * @param float $amount 退款金额
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public function refund(string $orderNo, string $refundNo, float $amount): array
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $request = new V2TradePaymentRefundRequest();
|
|
|
+ $request->setOutOrderNo($orderNo);
|
|
|
+ $request->setOutRefundNo($refundNo);
|
|
|
+ $request->setRefundAmt($amount);
|
|
|
+
|
|
|
+ $response = BsPay::request($request);
|
|
|
+
|
|
|
+ if ($response->isSuccess()) {
|
|
|
+ return [
|
|
|
+ 'success' => true,
|
|
|
+ 'data' => $response->getData()
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => $response->getMsg()
|
|
|
+ ];
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('DgPay refund error: ' . $e->getMessage());
|
|
|
+ return [
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => $e->getMessage()
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证签名
|
|
|
+ *
|
|
|
+ * @param array $data
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public function verifySign(array $data): bool
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ return BsPay::verifySign($data);
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('DgPay verify sign error: ' . $e->getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|