## 微信支付
### 說明
在開發網頁、微信公眾號H5頁面的過程中,微信支付是常用的使用場景。使用wxpay微信支付插件,可以快速的對項目集成微信支付功能。
當然可以在不使用插件的情況下,自己開發微信支付功能。微信支付基于EasyWechat,參考開發地址:https://www.easywechat.com/docs/master/zh-CN/payment/index
>[info] 微信支付插件地址:http://www.eacoophp.com/appstore_plugin/wxpay
### 插件使用要求
~~~
1. 依賴于composer安裝easywechat,命令行composer require overtrue/wechat:~4.0 -vvv
2. EacooPHP系統版本1.1.0+
3. 微信商戶號配置信息
~~~
### 應用場景
1.微信公眾號H5支付
2.微信掃碼支付,常用于PC端
3.APP接口調起微信支付
### 實現過程
**1.后臺配置支付信息**

**2.在微信商戶平臺配置支付授權目錄**

**3.在控制器中需要處理微信支付的地方添加代碼,例如**
~~~
$total_fee=0.01;
$out_trade_no=訂單號;
$body='測試支付';
$notify_url = 支付異步通知地址;
$openid = 微信OPENID;
$params = [
'money' => $total_fee,
'order_number' => $out_trade_no,
'body' => $body,
'notify_url' => $notify_url,
'openid' => $openid,
'trade_type' => 'JSAPI'
];
$result = hook('wxpay',$params,true);
return $result;
~~~
返回結果根據trade_type的參數而定,目前支持JSAPI,NATIVE,APP...
比如:trade_type參數為JSAPI,默認返回json字符串。用于WeixinJSBridge發起的支付方式。
**4.要確認主題或模版中啟用了頁面尾部鉤子PageFooter。**
~~~
html代碼:
{:hook('PageFooter')}
~~~
因為微信支付插件封裝的js代碼會在這個鉤子中加載。
**5.在自己開發的js代碼中調用封裝的支付方法。**
~~~[js]
$.post(請求URL, data, function(result) {
jsWxpay(result);
})
~~~
**6.完成上面的工作就能調起微信支付框了。**
微信支付成功后,支付結果會異步發送到通知地址,就是第3步中設置的notify_url。通知接收方法接收到結果數據后就進行處理。
**7.異步通知處理**
直接上代碼例子:
~~~
public function Notify()
{
$wxpay_class = get_plugin_class('wxpay');
if (!class_exists($wxpay_class)) {
//wxpay插件類不存在
echo 'fail';
exit;
}
$wxpay = new $wxpay_class;
$wxpay_app = $wxpay->initPayment();
$response = $wxpay_app->handlePaidNotify(function($message, $fail){
// 使用通知里的 "微信支付訂單號" 或者 "商戶訂單號" 去自己的數據庫找到訂單
$order = 查詢訂單($message['out_trade_no']);
if (!$order) { // 如果訂單不存在
$fail('Order not exist.'); // 告訴微信,我已經處理完了,訂單沒找到,別再通知我了
}
// 如果訂單存在
// 檢查訂單是否已經更新過支付狀態
if ($order->paid_at) { // 假設訂單字段“支付時間”不為空代表已經支付
return true; // 已經支付成功了就不再更新了
}
// 用戶是否支付成功
if ($message['result_code'] === 'SUCCESS') {
// 不是已經支付狀態則修改為已經支付狀態
$order->paid_at = time(); // 更新支付時間為當前時間
$order->status = 'paid';
} else { // 用戶支付失敗
$order->status = 'paid_fail';
}
$order->save(); // 保存訂單
return true; // 返回處理完成
});
return $response->send(); // return $response;
}
~~~
## 最后
插件中包含Demo,不過要自己改寫,主要提供思路
- 前言
- 基礎
- 安裝
- 規范
- 數據庫設計
- 命名規范
- 建議參考
- 架構
- 架構總覽
- 目錄結構
- 生命周期
- 入口文件
- 模塊設計
- 插件設計
- 主題設計
- API設計
- 容器和依賴注入
- 驗證器設計
- 鉤子和行為設計
- 介紹
- 后臺介紹
- 儀表盤
- 系統設置
- 系統設置
- 網站設置
- 前臺導航菜單
- 后臺導航菜單
- 配置管理
- 用戶管理
- 權限管理
- 角色組
- 節點管理
- 附件管理
- 工具
- 擴展中心
- 模塊
- 插件
- 主題
- 前臺介紹
- API接口
- 模型層
- 定義
- 邏輯層
- 定義
- 邏輯初始化
- 服務層
- 定義
- 二次開發
- 模塊開發
- 介紹
- 1.結構目錄
- 2.install安裝目錄文件
- info.json
- options.php
- menus.php
- unstall.sql
- install.sql
- 3.安裝模塊
- 模塊函數與全局函數
- 其他
- 插件開發
- 介紹
- 定義入口文件
- 1.結構目錄
- 2.install安裝目錄文件
- info.json
- options.php
- menus.php
- install.sql
- unstall.sql
- 3.實現鉤子方法
- 4.安裝插件
- 開發使用
- 插件控制器Controller
- 插件模型Model
- 插件邏輯層Logic
- 開發總結
- 主題開發
- 介紹
- 結構目錄
- install安裝目錄
- info.json
- 主題變量
- 模塊主題化
- 插件主題化
- CSS、JS靜態資源引入
- 創建模版文件
- API開發
- 通用組件
- wangeditor編輯器
- 上傳
- 實戰開發
- 控制器
- 驗證器
- 接口
- 創建自定義模版
- 數據庫操作
- 通過接口上傳文件
- 構建器Builder(重要)
- 表單Form
- 設置頁面標題
- 表單項(調用方式)
- 文本框text
- 隱藏域hidden
- 文本區textarea
- 時間選擇器datetime
- 圖片選擇器picture
- 多圖片選擇器pictures
- 圖片上傳image
- 文件上傳file
- wang編輯器wangeditor
- 百度富文本編輯器ueditor
- 選擇項
- 添加標簽欄Tab
- 自定義頭部工具欄
- 表單提交處理
- 列表List
- 設置頁面標題
- 添加標簽欄Tab
- 高級查詢
- 查詢構造器
- 添加列表搜索功能
- 添加批量操作
- 自定義頭部工具
- 頂部新增按鈕
- 頂部批量啟用
- 頂部批量禁用
- 排序Sort
- 表單驗證
- 插件-Builder構建器
- 命令行
- 配置
- 擴展專題
- 輕松識別客戶端信息User Agent
- 字符串
- 數組
- 鉤子、插件、模塊相關方法
- 時間
- 請求(request)
- 附件
- 用戶信息
- 前臺用戶
- 后臺用戶
- 微信(wechat模塊)
- 專題
- 插件專題
- 微信支付
- 支付寶(即時到賬)
- 微信小程序專題
- 微信模塊
- 日志
- 后臺行為日志
- 框架日志
- 自定義日志
- 常見問題集
- 附錄
- 配置參考
- 常量參考
- 變量參考
- 更新日志
- 升級指導
- 關于
- 進階
- 分布式數據庫
- 分布式緩存
- 負載均衡
- Redis
- 分庫分表