时光

时光 查看完整档案

北京编辑  |  填写毕业院校天津微迪加科技有限公司  |  php工程师 编辑 www.php63.cc 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

时光 回答了问题 · 10月30日

解决关于充值订单调用方式的疑惑

谢谢各位指点,之前已经解决了,采用了异步回调,流程为:
商户提交订单->平台->供货商系统
供货商充值回调->平台->商户
考虑到平台方需求,回调未做队列处理

关注 2 回答 2

时光 收藏了问题 · 10月16日

PHP实现多平台短信发送

一、需求描述

我们的项目中有一个发送短信验证码的功能,平台方为了避免被恶意刷量,所以做了一个发送数量限制。由于我们系统不能限制发送数量,如果被平台方限制发送数量,将导致短信无法发送,致使用户流失,所以需接入其他平台作为备用。

二、困境

原本只考虑了单平台所以如果想加入其他短信平台就会导致和现有结构不兼容,导致切换过程复杂,修改代码量大,隐患较大,现有流程如下:
image

三、解决方案

结合以上原因,打算重新封装一个短信发送功能,该功能能够在不影响原有接口的情况下兼容原有程序,实现新增任何平台均可无缝对接,永久解决问题,方案流程图如下:
image

四、业务分析

根据上图得知,无论是是阿里大于、短信宝或者其他平台,在这个系统里都需要使用到一个发送功能,那么我们可以使用PHP类与对象中的对象接口,来指定各平台类中必须实现的方法,实现代码统一规范。

五、代码实现

运用到的技术:适配器模式
代码部分请前往Github查看:查看代码

以上方案仅为个人想法,欢迎各位在评论中留言相互学习

时光 提出了问题 · 9月19日

PHP实现多平台短信发送

一、需求描述

我们的项目中有一个发送短信验证码的功能,平台方为了避免被恶意刷量,所以做了一个发送数量限制。由于我们系统不能限制发送数量,如果被平台方限制发送数量,将导致短信无法发送,致使用户流失,所以需接入其他平台作为备用。

二、困境

原本只考虑了单平台所以如果想加入其他短信平台就会导致和现有结构不兼容,导致切换过程复杂,修改代码量大,隐患较大,现有流程如下:
image

三、解决方案

结合以上原因,打算重新封装一个短信发送功能,该功能能够在不影响原有接口的情况下兼容原有程序,实现新增任何平台均可无缝对接,永久解决问题,方案流程图如下:
image

四、业务分析

根据上图得知,无论是是阿里大于、短信宝或者其他平台,在这个系统里都需要使用到一个发送功能,那么我们可以使用PHP类与对象中的对象接口,来指定各平台类中必须实现的方法,实现代码统一规范。

五、代码实现

运用到的技术:适配器模式
代码部分请前往Github查看:查看代码

以上方案仅为个人想法,欢迎各位在评论中留言相互学习

关注 1 回答 0

时光 赞了回答 · 9月17日

解决讨论讨论短信发送多平台多通道的方案可行性

成熟的方案,就选择上面大佬的回答,想自己锻炼锻炼就写适配器,写策略。但如果投入生产环境,还请不要过度自信呦o( ̄︶ ̄)o

关注 4 回答 3

时光 提出了问题 · 9月17日

php设计模式之适配器模式学习总结

一、什么是适配器模式

适配器模式是指通过适配器将原本不兼容的两个东西变得互相兼容

二、应用场景

当两个系统数据和行为都一样,但是接口不符合时,我们应该考虑使用适配器,适配器模式主要应用于希望复用现有的类,但是新的类又和原有的类不一致的情况其常见场景为:短信发送,聚合系统,支付系统

三、实例应用

1. 使用适配器(Adapter)实现短信发送实际案例
案例地址
Github地址: https://github.com/liuzhongsheng/SuperSms
实现目标:
多平台快速对接
多平台快速无缝切换
技术优势:
把每个短信平台看成一个适配器,新增短信平台时可快速添加,无需修改其他文件
运行流程:

image
以上为个人学习总结,如果有不对麻烦各位大佬多多指教,谢谢

关注 3 回答 1

时光 赞了回答 · 9月17日

解决讨论讨论短信发送多平台多通道的方案可行性

思路倒是可以,能想到抽象已经很好了,但是……

这不就应该用简单的适配器模式吗?

现在程序员都不学设计模式了么……

你依赖的第三方服务都应该抽象成更高一层的东西,不要侵入业务代码,否则一旦改起来就像你说的,会非常痛苦,尤其 PHP 还是个弱类型的。

关注 4 回答 3

时光 提出了问题 · 5月14日

关于数据库设计

现有:平台->品牌->门店->学员,你们创建学员数据库的时候是只存上一级门店的编号,还是把平台,品牌,门店全部存储进来

关注 4 回答 3

时光 赞了回答 · 5月14日

订单回调思路

收到支付的回调后, 不要直接去更新DB里订单
应该

1.校验请求来源是否安全可靠

如果你的回调接口被暴露了,可能会被恶意请求,随便来个请求就把你的订单数据修改了,造成的后果,你懂得.

2.根据订单编号 查询订单是否真实存在

3.检查订单状态 是否已支付

因为回调受网络影响,可能会重试多次,避免重复处理.

4. 如果订单存在,那么回调给你的支付成功的和数据库里的订单金额是否完全一致

注意 这是一个很容易被忽略的点
创建订单后,可以通过抓包工具,修改金额,然后进行支付,订单号没变,但实际支付的金额缺减少了.

有其他疑问,请在评论区交流.

关注 2 回答 1

时光 提出了问题 · 4月29日

订单回调思路

最近在写一个充值功能,由于不太好测试,各位大佬请看看我这种写法有啥明显逻辑上的bug么,谢谢各位大神

public $data;
public $where;
/**
 * aliba回调地址
 * {$url}/callback/aliba
 **/
public function alibaAction()
{
    $this->where = $_GET;
    $db          = $this->mysql();
    switch ($this->where['state']) {
        case 2:
            $this->data = [
                'callback_time'   => time(),
                'order_type'      => 1,
                'callback_result' => '充值中',
            ];
            $res = 'no';
            break;
        case 3:
            $this->data = [
                'callback_time' => time(),
                'status'        => 'success',
                'order_type'    => 3,
            ];
            $res = 'OK';
            break;
        case 4:
            $this->data = [
                'callback_time'   => time(),
                'status'          => 'issue_orders',
                'order_type'      => 2,
                'callback_result' => '待补单',
            ];
            $res = 'no';
            break;
    }
    $result = $db->action(function ($database) {
        $result = $database->update('cecharge_order', $this->data, [
            'order_number' => $this->where['orderid'],
            'deletetime'   => null,
            'order_type'   => 1,
            'status'       => 'wait',
        ]);
        if ($result->rowCount() <= 0) {
            dump_log('回调地址: ' . $_SERVER['REQUEST_URI'] . ' 状态: 订单更新失败', 'aliba_callback_error.txt');
            return false;
        }
        if ($this->where['state'] == 2) {
            $result = $database->delete('cecharge_info', [
                'order_number' => $this->where['orderid'],
            ]);
            if ($result->rowCount() <= 0) {
                dump_log('回调地址: ' . $_SERVER['REQUEST_URI'] . ' 状态: 订单记录删除失败', 'aliba_callback_error.txt');
                return false;
            }
        }
        dump_log('回调地址: ' . $_SERVER['REQUEST_URI'] . ' 状态: 成功', 'aliba_callback_success.txt');
        return false;
    });
    dump_log('回调地址: ' . $_SERVER['REQUEST_URI'] . '', 'aliba_callback.txt');
    return $res;
}

}
`

关注 2 回答 1

时光 赞了回答 · 4月24日

解决关于充值订单调用方式的疑惑

两种方式会有不同的交互,所以先问一下产品怎么选

一般第三方(支付宝、微信)的回调都不回很慢的,loading两秒也就完事了,只要你们服务响应可以第一种也是没问题的
如果真对自己服务没信心,且产品经理没意见的话第二种肯定更适用你们
其实我想说要是我做这个业务我两种方式都会用……

关注 2 回答 2

认证与成就

  • 获得 14 次点赞
  • 获得 33 枚徽章 获得 0 枚金徽章, 获得 6 枚银徽章, 获得 27 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-03-03
个人主页被 416 人浏览