微信支付 composer 方法 --- 實測有效


<h1 align="center">Pay</h1>

<p align="center">
<a href="https://styleci.io/repos/100355112"><img src="https://styleci.io/repos/100355112/shield?branch=master" alt="StyleCI"></a>
<a href="https://scrutinizer-ci.com/g/yansongda/pay/?branch=master"><img src="https://scrutinizer-ci.com/g/yansongda/pay/badges/quality-score.png?b=master" alt="Scrutinizer Code Quality"></a>
<a href="https://scrutinizer-ci.com/g/yansongda/pay/build-status/master"><img src="https://scrutinizer-ci.com/g/yansongda/pay/badges/build.png?b=master" alt="Build Status"></a>
<a href="https://packagist.org/packages/yansongda/pay"><img src="https://poser.pugx.org/yansongda/pay/v/stable" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/yansongda/pay"><img src="https://poser.pugx.org/yansongda/pay/downloads" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/yansongda/pay"><img src="https://poser.pugx.org/yansongda/pay/v/unstable" alt="Latest Unstable Version"></a>
<a href="https://packagist.org/packages/yansongda/pay"><img src="https://poser.pugx.org/yansongda/pay/license" alt="License"></a>
</p>

**!注意:v1.x 版本將不做新功能開發,只進行 bug 維護!請大家盡快遷移到 v2 版本!**

開發了多次支付寶與微信支付后,很自然產生一種反感,惰性又來了,想在網上找相關的輪子,可是一直沒有找到一款自己覺得逞心如意的,要么使用起來太難理解,要么文件結構太雜亂,只有自己擼起袖子干了。

**說明,請先熟悉支付寶說明文檔!!**

歡迎 Star,歡迎 PR!

laravel 擴展包請 [https://github.com/yansongda/laravel-pay](https://github.com/yansongda/laravel-pay)

## 特點
- 命名不那么亂七八糟
- 隱藏開發者不需要關注的細節
- 根據支付寶、微信最新 API 開發而成
- 高度抽象的類,免去各種拼json與xml的痛苦
- 符合 PSR 標准,你可以各種方便的與你的框架集成
- 文件結構清晰易理解,可以隨心所欲添加本項目中沒有的支付網關
- 方法使用更優雅,不必再去研究那些奇怪的的方法名或者類名是做啥用的


## 運行環境
- PHP 5.6+
- composer


## 支持的支付網關

由於各支付網關參差不齊,所以我們抽象了兩個方法 `driver()`,`gateway()`。

兩個方法的作用如下:

`driver()` : 確定支付平台,如 `alipay`,`wechat`;  

`gateway()`: 確定支付網關。通過此方法,確定支付平台下的支付網關。例如,支付寶下有 「電腦網站支付」,「手機網站支付」,「APP 支付」三種支付網關,通過傳入 `web`,`wap`,`app` 確定。

詳細思路可以查看源代碼。

### 1、支付寶

- 電腦支付
- 手機網站支付
- APP 支付
- 刷卡支付
- 掃碼支付

SDK 中對應的 driver 和 gateway 如下表所示:  

| driver | gateway |   描述       |
| :----: | :-----: | :-------:   |
| alipay | web     | 電腦支付     |
| alipay | wap     | 手機網站支付  |
| alipay | app     | APP 支付  |
| alipay | pos     | 刷卡支付  |
| alipay | scan    | 掃碼支付  |
| alipay | transfer    | 帳戶轉賬(可用於平台用戶提現)  |
  
### 2、微信

- 公眾號支付
- 小程序支付
- H5 支付
- 掃碼支付
- 刷卡支付
- APP 支付

SDK 中對應的 driver 和 gateway 如下表所示:

| driver | gateway |   描述     |
| :----: | :-----: | :-------: |
| wechat | mp      | 公眾號支付  |
| wechat | miniapp | 小程序支付  |
| wechat | wap     | H5 支付    |
| wechat | scan    | 掃碼支付    |
| wechat | pos     | 刷卡支付    |
| wechat | app     | APP 支付  |
| wechat | transfer     | 企業付款  |

## 支持的方法

所有網關均支持以下方法

- pay(array $config_biz)  
說明:支付接口  
參數:數組類型,訂單業務配置項,包含 訂單號,訂單金額等  
返回:mixed  詳情請看「支付網關配置說明與返回值」一節。 

- refund(array|string $config_biz, $refund_amount = null)  
說明:退款接口  
參數:`$config_biz` 為字符串類型僅對`支付寶支付`有效,此時代表訂單號,第二個參數為退款金額。  
返回:mixed  退款成功,返回 服務器返回的數組;否則返回 false- close(array|string $config_biz)  
說明:關閉訂單接口  
參數:`$config_biz` 為字符串類型時代表訂單號,如果為數組,則為關閉訂單業務配置項,配置項內容請參考各個支付網關官方文檔。  
返回:mixed  關閉訂單成功,返回 服務器返回的數組;否則返回 false- find(string $out_trade_no)  
說明:查找訂單接口  
參數:`$out_trade_no` 為訂單號。  
返回:mixed  查找訂單成功,返回 服務器返回的數組;否則返回 false- verify($data, $sign = null)  
說明:驗證服務器返回消息是否合法  
參數:`$data` 為服務器接收到的原始內容,`$sign` 為簽名信息,當其為空時,系統將自動轉化 `$data` 為數組,然后取 `$data['sign']`。  
返回:mixed  驗證成功,返回 服務器返回的數組;否則返回 false;  


## 安裝
```shell
composer require "yansongda/pay:^1.0"
```

## 使用說明

### 0、一個完整的例子:
```php
<?php

namespace App\Http\Controllers;

use Yansongda\Pay\Pay;
use Illuminate\Http\Request;

class PayController extends Controller
{
    protected $config = [
        'alipay' => [
            'app_id' => '2016082000295641',
            'notify_url' => 'http://yansongda.cn/alipay_notify.php',
            'return_url' => 'http://yansongda.cn/return.php',
            'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB',
            'private_key' => 'MIIEpAIBAAKCAQEAs6+F2leOgOrvj9jTeDhb5q46GewOjqLBlGSs/bVL4Z3fMr3p+Q1Tux/6uogeVi/eHd84xvQdfpZ87A1SfoWnEGH5z15yorccxSOwWUI+q8gz51IWqjgZxhWKe31BxNZ+prnQpyeMBtE25fXp5nQZ/pftgePyUUvUZRcAUisswntobDQKbwx28VCXw5XB2A+lvYEvxmMv/QexYjwKK4M54j435TuC3UctZbnuynSPpOmCu45ZhEYXd4YMsGMdZE5/077ZU1aU7wx/gk07PiHImEOCDkzqsFo0Buc/knGcdOiUDvm2hn2y1XvwjyFOThsqCsQYi4JmwZdRa8kvOf57nwIDAQABAoIBAQCw5QCqln4VTrTvcW+msB1ReX57nJgsNfDLbV2dG8mLYQemBa9833DqDK6iynTLNq69y88ylose33o2TVtEccGp8Dqluv6yUAED14G6LexS43KtrXPgugAtsXE253ZDGUNwUggnN1i0MW2RcMqHdQ9ORDWvJUCeZj/AEafgPN8AyiLrZeL07jJz/uaRfAuNqkImCVIarKUX3HBCjl9TpuoMjcMhz/MsOmQ0agtCatO1eoH1sqv5Odvxb1i59c8Hvq/mGEXyRuoiDo05SE6IyXYXr84/Nf2xvVNHNQA6kTckj8shSi+HGM4mO1Y4Pbb7XcnxNkT0Inn6oJMSiy56P+CpAoGBAO1O+5FE1ZuVGuLb48cY+0lHCD+nhSBd66B5FrxgPYCkFOQWR7pWyfNDBlmO3SSooQ8TQXA25blrkDxzOAEGX57EPiipXr/hy5e+WNoukpy09rsO1TMsvC+v0FXLvZ+TIAkqfnYBgaT56ku7yZ8aFGMwdCPL7WJYAwUIcZX8wZ3dAoGBAMHWplAqhe4bfkGOEEpfs6VvEQxCqYMYVyR65K0rI1LiDZn6Ij8fdVtwMjGKFSZZTspmsqnbbuCE/VTyDzF4NpAxdm3cBtZACv1Lpu2Om+aTzhK2PI6WTDVTKAJBYegXaahBCqVbSxieR62IWtmOMjggTtAKWZ1P5LQcRwdkaB2rAoGAWnAPT318Kp7YcDx8whOzMGnxqtCc24jvk2iSUZgb2Dqv+3zCOTF6JUsV0Guxu5bISoZ8GdfSFKf5gBAo97sGFeuUBMsHYPkcLehM1FmLZk1Q+ljcx3P1A/ds3kWXLolTXCrlpvNMBSN5NwOKAyhdPK/qkvnUrfX8sJ5XK2H4J8ECgYAGIZ0HIiE0Y+g9eJnpUFelXvsCEUW9YNK4065SD/BBGedmPHRC3OLgbo8X5A9BNEf6vP7fwpIiRfKhcjqqzOuk6fueA/yvYD04v+Da2MzzoS8+hkcqF3T3pta4I4tORRdRfCUzD80zTSZlRc/h286Y2eTETd+By1onnFFe2X01mwKBgQDaxo4PBcLL2OyVT5DoXiIdTCJ8KNZL9+kV1aiBuOWxnRgkDjPngslzNa1bK+klGgJNYDbQqohKNn1HeFX3mYNfCUpuSnD2Yag53Dd/1DLO+NxzwvTu4D6DCUnMMMBVaF42ig31Bs0jI3JQZVqeeFzSET8fkoFopJf3G6UXlrIEAQ==',
        ],
    ];

    public function index()
    {
        $config_biz = [
            'out_trade_no' => time(),
            'total_amount' => '1',
            'subject'      => 'test subject',
        ];

        $pay = new Pay($this->config);

        return $pay->driver('alipay')->gateway()->pay($config_biz);
    }

    public function return(Request $request)
    {
        $pay = new Pay($this->config);

        return $pay->driver('alipay')->gateway()->verify($request->all());
    }

    public function notify(Request $request)
    {
        $pay = new Pay($this->config);

        if ($pay->driver('alipay')->gateway()->verify($request->all())) {
            // 請自行對 trade_status 進行判斷及其它邏輯進行判斷,在支付寶的業務通知中,只有交易通知狀態為 TRADE_SUCCESS 或 TRADE_FINISHED 時,支付寶才會認定為買家付款成功。 
            // 1、商戶需要驗證該通知數據中的out_trade_no是否為商戶系統中創建的訂單號; 
            // 2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創建時的金額); 
            // 3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email); 
            // 4、驗證app_id是否為該商戶本身。 
            // 5、其它業務邏輯情況
            file_put_contents(storage_path('notify.txt'), "收到來自支付寶的異步通知\r\n", FILE_APPEND);
            file_put_contents(storage_path('notify.txt'), '訂單號:' . $request->out_trade_no . "\r\n", FILE_APPEND);
            file_put_contents(storage_path('notify.txt'), '訂單金額:' . $request->total_amount . "\r\n\r\n", FILE_APPEND);
        } else {
            file_put_contents(storage_path('notify.txt'), "收到異步通知\r\n", FILE_APPEND);
        }

        echo "success";
    }
}

```
```php
<?php

namespace App\Http\Controllers;

use Yansongda\Pay\Pay;
use Illuminate\Http\Request;

class PayController extends Controller
{
    protected $config = [
        'wechat' => [
            'app_id' => 'wxb3f6xxxxxxxxxx',
            'mch_id' => '1457xxxxx2',
            'notify_url' => 'http://yansongda.cn/wechat_notify.php',
            'key' => 'mF2suE9sU6Mk1Cxxxxxxxxxx45',
            'cert_client' => './apiclient_cert.pem',
            'cert_key' => './apiclient_key.pem',
        ],
    ];

    public function index()
    {
        $config_biz = [
            'out_trade_no' => 'e2',
            'total_fee' => '1', // **單位:分**
            'body' => 'test body',
            'spbill_create_ip' => '8.8.8.8',
            'openid' => 'onkVf1FjWS5SBIihS-123456_abc',
        ];

        $pay = new Pay($this->config);

        return $pay->driver('wechat')->gateway('mp')->pay($config_biz);
    }

    public function notify(Request $request)
    {
        $pay = new Pay($this->config);
        $verify = $pay->driver('wechat')->gateway('mp')->verify($request->getContent());

        if ($verify) {
            file_put_contents('notify.txt', "收到來自微信的異步通知\r\n", FILE_APPEND);
            file_put_contents('notify.txt', '訂單號:' . $verify['out_trade_no'] . "\r\n", FILE_APPEND);
            file_put_contents('notify.txt', '訂單金額:' . $verify['total_fee'] . "\r\n\r\n", FILE_APPEND);
        } else {
            file_put_contents(storage_path('notify.txt'), "收到異步通知\r\n", FILE_APPEND);
        }

        echo "success";
    }
}

```

### 1、准備配置參數

```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
    ],
];
$config_biz = [
    'out_trade_no' => '12',         // 訂單號
    'total_amount' => '13',         // 訂單金額,單位:元,**微信支付,單位:分**
    'subject' => 'test subject',    // 訂單商品標題
];
```

### 2、在代碼中使用

```php
<?php

$pay = new Pay($config);
return $pay->driver('alipay')->gateway('web')->pay($config_biz);
```


## 錯誤

使用非跳轉接口(如, `refund` 接口,`close` 接口)時,如果在調用相關支付網關 API 時有錯誤產生,會拋出 `GatewayException` 錯誤,可以通過 `$e->getMessage()` 查看,同時,也可通過 `$e->raw` 查看調用 API 后返回的原始數據,該值為數組格式。


## 支付網關配置說明與返回值

由於支付網關不同,每家參數參差不齊,為了方便,我們抽象定義了兩個參數:`$config`,`$config_biz`,分別為全局參數,業務參數。但是,所有配置參數均為官方標准參數,無任何差別。

「業務參數」為訂單相關的參數,「全局參數」為除訂單相關參數以外的全局性參數。

具體參數列表請查看每個支付網關的使用說明。

### 1、支付寶 - 電腦網站支付

#### 最小配置參數
```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 訂單號
    'total_amount' => '13',                 // 訂單金額,單位:元
    'subject' => 'test subject',   // 訂單商品標題
];
```

#### 所有配置參數

所有參數均為官方標准參數,無任何差別。[點擊這里](https://docs.open.alipay.com/common/105901 '支付寶官方文檔') 查看官方文檔。

```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
        'return_url' => '',         // 同步通知 url,*強烈建議加上本參數*
        'notify_url' => '',         // 異步通知 url,*強烈建議加上本參數*
    ],
];
$config_biz = [
    'out_trade_no' => '',
    'total_amount' => '',                 
    'subject' => '',

    // 訂單描述
    'body' => '',

    // 訂單包含的商品列表信息,Json格式: {"show_url":"https://或http://打頭的商品的展示地址"} ,在支付時,可點擊商品名稱跳轉到該地址      
    'goods_detail' => '',

    // 該筆訂單允許的最晚付款時間,逾期將關閉交易。取值范圍:1m~15d。m-分鍾,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。 該參數數值不接受小數點, 如 1.5h,可轉換為 90m。該參數在請求到支付寶時開始計時。
    'timeout_express' => '',                
    
    // 禁用渠道,用戶不可用指定渠道支付當有多個渠道時用“,”分隔注:與enable_pay_channels互斥
    'disable_pay_channels' => '',

    // 可用渠道,用戶只能在指定渠道范圍內支付當有多個渠道時用“,”分隔注:與disable_pay_channels互斥
    'enable_pay_channels' => '',

    // 公用回傳參數,如果請求時傳遞了該參數,則返回給商戶時會回傳該參數。支付寶只會在異步通知時將該參數原樣返回。本參數必須進行UrlEncode之后才可以發送給支付寶
    'passback_params' => '',

    // 業務擴展參數,詳見 [業務擴展參數說明](https://docs.open.alipay.com/#kzcs)
    'extend_params' => '',

    // 商品主類型:0—虛擬類商品,1—實物類商品(默認)注:虛擬類商品不支持使用花唄渠道
    'goods_type' => '',

    // 獲取用戶授權信息,可實現如免登功能。獲取方法請查閱:用戶信息授權
    'auth_token' => '',

    /**
     *  PC掃碼支付的方式,支持前置模式和跳轉模式。
     *
     *  前置模式是將二維碼前置到商戶的訂單確認頁的模式。需要商戶在自己的頁面中以iframe方式請求支付寶頁面。具體分為以下幾種:
     *  0:訂單碼-簡約前置模式,對應iframe寬度不能小於600px,高度不能小於300px;
     *  1:訂單碼-前置模式,對應iframe寬度不能小於300px,高度不能小於600px;
     *  3:訂單碼-迷你前置模式,對應iframe寬度不能小於75px,高度不能小於75px;
     *  4:訂單碼-可定義寬度的嵌入式二維碼,商戶可根據需要設定二維碼的大小。
     *
     *  跳轉模式下,用戶的掃碼界面是由支付寶生成的,不在商戶的域名下。
     *  2:訂單碼-跳轉模式
     */
    'qr_pay_mode' => '',

    // 商戶自定義二維碼寬度 注:qr_pay_mode=4時該參數生效
    'qrcode_width' => ''
];
```

#### 返回值
- pay()  
類型:string  
說明:該接口返回跳轉到支付寶支付的 Html 代碼。  

### 2、支付寶 - 手機網站支付

#### 最小配置參數
```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 訂單號
    'total_amount' => '13',                 // 訂單金額,單位:元
    'subject' => 'test subject',   // 訂單商品標題
];
```

#### 所有配置參數

該網關大部分參數和 「電腦支付」 相同,具體請參考 [官方文檔](https://docs.open.alipay.com/203/107090/ '支付寶手機網站支付文檔')

#### 返回值
- pay()  
類型:string  
說明:該接口返回跳轉到支付寶支付的 Html 代碼。  

### 3、支付寶 - APP 支付

#### 最小配置參數
```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'notify_url' => '',         // 支付寶異步通知地址
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 訂單號
    'total_amount' => '13',                 // 訂單金額,單位:元
    'subject' => 'test subject',   // 訂單商品標題
];
```

#### 所有配置參數
該網關大部分參數和 「電腦支付」 相同,具體請參考 [官方文檔](https://docs.open.alipay.com/204/105465/ '支付寶APP支付文檔')

#### 返回值
- pay()  
類型:string  
說明:該接口返回用於客戶端調用的 orderString 字符串,可直接供 APP 客戶端調用,客戶端調用方法不在此文檔討論范圍內,[Android 用戶請看這里](https://docs.open.alipay.com/204/105300/),[Ios 用戶請看這里](https://docs.open.alipay.com/204/105299/)。

### 4、支付寶 - 刷卡支付

#### 最小配置參數
```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
    ],
];
$config_biz = [
    'out_trade_no' => '12',         // 訂單號
    'total_amount' => '13',         // 訂單金額,單位:元
    'subject' => 'test subject',    // 訂單商品標題
    'auth_code'  => '123456',       // 授權碼
];
```

#### 所有配置參數
該網關大部分參數和 「電腦支付」 相同,具體請參考 [官方文檔](https://docs.open.alipay.com/api_1/alipay.trade.pay ' 支付寶APP支付文檔')

#### 返回值
- pay()  
類型:array|bool  
說明:該接口成功時返回服務器響應的數組;驗簽失敗返回 false。  

### 5、支付寶 - 掃碼支付

#### 最小配置參數
```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'notify_url' => '',         // 支付寶異步通知地址
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 訂單號
    'total_amount' => '13',                 // 訂單金額,單位:元
    'subject' => 'test subject',   // 訂單商品標題
];
```

#### 所有配置參數
該網關大部分參數和 「電腦支付」 相同,具體請參考 [官方文檔](https://docs.open.alipay.com/api_1/alipay.trade.precreate ' 支付寶APP支付文檔')

#### 返回值
- pay()  
類型:string  
說明:該接口返回二維碼鏈接,可以通過其他庫轉換為二維碼供用戶掃描。

### 6、支付寶 - 帳戶轉賬

#### 最小配置參數
```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
    ],
];
$config_biz = [
    'out_biz_no' => '',                      // 訂單號
    'payee_type' => 'ALIPAY_LOGONID',        // 收款方賬戶類型(ALIPAY_LOGONID | ALIPAY_USERID)
    'payee_account' => 'demo@sandbox.com',   // 收款方賬戶
    'amount' => '10',                        // 轉賬金額
];
```

#### 所有配置參數
```php
<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付寶提供的 APP_ID
        'ali_public_key' => '',     // 支付寶公鑰,1行填寫
        'private_key' => '',        // 自己的私鑰,1行填寫
    ],
];
$config_biz = [
    'out_biz_no' => '',                      // 訂單號
    'payee_type' => 'ALIPAY_LOGONID',        // 收款方賬戶類型(ALIPAY_LOGONID | ALIPAY_USERID)
    'payee_account' => 'demo@sandbox.com',   // 收款方賬戶
    'amount' => '10',                        // 轉賬金額
    'payer_show_name' => '未寒',             // 付款方姓名
    'payee_real_name' => '張三',             // 收款方真實姓名
    'remark' => '張三',                      // 轉賬備注
];
```

 [官方文檔](https://doc.open.alipay.com/docs/api.htm?apiId=1321&docType=4 ' 單筆轉賬到支付寶賬戶接口')


#### 返回值
- pay()  
類型:array|bool  
說明:該接口成功時返回服務器響應的數組;驗簽失敗返回 false。

### 7、微信 - 公眾號支付

#### 最小配置參數
```php
<?php

$config = [
    'wechat' => [
        'app_id' => '',             // 公眾號APPID
        'mch_id' => '',             // 微信商戶號
        'notify_url' => '',
        'key' => '',                // 微信支付簽名秘鑰
        'cert_client' => './apiclient_cert.pem',        // 客戶端證書路徑,退款時需要用到
        'cert_key' => './apiclient_key.pem',            // 客戶端秘鑰路徑,退款時需要用到
    ],
];

$config_biz = [
    'out_trade_no' => '',           // 訂單號
    'total_fee' => '',              // 訂單金額,**單位:分**
    'body' => '',                   // 訂單描述
    'spbill_create_ip' => '',       // 支付人的 IP
    'openid' => '',                 // 支付人的 openID
];
```

#### 所有配置參數
所有參數均為官方標准參數,無任何差別。[點擊這里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 '微信支付官方文檔') 查看官方文檔。
```php
<?php

$config = [
    'wechat' => [
        'endpoint_url' => 'https://apihk.mch.weixin.qq.com/', // optional, default 'https://api.mch.weixin.qq.com/'
        'app_id' => '',             // 公眾號APPID
        'mch_id' => '',             // 微信商戶號
        'notify_url' => '',
        'key' => '',                // 微信支付簽名秘鑰
        'cert_client' => './apiclient_cert.pem',        // 客戶端證書路徑,退款時需要用到
        'cert_key' => './apiclient_key.pem',            // 客戶端秘鑰路徑,退款時需要用到
    ],
];

$config_biz = [
    'out_trade_no' => '',           // 訂單號
    'total_fee' => '',              // 訂單金額,**單位:分**
    'body' => '',                   // 訂單描述
    'spbill_create_ip' => '',       // 支付人的 IP
    'openid' => '',                 // 支付人的 openID
    
    // 自定義參數,可以為終端設備號(門店號或收銀設備ID),PC網頁或公眾號內支付可以傳"WEB"
    'device_info' => '',
    
    // 商品詳細描述,對於使用單品優惠的商戶,改字段必須按照規范上傳,詳見“單品優惠參數說明”
    'detail' => '',
    
    // 附加數據,在查詢API和支付通知中原樣返回,可作為自定義參數使用。
    'attach' => '',
    
    // 符合ISO 4217標准的三位字母代碼,默認人民幣:CNY,詳細列表請參見貨幣類型
    'fee_type' => '',
    
    // 訂單生成時間,格式為yyyyMMddHHmmss,如2009年12月25日9點10分10秒表示為20091225091010。其他詳見時間規則
    'time_start' => '',
    
    // 訂單失效時間,格式為yyyyMMddHHmmss,如2009年12月27日9點10分10秒表示為20091227091010。其他詳見時間規則注意:最短失效時間間隔必須大於5分鍾
    'time_expire' => '',
    
    // 訂單優惠標記,使用代金券或立減優惠功能時需要的參數,說明詳見代金券或立減優惠
    'goods_tag' => '',
    
    // trade_type=NATIVE時(即掃碼支付),此參數必傳。此參數為二維碼中包含的商品ID,商戶自行定義。
    'product_id' => '',
    
    // 上傳此參數no_credit--可限制用戶不能使用信用卡支付
    'limit_pay' => '',
    
    // 該字段用於上報場景信息,目前支持上報實際門店信息。該字段為JSON對象數據,對象格式為{"store_info":{"id": "門店ID","name": "名稱","area_code": "編碼","address": "地址" }} ,字段詳細說明請點擊行前的+展開
    'scene_info' => '',
];
```

#### 返回值
- pay()  
類型:array  
說明:返回用於 微信內H5調起支付 的所需參數數組。后續調用不在本文檔討論范圍內,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)。

后續調用舉例:  

```html
<script type="text/javascript">
        function onBridgeReady(){
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest', {
                    "appId":"<?php echo $pay['appId']; ?>",     //公眾號名稱,由商戶傳入     
                    "timeStamp":"<?php echo $pay['timeStamp']; ?>",         //時間戳,自1970年以來的秒數     
                    "nonceStr":"<?php echo $pay['nonceStr']; ?>", //隨機串     
                    "package":"<?php echo $pay['package']; ?>",     
                    "signType":"<?php echo $pay['signType']; ?>",         //微信簽名方式:     
                    "paySign":"<?php echo $pay['paySign']; ?>" //微信簽名 
                },
                function(res){     
                    if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回    ok,但並不保證它絕對可靠。 
                }
            ); 
        }

        $(function(){
            $('#pay').click(function(){
                if (typeof WeixinJSBridge == "undefined"){
                   if( document.addEventListener ){
                       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
                   }else if (document.attachEvent){
                       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
                       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
                   }
                }else{
                   onBridgeReady();
                }
            })
        });
</script>
```

### 8、微信 - 小程序支付

#### 最小配置參數
```php
<?php

$config = [
    'wechat' => [
        'miniapp_id' => '',             // 小程序APPID
        'mch_id' => '',             // 微信商戶號
        'notify_url' => '',
        'key' => '',                // 微信支付簽名秘鑰
        'cert_client' => './apiclient_cert.pem',        // 客戶端證書路徑,退款時需要用到
        'cert_key' => './apiclient_key.pem',            // 客戶端秘鑰路徑,退款時需要用到
    ],
];

$config_biz = [
    'out_trade_no' => '',           // 訂單號
    'total_fee' => '',              // 訂單金額,**單位:分**
    'body' => '',                   // 訂單描述
    'spbill_create_ip' => '',       // 支付人的 IP
    'openid' => '',                 // 支付人的 openID
];
```

#### 所有配置參數
由於「小程序支付」和「公眾號支付」都使用的是 JSAPI,所以,除了 APPID 一個使用的是公眾號的 APPID 一個使用的是 小程序的 APPID 以外,該網關所有參數和 「公眾號支付」 相同,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1)。

#### 返回值
- pay()  
類型:array  
說明:返回用於 小程序調起支付API 的所需參數數組。后續調用不在本文檔討論范圍內,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3)。

### 9、微信 - H5 支付
#### 最小配置參數

```php
<?php

$config = [
    'wechat' => [
        'app_id' => '',             // 微信公眾號 APPID
        'mch_id' => '',             // 微信商戶號
        'return_url' => '',         // *此配置選項可選*,注意,該跳轉 URL 只有跳轉之意,沒有同步通知功能
        'notify_url' => '',
        'key' => '',                // 微信支付簽名秘鑰
        'cert_client' => './apiclient_cert.pem',        // 客戶端證書路徑,退款時需要用到
        'cert_key' => './apiclient_key.pem',            // 客戶端秘鑰路徑,退款時需要用到
    ],
];

$config_biz = [
    'out_trade_no' => '',           // 訂單號
    'total_fee' => '',              // 訂單金額,**單位:分**
    'body' => '',                   // 訂單描述
    'spbill_create_ip' => '',       // 支付人的 IP
];
```

#### 所有配置參數
所有配置項和前面支付網關相差不大,請[點擊這里查看](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1).

#### 返回值
- pay()  
類型:string  
說明:返回微信支付中間頁網址,可直接 302 跳轉。

### 10、微信 - 掃碼支付
這里使用「模式二」進行掃碼支付,具體請[參考這里](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5)

#### 最小配置參數

```php
<?php

$config = [
    'wechat' => [
        'app_id' => '',             // 微信公眾號 APPID
        'mch_id' => '',             // 微信商戶號
        'notify_url' => '',
        'key' => '',                // 微信支付簽名秘鑰
        'cert_client' => './apiclient_cert.pem',        // 客戶端證書路徑,退款時需要用到
        'cert_key' => './apiclient_key.pem',            // 客戶端秘鑰路徑,退款時需要用到
    ],
];

$config_biz = [
    'out_trade_no' => '',           // 訂單號
    'total_fee' => '',              // 訂單金額,**單位:分**
    'body' => '',                   // 訂單描述
    'spbill_create_ip' => '',       // 調用 API 服務器的 IP
    'product_id' => '',             // 訂單商品 ID
];
```

#### 所有配置參數
所有配置項和前面支付網關相差不大,請[點擊這里查看](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1)

#### 返回值
- pay()  
類型:string  
說明:返回微信支付二維碼 URL 地址,可直接將此 url 生成二維碼,展示給用戶進行掃碼支付。

### 11、微信 - 刷卡支付

#### 最小配置參數
```php
<?php

$config = [
    'wechat' => [
        'app_id' => '',             // 公眾號 APPID
        'mch_id' => '',             // 微信商戶號
        'key' => '',                // 微信支付簽名秘鑰
        'cert_client' => './apiclient_cert.pem',        // 客戶端證書路徑,退款時需要用到
        'cert_key' => './apiclient_key.pem',            // 客戶端秘鑰路徑,退款時需要用到
    ],
];

$config_biz = [
    'out_trade_no' => '',           // 訂單號
    'total_fee' => '',              // 訂單金額,**單位:分**
    'body' => '',                   // 訂單描述
    'spbill_create_ip' => '',       // 支付人的 IP
    'auth_code' => '',              // 授權碼
];
```

#### 所有配置參數
該網關所有參數和其它支付網關基本相同,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1)。

#### 返回值
- pay()  
類型:array  
說明:返回用於服務器返回的數組。返回參數請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1)。

### 12、微信 - APP 支付

#### 最小配置參數
```php
<?php

$config = [
    'wechat' => [
        'appid' => '',              // APPID
        'mch_id' => '',             // 微信商戶號
        'notify_url' => '',
        'key' => '',                // 微信支付簽名秘鑰
        'cert_client' => './apiclient_cert.pem',        // 客戶端證書路徑,退款時需要用到
        'cert_key' => './apiclient_key.pem',            // 客戶端秘鑰路徑,退款時需要用到
    ],
];

$config_biz = [
    'out_trade_no' => '',           // 訂單號
    'total_fee' => '',              // 訂單金額,**單位:分**
    'body' => '',                   // 訂單描述
    'spbill_create_ip' => '',       // 支付人的 IP
];
```

#### 所有配置參數
該網關所有參數和其它支付網關相同相同,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)。

#### 返回值
- pay()  
類型:array  
說明:返回用於 小程序調起支付API 的所需參數數組。后續調用不在本文檔討論范圍內,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)。

### 12、微信 - 企業付款

#### 最小配置參數
```php
<?php

$config = [
    'wechat' => [
        'appid' => '',              // APPID
        'mch_id' => '',             // 微信商戶號
        'key' => '',                // 微信支付簽名秘鑰
        'cert_client' => './apiclient_cert.pem',        // 客戶端證書路徑,退款時需要用到
        'cert_key' => './apiclient_key.pem',            // 客戶端秘鑰路徑,退款時需要用到
    ],
];

$config_biz = [
    'partner_trade_no' => '',              //商戶訂單號
    'openid' => '',                        //收款人的openid
    'check_name' => 'NO_CHECK',            //NO_CHECK:不校驗真實姓名\FORCE_CHECK:強校驗真實姓名
//    're_user_name'=>'張三',              //check_name為 FORCE_CHECK 校驗實名的時候必須提交
    'amount' => 100,                       //企業付款金額,單位為分
    'desc' => '帳戶提現',                  //付款說明
    'spbill_create_ip' => '192.168.0.1',  //發起交易的IP地址
];
```

#### 所有配置參數
具體請看 [官方文檔](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。

#### 返回值
- pay()  
類型:array  
說明:返回用於 支付結果 的數組。具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。

### 13、微信 - 發放裂變紅包

#### 最小配置參數
```php
<?php
 $config = [
            'wechat' => [
                'app_id'=>'wxaxxxxxxxx',
                'mch_id' => '1442222202',
                'key' => 'ddddddddddddddd',
                'cert_client' => 'D:\php\xxx\application\wxpay\cert\apiclient_cert.pem',
                'cert_key' => 'D:\php\xxx\application\wxpay\cert\apiclient_key.pem',
            ],
        ];

        $config_biz = [
            'wxappid'=>'wxaxxxxxxxx',
            'mch_billno' => 'hb'.time(),
            'send_name'=>'萌點雲科技',//商戶名稱
            're_openid'=>'ogg5JwsssssssssssCdXeD_S54',//用戶openid
            'total_amount' =>333, // 付款金額,單位分
            'wishing'=>'提前祝你狗年大吉',//紅包祝福語
            'client_ip'=>'192.168.0.1',//調用接口的機器Ip地址
            'total_num'=>'3',//紅包發放總人數
            'act_name'=>'提前拜年',//活動名稱
            'remark'=>'提前祝你狗年大吉,苟富貴勿相忘!', //備注
            'amt_type'=>'ALL_RAND',//ALL_RAND—全部隨機,商戶指定總金額和紅包發放總人數,由微信支付隨機計算出各紅包金額
        ];

        $pay = new Pay($config);
        try
        {
            $res=   $pay->driver('wechat')->gateway('groupredpack')->pay($config_biz);

        }catch (Exception $e){

        }

```

#### 所有配置參數
具體請看 [官方文檔](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4)。

#### 返回值
- pay()  
類型:array  
說明:返回用於 支付結果 的數組。具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4)。


### 14、微信 - 發放普通紅包

#### 最小配置參數
```php
<?php
 $config = [
            'wechat' => [
                'app_id'=>'wxaxxxxxxxx',
                'mch_id' => '1442222202',
                'key' => 'ddddddddddddddd',
                'cert_client' => 'D:\php\xxx\application\wxpay\cert\apiclient_cert.pem',
                'cert_key' => 'D:\php\xxx\application\wxpay\cert\apiclient_key.pem',
            ],
        ];

        $config_biz = [
            'wxappid'=>'wxaxxxxxxxx',
            'mch_billno' => 'hb'.time(),
            'send_name'=>'萌點雲科技',//商戶名稱
            're_openid'=>'ogg5JwsssssssssssCdXeD_S54',//用戶openid
            'total_amount' =>100, // 付款金額,單位分
            'wishing'=>'提前祝你狗年大吉',//紅包祝福語
            'client_ip'=>'192.168.0.1',//調用接口的機器Ip地址
            'total_num'=>'1',//紅包發放總人數
            'act_name'=>'提前拜年',//活動名稱
            'remark'=>'提前祝你狗年大吉,苟富貴勿相忘!', //備注
        ];

        $pay = new Pay($config);
        try
        {
            $res=   $pay->driver('wechat')->gateway('redpack')->pay($config_biz);

        }catch (Exception $e){

        }

```

#### 所有配置參數
具體請看 [官方文檔](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3)。

#### 返回值
- pay()  
類型:array  
說明:返回用於 支付結果 的數組。具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3)。
## 代碼貢獻
由於測試及使用環境的限制,本項目中只開發了「支付寶」和「微信支付」的相關支付網關。

如果您有其它支付網關的需求,或者發現本項目中需要改進的代碼,**_歡迎 Fork 並提交 PR!_**

## LICENSE
MIT

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM