# Kylin Payment 支付方式

## 1. 支付方式概述

Kylin Payment 支持多种支付方式，包括微信支付、支付宝支付、银联支付等，每种支付方式都有其特定的配置和使用方法。

## 2. 微信支付

### 2.1 配置

在 `config/payment.php` 文件中配置微信支付：

```php
'wechat' => [
    'app_id' => env('WECHAT_PAYMENT_APPID', ''),
    'mch_id' => env('WECHAT_PAYMENT_MCH_ID', ''),
    'key' => env('WECHAT_PAYMENT_KEY', ''),
    'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', ''),
    'key_path' => env('WECHAT_PAYMENT_KEY_PATH', ''),
    'notify_url' => env('WECHAT_PAYMENT_NOTIFY_URL', ''),
    'refund_notify_url' => env('WECHAT_PAYMENT_REFUND_NOTIFY_URL', ''),
],
```

### 2.2 支付类型

- **公众号支付**：在微信公众号中发起支付
- **小程序支付**：在微信小程序中发起支付
- **扫码支付**：通过扫描二维码发起支付
- **APP支付**：在移动应用中发起支付
- **H5支付**：在移动端网页中发起支付
- **企业付款**：向用户付款

### 2.3 使用示例

```php
use Kylin\Payment\Facades\Payment;

// 创建微信支付订单
$order = Payment::create([
    'order_no' => '202401010001',
    'amount' => 100,
    'subject' => '测试商品',
    'body' => '测试商品描述',
    'method' => 'wechat',
    'extra' => [
        'openid' => 'openid123', // 公众号支付和小程序支付需要
        'trade_type' => 'JSAPI', // 支付类型：JSAPI、NATIVE、APP、MWEB
    ],
]);

// 发起微信支付
$paymentParams = Payment::pay($order['order_no']);

// 处理微信支付通知
$notification = Payment::handleNotification(function ($data) {
    // 处理支付通知
    return true;
});
```

## 3. 支付宝支付

### 3.1 配置

在 `config/payment.php` 文件中配置支付宝支付：

```php
'alipay' => [
    'app_id' => env('ALIPAY_APPID', ''),
    'private_key' => env('ALIPAY_PRIVATE_KEY', ''),
    'public_key' => env('ALIPAY_PUBLIC_KEY', ''),
    'notify_url' => env('ALIPAY_NOTIFY_URL', ''),
    'return_url' => env('ALIPAY_RETURN_URL', ''),
    'sandbox' => env('ALIPAY_SANDBOX', false),
],
```

### 3.2 支付类型

- **电脑网站支付**：在电脑网站中发起支付
- **手机网站支付**：在手机网站中发起支付
- **APP支付**：在移动应用中发起支付
- **扫码支付**：通过扫描二维码发起支付
- **人脸支付**：通过人脸识别发起支付

### 3.3 使用示例

```php
use Kylin\Payment\Facades\Payment;

// 创建支付宝支付订单
$order = Payment::create([
    'order_no' => '202401010002',
    'amount' => 100,
    'subject' => '测试商品',
    'body' => '测试商品描述',
    'method' => 'alipay',
    'extra' => [
        'product_code' => 'FAST_INSTANT_TRADE_PAY', // 产品码
        'return_url' => 'http://your-domain.com/payment/alipay/return', // 同步回调地址
    ],
]);

// 发起支付宝支付
$paymentUrl = Payment::pay($order['order_no']);

// 处理支付宝支付通知
$notification = Payment::handleNotification(function ($data) {
    // 处理支付通知
    return true;
});
```

## 4. 银联支付

### 4.1 配置

在 `config/payment.php` 文件中配置银联支付：

```php
'unionpay' => [
    'mer_id' => env('UNIONPAY_MER_ID', ''),
    'cert_path' => env('UNIONPAY_CERT_PATH', ''),
    'cert_pwd' => env('UNIONPAY_CERT_PWD', ''),
    'notify_url' => env('UNIONPAY_NOTIFY_URL', ''),
    'return_url' => env('UNIONPAY_RETURN_URL', ''),
    'sandbox' => env('UNIONPAY_SANDBOX', false),
],
```

### 4.2 支付类型

- **银联云闪付**：通过银联云闪付发起支付
- **银联在线支付**：通过银联在线发起支付
- **银联手机支付**：在移动应用中发起支付

### 4.3 使用示例

```php
use Kylin\Payment\Facades\Payment;

// 创建银联支付订单
$order = Payment::create([
    'order_no' => '202401010003',
    'amount' => 100,
    'subject' => '测试商品',
    'body' => '测试商品描述',
    'method' => 'unionpay',
    'extra' => [
        'txn_type' => '01', // 交易类型：01-消费
        'return_url' => 'http://your-domain.com/payment/unionpay/return', // 同步回调地址
    ],
]);

// 发起银联支付
$paymentUrl = Payment::pay($order['order_no']);

// 处理银联支付通知
$notification = Payment::handleNotification(function ($data) {
    // 处理支付通知
    return true;
});
```

## 5. 自定义支付方式

### 5.1 创建支付服务类

创建自定义支付服务类，继承 `PaymentService` 基类：

```php
<?php

namespace Kylin\Payment\Services;

class CustomPaymentService extends PaymentService
{
    /**
     * 发起支付
     *
     * @param array $order 订单信息
     * @return array 支付参数
     */
    public function pay(array $order)
    {
        // 实现支付逻辑
        return [
            'payment_url' => 'http://example.com/pay',
            'params' => [
                'order_no' => $order['order_no'],
                'amount' => $order['amount'],
            ],
        ];
    }

    /**
     * 处理支付通知
     *
     * @param array $data 通知数据
     * @return bool 处理结果
     */
    public function handleNotification(array $data)
    {
        // 实现通知处理逻辑
        return true;
    }

    /**
     * 申请退款
     *
     * @param array $refund 退款信息
     * @return array 退款结果
     */
    public function refund(array $refund)
    {
        // 实现退款逻辑
        return [
            'status' => 'success',
            'message' => '退款成功',
        ];
    }
}
```

### 5.2 注册支付服务

在 `PaymentServiceProvider` 中注册自定义支付服务：

```php
public function register()
{
    // 注册自定义支付服务
    $this->app->singleton('payment.custom', function ($app) {
        return new CustomPaymentService($app);
    });
}
```

### 5.3 配置自定义支付方式

在 `config/payment.php` 文件中配置自定义支付方式：

```php
'custom' => [
    'api_key' => env('CUSTOM_PAYMENT_API_KEY', ''),
    'api_url' => env('CUSTOM_PAYMENT_API_URL', ''),
    'notify_url' => env('CUSTOM_PAYMENT_NOTIFY_URL', ''),
],
```

## 6. 支付方式选择

### 6.1 根据场景选择

- **电商网站**：推荐使用微信支付和支付宝支付
- **会员系统**：推荐使用微信支付、支付宝支付和银联支付
- **线下场景**：推荐使用扫码支付和云闪付
- **跨境交易**：推荐使用支付宝国际版和微信支付国际版

### 6.2 根据用户群体选择

- **年轻用户**：推荐使用微信支付和支付宝支付
- **老年用户**：推荐使用银联支付
- **企业用户**：推荐使用银行转账和企业付款

## 7. 常见问题

### 7.1 支付失败

**问题**：支付失败
**解决方案**：
1. 检查支付方式配置是否正确
2. 检查订单信息是否正确
3. 检查网络连接是否正常
4. 检查支付平台状态是否正常

### 7.2 支付通知未收到

**问题**：支付通知未收到
**解决方案**：
1. 检查通知地址是否正确
2. 检查服务器是否可以被访问
3. 检查通知处理逻辑是否正确
4. 检查支付平台是否发送了通知

### 7.3 退款失败

**问题**：退款失败
**解决方案**：
1. 检查退款金额是否正确
2. 检查订单是否已支付
3. 检查退款原因是否合理
4. 检查支付平台退款限制

### 7.4 支付安全

**问题**：支付安全问题
**解决方案**：
1. 使用 HTTPS 协议
2. 验证支付通知的签名
3. 加密存储敏感信息
4. 定期更新支付密钥

## 8. 最佳实践

1. **支付方式多样性**：提供多种支付方式，满足不同用户的需求
2. **支付流程优化**：简化支付流程，提高支付成功率
3. **支付安全**：确保支付过程的安全性
4. **错误处理**：妥善处理支付过程中的错误
5. **用户体验**：提供良好的支付体验
6. **数据统计**：分析支付数据，优化支付策略

## 9. 总结

Kylin Payment 支持多种支付方式，每种支付方式都有其特定的配置和使用方法。通过合理选择和配置支付方式，可以提高支付的成功率和用户体验，满足不同场景的支付需求。
