## 发起支付(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);
}
~~~
#### 调用效果如下:
![](http://cdn.w7.cc/images/2017/08/02/15016131455980cc591e5cd_BxYFflJ5fUYl.jpg)
## 验证支付(支付回调)
在用户支付完成后,系统需要根据支付状态修改用户的订单状态及通知用户,为此我们需要在代码中编写支付的回调方法,回调方法如下:
* 注意代码位置位于插件根目录中的`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');
}
~~~