查看代码:
1.controller: https://github.com/fecmall/yii2_fecmall_fbbcbase/blob/master/app/appserver/modules/Checkout/controllers/PaymentController.php#L42
2.block:https://github.com/fecmall/yii2_fecmall_fbbcbase/blob/master/app/appserver/modules/Checkout/block/payment/Add.php#L22
分析
1.在sales_flat_order 表有一个字段 payment_no
订单交易编码, 当生成订单的时候,
如果购物车产品是多个商户,那么生成多个订单,多个订单的payment_no
是相同的,查看代码:https://github.com/fecmall/yii2_fecmall_fbbcbase/blob/master/services/Order.php#L878
同时,将这个payment_no
写入到token session
(通过fecshop uuid存储在redis的值)中
,查看代码:https://github.com/fecmall/yii2_fecmall_fbbcbase/blob/master/services/Order.php#L980
2.在订单生成后,payment_no
写入到token session
,然后跳转到payment页面,这种情况没有参数传递,
而是从token session
中取出来payment_no
,然后进行支付。
另外一种是从账户中心的订单部分,点击支付
按钮过来的,这种是通过参数传递的,也就是order_increment_id
,然后将这个写入到token session
当支付完成,返回网站的时候,从token session
中取出来保存的值,然后通过
https://github.com/fecmall/yii2_fecmall_fbbcbase/blob/master/services/Order.php#L386
来辨别是订单表(sales_flat_order)的字段increment_id
还是payment_no
,
通过这个函数可以看到原理:https://github.com/fecmall/yii2_fecmall_fbbcbase/blob/master/services/Order.php#L995
function paymentCodeIsPaymentNo($pay_no)
{
if (substr($pay_no, 0, 7) == 'pay_no_' ) {
return true;
}
return false;
}
为什么要这样做?
因为:1.要支持多商户产品,一次生成多个订单一起支付的情况,还要支持2.账户中心单个订单进行支付的情况,因此通过payment_no的编号都是以'pay_no_'
开头来辨别。