快钱官方没有提供完整的SDK,仅有一些demo,要集成进现有go mod项目要花一点时间集成和测试,记录一下签名验证的关键点,支付方式是SDK网关支付和H5支付。 快钱会提供三个密钥文件: - 商户应用私钥文件,`pfx`格式,有密码,用于签名数据。 - ssl证书,`pfx`格式,有密码,用于`https`双向认证,快钱的证书测试下来会报错,所以用`openssl`提取了证书和密钥使用,下面有写。 - 快钱公钥证书,用于加/解密和验证数据。 场景是把以上证书内容`base64`编码成字符串存数据库,提供页面UI配置。 ## 1、支付下单数据签名 按照文档里面的字段顺序排序字段,拼接成查询字符串,用商户私钥加签。 ```go //SignData d...
 发布日期: 2024-08-09    分类: 后端    浏览量: 1864  
**知识点:** - udp 协议是无连接的协议,发送数据前不需要先和数据接收方建立连接。 - 每个 UDP socket 都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区。 - 当socket 接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的 UDP 丢弃数据报。 - UDP每个数据包之间有界限,每次接收都是一个完整的数据包,即使被下层的ip协议分片传输(udp包大于ip包的最大传输单元)。 - ip分片传输,某个片丢失,那么整个udp包都会被丢弃,上层应用不知道udp包被丢弃。 ## 单播 ...
 发布日期: 2024-07-31    分类: Go    浏览量: 1507  
> 原文 [Guide](https://github.com/golang/example/blob/master/slog-handler-guide/README.md) 标准库的 `log/slog` 包采用两部分设计。由 `Logger` 类型实现的“前端”收集经过结构化的日志信息(如消息、级别和属性),并将它们传递给“后端”,即 `Handler` 接口的实现。该软件包带有两个内置处理程序,通常应该足够了。但是您可能需要编写自己的处理程序,这并不总是那么简单。本指南随时为您提供帮助。 # 记录器(logger)及其处理程序(handler) 编写处理程序需要了解 `Logger` 和 `Handler` 类型如何协同工作。 每个记录器都包含一个处理程序。某...
 发布日期: 2024-07-17    分类: 后端    浏览量: 584  
使用Golang读取pfx格式证书里面的私钥,用RSA算法签名数据。 代码如下: ```go package main import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "encoding/base64" "log" "os" pkcs12 "software.sslmate.com/src/go-pkcs12" ) func main() { rsaSingFromPfxKey() } func rsaSingFromPfxKey() { data := "测试数据" // 读取pfx私钥 certPath := "./201...
 发布日期: 2024-04-30    分类: 后端    浏览量: 822  
## 语言变化 ### slice转数组 Go1.17在语言层面开始支持将slice转为指向数组的指针。 示例如下: ```go s := make([]byte, 2, 4) // 将s这个slice转为指向byte数组的指针s0 // 其中[0]byte里的0表示数组的长度,虽然长度为0,但值不等于nil s0 := (*[0]byte)(s) // s0 != nil fmt.Printf("%T") // 将s[1:]这个slice转为指向byte数组的指针s1 // s1指向的数组的长度为1 s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1] // 将s这个slice转为指向byte数组的指针s2 ...
 发布日期: 2023-03-04    分类: Go    浏览量: 851  
基于ZooKeeper和etcd实现服务的注册和发现功能的原理。 ## ZooKeeper ### 服务注册 利用临时节点的特性,创建一个服务的临时节点,写入服务信息数据,不断监视节点续期,当服务不可用时会话超时,临时节点会被删除。 ### 服务发现 服务发现是利用`watch`的特性,首先获取一遍需要的服务信息,保存在本地,然后给这个服务节点添加`watch`,监视变化和更新。 ## etcd ### 服务注册 服务注册是利用了etcd租约的特性。 首先创建一个定时的租约,比如10秒,20秒等。 然后带租约存储服务信息,不断的续期租约,当服务不可用时,租约过期,服务数据就会被删除,就相当于心跳保活了。 ### 服务发现 ...
 发布日期: 2023-01-17    分类: Go    浏览量: 738  
go的AES加密主要用`crypto/aes`和`crypto/cipher`两个库来实现。 AES加密模式又好多种,这里研究了6种模式:CBC、CFB、OFB、ECB、CTR、GCM模式。 一看到这么多模式,如果那里需要用到一下都不知道哪种好,这里大概总结一下。 如果数据通过非对称签名进行身份验证,则使用CBC,否则使用GCM。 最好的模式是GCM模式,GCM可以保证数据的保密性和完整性,其他模式只能保证保密性,不能保证完整性,具体可以去了解下AEAD。 GCM模式属于AEAD加密。 所以除了GCM模式之外其他模式最好是增加hmac哈希,用来验证数据完整性。 ECB模式不建议使用,因为这种模式不安全,go的内置库也没有去实现这种模式。 g...
 发布日期: 2022-11-11    分类: Go    浏览量: 1283  
Gin模型数据绑定验证器用的是go-playground/validator/v10。默认提示是英文内容,我们需要翻译成中文内容。 创建一个文件`validator.go`: ```go package utils import ( "github.com/gin-gonic/gin/binding" "github.com/go-playground/locales/en" "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zhtranslat...
 发布日期: 2021-12-08    分类: Go    浏览量: 1978  
go从1.11版本开始,实验性的加入了`WebAssembly`的支持。 ## `hellow world`程序 ```go package main import "fmt" func main() { fmt.Println("Hello, WebAssembly!") } ``` 设置go编译`WebAssembly`环境变量值,`GOOS=js`和`GOARCH=wasm`。 设置方法有两种: - 修改默认变量值,执行命令:`go env -w GOOS=js GOARCH=wasm` - 编译的时候指定值:`cd`到项目根目录,执行命令:`GOOS=js GOARCH=wasm go build -o main.wasm` ...
 发布日期: 2020-01-09    分类: Go    浏览量: 3918  
文章是翻译自Go官方博客的文章:http://blog.golang.org/errors-are-values随便翻译的一下,给自己参考,有需要的同学也可以参考参考,翻译的不好的地方或者难以理解的地方请参考原文。本人英语本身也不怎么样!所有有可能会有理解错误,用词不当,语言组织不当的地方,请见谅!该怎么样去处理错误(errors),是go程序员特别是刚学go的人之间的一个共同讨论点。讨论经常会随着下面这段程序出现的次数越来越多而变成抱怨。if err != nil {     return err }我们最近扫描了所有我们能够找到的开源项目,发现重复出现这段代码的次数是每页或者每两页只出现了一次,是不是比你想象中的要少很多。然而,如果你还是感觉必须到处写if err != nil,那一定是...
 发布日期: 2015-05-24    分类: Go    浏览量: 4199