🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 有调系统中都集成了哪些支付 微信支付 (https://pay.weixin.qq.com) 百度钱包 (http://b.baifubao.com) 银联支付 (http://mobile.unionpay.com/preference) 支付宝 (https://e.alipay.com/index.htm) 如何发起一个支付? 在微擎系统中,发起一个支付功能很简单,只需要调用父类的$this→pay();方法即可,在发起支付时,请先确保你需要的数据包括用户身份等信息已经提先入库,支付成功通知不包含此类信息,只是负责通知支付成功或是失败 具体请看下方例子: //该代码片断在/framework/builtin/recharge/site.php中 ~~~ public function doMobilePay() { //获取用户要充值的金额数 $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); } ~~~ 调用$this→pay($params);方法后,用户会跳转到收银台中。 如果不使用系统的 $this→pay($params); 方法,则需要手动添加记录到系统订单表,如下: ~~~ global $_W; //构造支付请求中的参数 $params = array( 'tid' => $chargerecord['tid'], //充值模块中的订单号,此号码用于业务模块中区分订单,交易的识别码 'ordersn' => $chargerecord['tid'], //收银台中显示的订单号 'title' => '系统充值余额', //收银台中显示的标题 'fee' => $chargerecord['fee'], //收银台中显示需要支付的金额,只能大于 0 'user' => $_W['member']['uid'], //付款用户, 付款的用户名(选填项) ); $log = pdo_get('core_paylog', array('uniacid' => $_W['uniacid'], 'module' => $params['module'], 'tid' => $params['tid'])); //在pay方法中,要检测是否已经生成了paylog订单记录,如果没有需要插入一条订单数据 //未调用系统pay方法的,可以将此代码放至自己的pay方法中,进行漏洞修复 if (empty($log)) { $log = array( 'uniacid' => $_W['uniacid'], 'acid' => $_W['acid'], 'openid' => $_W['member']['uid'], 'module' => $this->module['name'], //模块名称,请保证$this可用 'tid' => $params['tid'], 'fee' => $params['fee'], 'card_fee' => $params['fee'], 'status' => '0', 'is_usecard' => '0', ); pdo_insert('core_paylog', $log); } //执行自己的收银台或是直接跳转至支付地址 ~~~ 如何判断用户是否支付成功? 当用户支付完成后,系统会调用模块中的$this→payResult($params);方法来通知支付是否成功,此方法为支付接口方(微信,支付宝,百度钱包等)调用,请避免使用checkauth()或是其它身份判断 在进行状态修改时,也请再次判断一下用户支付的金额是否与订单的金额一致,确保支付安全,具体如下: ~~~ //该代码片断在/framework/builtin/recharge/site.php中 public function payResult($params) { //一些业务代码 //根据参数params中的result来判断支付是否成功 if ($params['result'] == 'success' && $params['from'] == 'notify') { //此处会处理一些支付成功的业务代码 //此处再次判断用户支付的金额是否与其生成订单的金额相符,二次验证支付安全 if ($params['fee'] != $order['fee']) { exit('用户支付的金额与订单金额不符合'); } } if (empty($params['result']) || $params['result'] != 'success') { //此处会处理一些支付失败的业务代码 } //因为支付完成通知有两种方式 notify,return,notify为后台通知,return为前台通知,需要给用户展示提示信息 //return做为通知是不稳定的,用户很可能直接关闭页面,所以状态变更以notify为准 //如果消息是用户直接返回(非通知),则提示一个付款成功 if ($params['from'] == 'return') { if ($params['result'] == 'success') { message('支付成功!', '../../app/' . url('mc/home'), 'success'); } else { message('支付失败!', '../../app/' . url('mc/home'), 'error'); } } } ~~~ 支付的工作流程是什么? 1. 用户在使用模块功能需要支付时,模块调用父类的$this→pay($params);方法来调用系统收银台功能。 2. 系统收银台接到模块调用请求,生成支付界面(金额,商品信息等)。 3. 用户在收银台中选择支付手段,如微信支付,支付宝支持等。 4. 收银台根据用户选择的支付手段,请求到相应的支付接口上,用户完成支付。 5. 完成支付后,系统会调用模块中的 $this→payResult($params); 方法来通知支付状态(成功或是失败)。 6. 如下图所示: ![](https://box.kancloud.cn/2016-04-02_56ff27a7b111b.jpg)