🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 发起支付(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'); } ~~~