简介
支付行为是一个非常普遍的功能,因此KyPHP也从底层为开发者提供了应用中的支付功能。
应用内调用支付组件的逻辑脑图如下:
使用
配置
1、公众号管理中支付配置在: 域名/mp/setting/index
2、支付授权目录为: 域名/mp/payment/
支付代码
下单时,有几个注意点:
1、mp_order 务必传入 notify_url (回调处理器)和 return_url(支付成功后跳转落地页),如下:
'notify_url' => request()->domain() . addon_url('payCallback', ['mid' => $this->mpId]), 'return_url' => request()->domain() . addon_url('detail', ['id' => $id])
2、下单成功后,重定向到app\mp\payment中的pay操作,如下:
$this->redirect(request()->domain() . url('mp/payment/pay') . '?order_no='.$order_data['order_no']);
3、订单信息需要存储两份,全局的mp_order 表和应用中的业务订单表(如demo_order),如:
$order_data = [ 'mpid' => $this->mpId, 'order_no' => demo_build_order_no(), 'openid' => $this->followInfo['openid'], 'subject' => '打赏', 'body' => '文章【'.$data['title'].'】', 'amount' => 1, 'notify_url' => request()->domain() . addon_url('payCallback', ['mid' => $this->mpId]), 'return_url' => request()->domain() . addon_url('detail', ['id' => $id]) ]; model('common/mpOrder')->addOne($order_data); unset($order_data['notify_url'], $order_data['return_url']); $order_data = array_merge($order_data, [ 'article_id' => $id, 'username' => $this->followInfo['nickname'], 'headimgurl' => $this->followInfo['headimgurl'], 'total' => $order_data['amount'], 'client_ip' => request()->ip() ]); $res = $this->orderM->addOne($order_data);
支付成功回调,需要注意:
1、首先修改两个订单表中的对应订单的支付状态,例如:
$order_info = model('common/mpOrder')->getOneByMap(['order_no' => $data['out_trade_no']]); if(!empty($order_info) && $order_info['paid'] == 0) { //更新订单 model('common/mpOrder')->updateOne([ 'id' => $order_info['id'], 'paid' => 1 ]); $this->orderM->updateByMap( ['order_no' => $data['out_trade_no']], ['paid' => 1, 'pay_time' => time(), 'transaction_id' => $data['transaction_id']] ); }
其他相关的业务操作根据要求进行即可。
完整支付功能的具体代码实现可以查看应用demo的打赏功能