Skip to content

highjump0615/MilkDeliveryLaravel

Repository files navigation

Milk Delivery Admin & Mobile Web App

Milk delivery admin web application, made using Laravel PHP framework.

Overview

PC端后台为主,客户端为微信端Web App,通过公众号进入

主要功能

1. 后台

  • 奶厂端
    用户管理、奶站管理、基础信息管理、订单管理、财务管理、生产管理、奶卡管理、瓶框管理、客户管理、评价管理、统计分析
  • 奶站端
    用户管理、订单管理、基础信息管理、生产配送管理、客户管理、瓶框管理、财务管理、统计分析
  • 总平台端
    系统日志、用户管理、财务管理、客户管理、统计分析

2. 微信端

  • 订单管理
    下单、订单查看、订单修改、评价

Techniques

Laravel框架 v5.2.45

1. UI开发

2. 功能开发

数据库为MySQL, 数据表结构参考database目录

2.1 后台网站

用户登录

通过Middleware与Auth实现过滤

  • RedirectIfNotGongchang
  • RedirectIfNotNaizhan
  • RedirectIfNotZongpingtai

2.2 REST Api

网站内通过Ajax调用实现功能

  • /api/* 开头路径

2.3 微信支付

支付下单流程
  • 统一下单
    生成商户订单号,获取prepay_id
  • JSAPI支付
  • 生成订单
JSAPI支付

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

  • 确认订单时开启支付
// 调用微信JS api 支付
function jsApiCall(param) {
    var objParam = JSON.parse(param);

    WeixinJSBridge.invoke(
        'getBrandWCPayRequest',
        objParam,
        function (res) {
            WeixinJSBridge.log(res.err_msg);
            // 支付成功
            if (res.err_msg == 'get_brand_wcpay_request:ok') {
                // 跳转到成功页面
                window.location = SITE_URL + "weixin/zhifuchenggong?tradeNo=" + gTradeNo;
            }
            // 用户取消
            else if (res.err_msg == 'get_brand_wcpay_request:cancel') {
            }
            // 支付失败
            else {
                window.location = SITE_URL + "weixin/zhifushibai";
            }
        }
    );
}
微信支付API
// 商户订单号
$strTradeNo = time() . uniqid();

// 预支付
$worder = new \WxPayUnifiedOrder();
$worder->SetBody($strBody);
$worder->SetOut_trade_no($strTradeNo);
$worder->SetTotal_fee(intval($dAmount * 100));
$worder->SetNotify_url('http://' . $request->server('HTTP_HOST') . '/' . env('SITE_PATH') . 'weixin/payresult');
$worder->SetTrade_type("JSAPI");
$worder->SetOpenid($user->openid);

$payOrder = \WxPayApi::unifiedOrder($worder);

3. 代码技巧

大规模数据的csv导入(订单列表)

select * from TABLE  
into outfile FILE
character set gbk 
fields terminated by ','
escaped by '\"'
enclosed by '\"'
lines terminated by '\n';

4. Third-Party Libraries

4.1 jQuery plugins

  • 数据导出为xls或csv文件

app/Lib/Payweixin

借用亿美软通短信服务实现短信验证

require_once app_path() . "/Lib/ChuanglanSmsHelper/ChuanglanSmsApi.php";

class YimeiSmsCtrl extends Controller {
	public function sendSMS($phone, $msg) {
		// 发送短信验证码
	}
}

Updates

2019-04-01

  • BUG: 少数情况下,微信支付成功,但订单没生成

原因

把生成订单接入点设置为前端收到回复get_brand_wcpay_request:ok之后,并没处理支付回调接口

修复

收到支付回调,结果成功,直接生成订单
WeChatCtrl::paymentResult()

订单生成时,需要附加信息,如备注

微信订单参数里有attach,能保存附加信息,但长度有限制(127),所以不能使用。
因此,数据库里做个临时订单表,统一下单时保存相关数据,生成订单成功后删除。 数据表结构参考wxorders

Need to Improve

  • 调整vendors里面的hard code,保持vendors为初始状态
  • 提高加载地区列表速度
  • 微信公众号、支付采用Laravel插件
  • model里删除多余的appends属性, 换成get函数,提高性能
  • 屏幕小界面布局很难看
  • 微信端界面
  • 数据显示需要分页查询
  • 整理所有垃圾代码 ->get()->first(), ->get()->count()
    ... ...