支付

简介

支付行为是一个非常普遍的功能,因此KyPHP也从底层为开发者提供了应用中的支付功能。

应用内调用支付组件的逻辑脑图如下:

1-5f7dd0a1c8d1f.png


使用

配置

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的打赏功能