## 發起支付(PHP版)
### JSAPI
在微擎系統中,發起一個支付功能很簡單,只需要調用父類的`$this->pay();`方法即可。
#### 參數說明:
* **tid**充值模塊中的訂單號,此號碼用于業務模塊中區分訂單,保證在業務中是唯一即可
* **title**收銀臺中顯示的標題
* **fee**收銀臺中顯示需要支付的金額,單位是元,只能大于0
* **ordersn**收銀臺中顯示的訂單號,僅供顯示用
* **user**付款用戶, 付款的用戶名(選填項)
~~~
//插件支付示例
public function testPay() {
//獲取用戶要充值的金額數
$fee = floatval($_GPC['money']);
if($fee <= 0) {
message('支付錯誤, 金額小于0');
}
// 一些業務代碼。
//構造支付請求中的參數
$params = array(
'tid' => $chargerecord['tid'], //充值模塊中的訂單號,此號碼用于業務模塊中區分訂單,交易的識別碼
'ordersn' => $chargerecord['tid'], //收銀臺中顯示的訂單號
'title' => '系統充值余額', //收銀臺中顯示的標題
'fee' => $chargerecord['fee'], //收銀臺中顯示需要支付的金額,只能大于 0
'user' => $_W['member']['uid'], //付款用戶, 付款的用戶名(選填項)
);
//調用pay方法,可在控制器的任意位置發起支付
$this->pay($params);
}
~~~
#### 調用效果如下:

## 驗證支付(支付回調)
在用戶支付完成后,系統需要根據支付狀態修改用戶的訂單狀態及通知用戶,為此我們需要在代碼中編寫支付的回調方法,回調方法如下:
* 注意代碼位置位于插件根目錄中的`site.php`中,方法名稱限制為`payResult`,具體代碼如下
~~~
/**
* 支付回調
* @param $ret 回調的參數
*/
public function payResult($ret)
{
//$ret的結構如下:
array(
'weid' => NULL,
//公眾號id(應用id)
'uniacid' => '3',
'acid' => '3',
//支付狀態
'result' => 'success',
//支付方式
'type' => 'wechat',
//通知類型
'from' => 'notify',
//子訂單id
'tid' => '350623110998',
//微擎訂單id
'uniontid' => '2019081111292200001362485161',
'transaction_id' => NULL,
//支付類型
'trade_type' => 'JSAPI',
//是否關注
'follow' => 1,
//用戶openid
'user' => 'oaMwh1cRw11jAkGHfozqZDxcSuLg',
//訂單金額
'fee' => '0.01',
//用戶標簽
'tag' => array(
'acid' => '3',
//用戶id
'uid' => '14',
//支付平臺訂單號
'transaction_id' => '4200000376201908118261118530',
) ,
'is_usecard' => '0',
'card_type' => '0',
'card_fee' => '0.01',
'card_id' => '0',
//支付時間
'paytime' => 1565494168,
);
//其它邏輯處理
}
~~~
## 退款(微信、支付寶)
在微擎系統中,發起退款(微信和支付寶)很簡單,只需要調用兩個函數即可:
#### 前提條件:使用系統內置的支付情況下發起的退款
~~~
load()->model('refund');
//創建退款訂單
//$tid 模塊內訂單id
//$module 需要退款的模塊
//$fee 退款金額
//$reason 退款原因
//成功返回退款單id,失敗返回error結構錯誤
$refund_id = refund_create_order($tid, $module, $fee, $reason);
if (is_error($refund_id)) {
itoast($refund_id['message'], referer(), 'error');
}
//發起退款
$refund_result = refund($refund_id);
if (is_error($refund_result)) {
itoast($refund_result['message'], referer(), 'error');
} else {
pdo_update('core_refundlog', array('status' => 1), array('id' => $refund_id));
//XXX(這里繼續寫自己的其他邏輯)
itoast('退款成功', referer(), 'info');
}
~~~