Cooperliu's Blogs


  • 首页

  • 归档

Abp-Auditing

发表于 2018-11-20

基于Abp企业级应用开发–审计

审计日志,是系统开发过程中,必不可少,它如实的反应程序实际运行状况。在实际开发过程中,我们把审计分为以下几种审计

  • 应用程序审计
    • Api接口调用审计日志
    • 异步消息发布订阅审计
  • 数据变更审计
  • 业务流程审计

应用程序审计 - Api接口调用审计日志

关注点 说明
调用用户标识 UserId
调用服务 ServiceName
调用服务方法 MethodName
调用参数 Parameters
调用时间 ExecutionTime
执行时长 ExecutionDuration
客户端IP ClientIpAddress
客户端名称 ClientName
调用端标识 UserAgent/BrowserInfo
异常信息 Exception
服务器Ip ServerIp
服务器名称 ServerName
服务器信息 ServerVersion

应用程序审计 - 异步消息发布订阅审计

关注点 字段
消息类型 Publish/Consume
消息Id MessageId
发布者名称 MachineName
消费队列 Queue
审计时间 AuditedTime
消息处理时间 HandledTime
消息体 MessageBody

数据变更审计

对于数据变更敏感的业务数据,如价格,数量等字段,进行数据变更(Update,Delete)记录,记录前后变更值。

业务流程审计

在关键业务节点,触发业务事件,业务流程审计订阅业务变更事件,审计业务流程变更。

Domain-Driven-Design-In-Abp-Framework

发表于 2018-05-31

DDD领域服务Abp框架中应用

1.领域服务(Domain Services)

领域服务

负责表达领域业务操作与规则,一个良好的领域服务设计,具备以下三个特点

  1. 领域操作与规则涉及到的领域概念既不属于实体(Entity)的一部分,也不属于值对象的一部分。

  2. The interface is defined in terms of other elements of the domain model 。

  3. 领域操作是无状态。

    ​ ———- Eric Evans

领域服务处理领域对象,如实体(Entity)或者值类型,并不像应用层服务处理DTO。

领域服务可以被应用层服务或者其他领域服务调用,而不能直接在展现层使用。展现层可以调用应用层。

微信提现到银行卡开发过程

发表于 2018-05-29

微信支付 企业付款到银行卡开发过程

1. 业务背景

微信支付付款到指定银行卡。商户可以将商户号余额付款至指定的收款银行账户。通过指定收款银行账户户名、卡号,以及收款银行信息即可实现付款。

注意事项:

  1. 企业付款至银行卡只支持新资金流类型账户

  2. 目前企业付款到银行卡支持17家银行,更多银行逐步开放中

  3. 付款到账实效为1-3日,最快次日到账

  4. 每笔按付款金额收取手续费,按金额0.1%收取,最低1元,最高25元,

    如果商户开通了运营账户,手续费和付款的金额都从运营账户出。如果没有开通,则都从基本户出。

  5. 每个商户号每天可以出款100万,单商户给同一银行卡付款每天限额5万

  6. 发票:在账户中心-发票信息页面申请开票的商户会按月收到发票(已申请的无需重复申请)。

    企业付款到银行卡发票与交易手续费发票为拆分单独开具。

2. 支持银行

银行名称 银行Id
工商银行 1002
农业银行 1005
中国银行 1026
建设银行 1003
招商银行 1001
邮储银行 1066
交通银行 1020
浦发银行 1004
民生银行 1006
兴业银行 1009
平安银行 1010
中信银行 1021
华夏银行 1025
广发银行 1027
光大银行 1022
北京银行 1032
宁波银行 1056

3. 微信接口文档

  • 企业付款到银行卡api
  • 获取RSA加密公钥api
  • 银行卡编号列表api

4. 企业付款到银行卡API加密

在付款到指定银行卡的接口中,“收款方银行卡号” 与 “收款方用户名” 必须使用微信请求回来的RSA公钥加密,密文提交数据到接口,中间涉及到RSA加密问题

  1. 获取微信RSA加密公钥

    请求得到报文:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <xml>
    <return_code><![CDATA[SUCCESS]]></return_code>
    <return_msg><![CDATA[OK]]></return_msg>
    <result_code><![CDATA[SUCCESS]]></result_code>
    <mch_id><![CDATA[微信商户号]]></mch_id>
    <pub_key><![CDATA[-----BEGIN RSA PUBLIC KEY-----
    MIIBCgKCAQEAxJcg631t+6ev+K5fWWX+S96OIrCiR3cDCsn0izbmcc7hTUwOKP50
    oaFCFzDEfh1Vkt9fEoyvyqbwbJFUJlTWlQrTYi2DdzOSyYA5XR7PiCtCJO+zeJ2x
    6lHeW+xS5w+PGR3FGWbqdubtFOk5WdRKWBW0Mk2ghfThn9n8QI9aMUurkr/XFoEx
    rzeJNWbPrrl69CgdaoCq4p/CW2z8A/oXuEdBIsP75e7sDBFH+SfvY5dDZptIslah
    rOL544CGctLRy4tsqhesXBlz+Rt/crBmfKPbbxNSIZlp9wNRuqK+cBuHBkBFaNYm
    R2NdZOPbymjwTPWLiNjqiCa5d/ff4RX8XwIDAQAB
    -----END RSA PUBLIC KEY-----
    ]]></pub_key>
    </xml>

    得到的公钥为PKcs#1的格式,在使用对接过程中,java使用PKcs#8 格式公钥,Csharp同样也可以使用PKcs#8格式的公钥进行加密。注意在:用标准的RSA加密库对敏感信息进行加密,选择RSA_PKCS1_OAEP_PADDING填充模式 (eg:Java的填充方式要选 “ RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING”) ,而在Csharp中没有对应的填充方式,进而造成接口返回“解密真实姓名或银行卡号出错”。

  2. 转换RSA公钥格式PKcs#1 到Pkcs#8方法

    有几点原因会造成转换失败:

    • 请求得到的公钥不能改动格式,不能移除/n /r 等换行符
    • 在Windows保存.pem 格式,会保存ANSI格式(应为UFT-8无BOM格式)

    使用CentOS转换如下:

    RsaPkcs1ConvertToPkcs8

  3. 使用CShap代码使用PKcs#8格式公钥加密字段

    • 引用 Nuget包:Install-Package BouncyCastle -Version 1.8.2

    • 实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static string RsaEncryptWithPkcs8PublicKey(string publicKey,
string content,
string inputCharset = "UTF-8")
{
var contentBytes = Encoding.GetEncoding(inputCharset).GetBytes(content);
var publicKeyParameters = ConvertFromPublicKey(publicKey);
var key = DotNetUtilities.GetRsaPublicKey(publicKeyParameters);
var cipher = CipherUtilities.GetCipher("RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING");
cipher.Init(true, key);
var resultBytes = cipher.DoFinal(contentBytes);
return Convert.ToBase64String(resultBytes);
}

5. 参考链接

  • C#使用私钥进行RSA加密(https://blog.csdn.net/theodore26/article/details/50331049)
  • .netcore支付宝支付,微信支付(http://www.cnblogs.com/AsprosL/p/7661480.html)

6. 赞助

wechat_reward_20180530104425

Abp Architecture Learning

发表于 2018-05-18

Dotnet开源实战指南

什么是Abp?

Event Driven Architecture 事件驱动架构

Service-oriented architecture 面向服务架构

业务服务结构图

服务部署网络拓扑图

开发模式转变

  • 前后端分离,前端SPA化,后端服务化,独立部署
  • Git分支策略
  • 监控工具,日志分析工具

DevOps实践

  • TFS 敏捷开发管理
  • 持续集成
  • 发布过程管理

日志分析

  • 日志记录
  • 日志收集
  • 日志查询分析

分布式消息管理

  • 分布式消息幂等
  • 分布式相同消息执行顺序
  • 分布式不同消息执行顺序

Abp 业务异常及业务异常处理

发表于 2017-08-30

基于Abp企业级应用开发–异常处理

在使用Abp框架中,经常会遇到业务异常及系统异常处理,今天结合实际开发过程中,介绍一下如何在Abp框架中定义业务异常、处理业务异常及处理系统异常。

Abp常用异常

  • AbpException
  • UserFriendlyException

    UserFriendlyException 是一类特殊的异常,可以直接抛给用户展示系统异常信息,给用户提示警告。

  • AbpAuthorizationException
  • AbpDbConcurrencyException
  • EntityNotFoundException
  • AbpRemoteCallException

Abp业务异常定义及异常处理

在设计业务异常时,通常情况下是,用户操作违背了业务规范,系统提示业务异常。当然在Abp框架中,我们可以使用UserFriendlyException提示给用户。

但是在使用UserFriendlyException异常时,我们发现其命名空间为Abp.UI的命名空间下,显而易见,UserFriendlyException应用的场景为应用服务中,而我们的业务异常通常发生在DomainService、AggregateRoot、BusinessService、Entity等领域服务中,与设计相悖。

因此,我们设计业务异常时,需要考虑

  1. 可以转化为UserFriendlyException异常,提示给用户
  2. 自定义错误码
  3. 自定义错误消息

我们定义系统业务异常 ProjectBusinessException

using System;
using Abp;
using Abp.Logging;

namespace Company.Project
{
    public class ProjectBusinessException : AbpException, IHasErrorCode, IHasLogSeverity
    {
        public LogSeverity Severity { get; set; } = LogSeverity.Warn;

        public int Code { get; set; }


        public ProjectBusinessException(ErrorCode errorCode)
            : base(errorCode.ToString())
        {
            Code = (int)errorCode;
        }

        public ProjectBusinessException(ErrorCode errorCode, string message)
            : base(message)
        {
            Code = (int)errorCode;
        }

        public ProjectBusinessException(ErrorCode errorCode, Exception innerException)
            : base(errorCode.ToString(), innerException)
        {
            Code = (int)errorCode;
        }

        public ProjectBusinessException(ErrorCode errorCode, string message, Exception innerException)
            : base(message, innerException)
        {
            Code = (int)errorCode;
        }

    }
}

在定义业务异常错误发现,枚举非常适合错误码的定义:枚举名称可以详细描述业务异常,枚举值可以定义为错误码。

`   using System.ComponentModel.DataAnnotations;

    namespace Company.Project
    {
        public enum ErrorCode
        {

            #region 通用错误异常 0-99

            /// <summary>
            /// 未知异常
            /// </summary>
            [Display(Name = "未知异常")]
            UnknownException = 0,

            /// <summary>
            /// 存在重复名称
            /// </summary>
            [Display(Name = "指定的对象存在重复")]
            ExistDuplicateItem = 1,

            /// <summary>
            /// 指定对象未激活
            /// </summary>
            [Display(Name = "指定对象未激活")]
            ObjectIsNotActive = 2,

            #endregion


        }
    }

`

Hello World

发表于 2017-08-21

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Cooperliu

Cooperliu

6 日志
4 标签
© 2018 Cooperliu
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.2