乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

个人开发者全球收款方案之--Paddle支付

发表于 2023-04-10

前言

本文仅讨论WEB端(包括H5、浏览器扩展)售卖虚拟商品(激活码),且支持全程自动化的收款方案。

介绍

“Paddle”成立于2012年,是英国一家专门提供支付及订阅管理服务的公司。支持全球收款,支持个人开发者,且支持上传自定义的license,适合激活码软件开发者。

官网:https://www.paddle.com
沙盒测试环境:https://sandbox-vendors.paddle.com/

优缺点

优点:全球收款(支持PayPal、Apple Pay、Google Pay、iDEAL)、支持个人、独立沙盒测试环境、软件内部完成支付

缺点:非实时到账、提现有门槛(全球收款通病)

价格费用

每笔交易:5% + 50¢

(注意:PayPal或Payoneer提现费用另算)

官方提现说明:https://www.paddle.com/help/manage/get-paid/when-and-how-do-i-get-paid

对接过程

流程:(开发者)创建商品、上传激活码[非必须]–>(用户)支付–>(平台)发送激活码到用户邮箱–>(用户)使用激活码。

官方帮助文档:https://www.paddle.com/help

第一步:创建商品

在Paddle后台新建商品,操作路径:Catalog–Products

个人开发者全球收款方案实践之--Paddle支付

第二步:上传Licenses(激活码)

文件为.txt格式,命名随意,每行就是一个激活码。激活码在后台可随时上传补充,自带排重功能。

个人开发者全球收款方案实践之--Paddle支付

此外,还支持Coupons(折扣券),最多可打折到免费,方便测试。

第三步:用户支付

个人开发者全球收款方案实践之--Paddle支付

第四步:Paddle发送激活码到用户邮箱

每完成一笔支付,用户就会收到一个带激活码的邮件。

个人开发者全球收款方案实践之--Paddle支付

ps. Paddle后台支持几个主要的事件提醒,比如订阅、下单、支付等等事件。

第四步:用户使用激活码

(略)

核心代码

1
2
3
4
5
6
7
8
//第一步:引入paddle.js
<script src="https://cdn.paddle.com/paddle/paddle.js"></script>

//第二步:初始化(vendor 在Developer Tools--Authentication里)
Paddle.Setup({ vendor: 3498x });

//第三步:开始支付(product_id在商品列表页里)
Paddle.Checkout.open({ product: 77447x });

如果是测试环境,可以加个判断:

1
2
3
if (location.hostname === 'localhost') {
Paddle.Environment.set('sandbox');
}

踩坑

在测试环境的联调过程相当顺利,一切都是理想的样子,可到了生产环境却始终报错“Page Not Found. Sorry, the page you were looking for could not be found.”。查找资料后发现需要域名认证,(后台设置Checkout–Request Domain Approval)。

提交域名苦等两周后,收到驳回邮件:

个人开发者全球收款方案实践之--Paddle支付

因为在等待审核期间,自己对接的另外一些支付方式都已经上线,已经有替代品,遂不再折腾Paddle。

总结

Paddle算是个不错的全球收款方案,功能丰富,无需大爬梯,暂未看到有无故封号的案例。如果你愿意花时间去审核域名,可以考虑。

其它方案

《个人开发者收款方案实践之–面包多》

本文转载自: 前端邓浩

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

个人开发者收款方案汇总

发表于 2023-04-10

前言

网站或者APP收款问题始终是大部分个人开发者的一个痛点, 目前支付宝和微信收款业务只面向企业和个体户开放, 个人无法申请

在产品盈利状况不明的情况下, 如果特地为此去注册一家公司, 那么前期的维护成本太高了,并不推荐

此时 我们可以考虑先接入第三方的收款平台, 等产品步入稳定盈利阶段后, 再考虑注册公司或者个体户

目前市面上有许多供个人申请的收款平台, 这里做了个汇总, 供大家查阅

国内首款方案

  1. 虎皮椒

    官网: 点击进入

    image-20230412115844779

  2. PayJs

    官网: 点击进入

    image-20230412111136593

  3. XorPay

    官网: 点击进入

    image-20230412105948282

  4. 微豆付

    官网: 点击进入

    image-20230412110538451

  5. 叮咚支付

    官网: 点击进入

    image-20230412110437720

  6. 云免签

    官网: 点击进入

    image-20230412110957697

  7. V免签

    开源项目, 采用app监控+服务端回调的方式

    Github: 点击进入

    演示地址:点击进入
    测试支付地址:点击进入

    V免签软件工具网盘:点击进入

    备用网盘:vmianqian.uupan.net 登录密码:66666

    image-20230412112520373

  8. 面包多

    官网: 点击进入

    image-20230412122804341

  9. 爱发电

    官网: 点击进入

    image-20230412140048731

  10. YunGouOS

    官网: 点击进入

    image-20230412120842858

  11. h5zhifu

    官网: 点击进入

    image-20230412122647173

全球首款方案

  1. Paddle支付

    官网:点击进入
    沙盒测试环境:点击进入

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

SpringBoot报错lateinit property mapper has not been initialized

发表于 2023-04-09

问题

SpringBoot工程突然莫名其妙报错:lateinit property mapper has not been initialized

最后发现是事务注解@Transactional导致的

由于kotlin方法访问权限默认为final, 而事务注解使用的是反射, 两者冲突

解决方案

  1. 第一种 去除事务注解(不推荐)

  2. 第二种 给报错的方法添加open权限, 如下:

    1
    2
    3
    4
    5
    6
    7
    8
    open fun userLogin(
    userAccount: String,
    userPassword: String,
    request: HttpServletRequest?,
    response: HttpServletResponse?
    ): String {
    return ""
    }

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

SpringBoot中的Fliter和Interceptor

发表于 2023-04-08

两者区别

两者区别:

  • Filter属于servlet组件, interceptor属于Spring内置组件
  • 多个Filter存在时按照文件的排列顺序依次执行
  • Filter会拦截所有的资源而interceptor只拦截Spring环境中的资源
  • Filter的执行流程在interceptor之前, 也就是先执行过滤器再执行拦截器

执行流程图如下:

image-20230410143454632

Filter实现

  1. 第一步 定义过滤器, 实现servlet包下的Filter接口, 并重写其所有方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @WebFilter(urlPatterns = ["/*"])
    class LoginFilter:Filter {
    /**
    * 请求拦截
    */
    override fun doFilter(
    request: ServletRequest?,
    response: ServletResponse?,
    chain: FilterChain?
    ) {


    //放行
    chain?.doFilter(request,response)
    }

    /**
    * 服务启动时调用 只调用一次
    */
    override fun init(filterConfig: FilterConfig?) {
    super.init(filterConfig)

    }

    /**
    * 服务关闭时调用
    */
    override fun destroy() {
    super.destroy()
    }
    }
  1. 第二步 项目启动入口类上添加@ServletComponentScan开启servlet组件支持

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @ServletComponentScan /
    @SpringBootApplication
    open class MainApplication {
    companion object {
    @JvmStatic
    fun main(args: Array<String>) {

    SpringApplication.run(MainApplication::class.java, *args)
    }
    }


    }

Interceptor实现

Cookie

  1. 第一步 定义拦截器, 实现HandlerInterceptor接口 并重写其所有方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    @Component
    class LoginCheckInterceptor :HandlerInterceptor {

    /**
    * 在目标方法执行前执行 返回true放行 否则不放行
    */
    override fun preHandle(
    request: HttpServletRequest,
    response: HttpServletResponse,
    handler: Any
    ): Boolean {
    return true
    }
    /**
    * 在目标方法执行后执行
    */
    override fun postHandle(
    request: HttpServletRequest,
    response: HttpServletResponse,
    handler: Any,
    modelAndView: ModelAndView?
    ) {
    }
    /**
    * 最后执行
    */
    override fun afterCompletion(
    request: HttpServletRequest,
    response: HttpServletResponse,
    handler: Any,
    ex: Exception?
    ) {
    }
    }
  1. 第二步 创建配置类 并将刚定义的拦截器添加进配置类中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Configuration
    open class WebConfig : WebMvcConfigurer {

    @Autowired
    lateinit var loginCheckInterceptor: LoginCheckInterceptor

    override fun addInterceptors(registry: InterceptorRegistry) {
    registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**") //拦截所有路径
    }
    }

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

关于几种Web会话跟踪技术的对比分析

发表于 2023-04-08

前言

正常情况下, 当浏览器打开访问某个网站时一个新会话便创建了, 当浏览器关闭, 那该会话便结束

会话跟踪技术: 检查多个或多次接口请求是否属于同一个会话的技术, 简而言之就是判断这些请求是否来自同一个用户的技术

常见的会话跟踪技术有:

  • Cookie
  • Session
  • JWT

Cookie

优势:

  • HTTP协议中支持的技术
  • 全程自动跟踪

劣势:

  • 移动端APP无法使用Cookie
  • 不支持跨域
  • 不安全 用户可以手动禁用Cookie
  • 前端收到的Cookie数据为明文 信息不安全

Session

优势:

  • HTTP协议中支持的技术
  • 信息相对安全 前端收到的Cookie数据为密文, 真实数据存在后端
  • 全程自动跟踪

劣势:

  • 移动端APP无法使用Session
  • 不支持跨域
  • 由于Session是基于Cookie实现的, 所以用户同样可以手动禁用Cookie使得Session无法使用
  • 由于数据存在后端 加大了后端了存储压力
  • 服务器集群环境下无法共享Session

JWT

全称json web token,

优势:

  • 支持PC端和移动端
  • 解决集群环境下的认证问题
  • 减轻了服务端的存储压力
  • 不存在跨域问题
  • 数据为密文 防篡改 安全性高

劣势:

  • 需要手动存储token到本地

总结

Cookie和Session属于传统的会话跟踪技术, 如果只做Web端, 可以采用

如果是面对多平台的开发, 推荐目前主流的jwt技术

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

SpringBoot工程根据实体类自动创建数据库表

发表于 2023-04-07

实现步骤

  1. 集成jpa依赖包

    1
    implementation "org.springframework.boot:spring-boot-starter-data-jpa"
  2. 给实体类添加注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Entity
    @Table(name = "user")
    data class User(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long? = null,
    @Column(name = "nickName",nullable = false)
    val nickName: String? = null,
    @Transient //表中不生成对应字段
    val qqAccount: String? = null,
    val avatar: String? = null,
    val realName: String? = null,
    val password: String? = null,
    )
  3. 在application.yml配置文件中对jpa进行相关配置

    1
    2
    3
    4
    5
    spring:
    jpa:
    hibernate:
    ddl-auto: update # 当实体类发生改变时更新表
    show-sql: true

    ddl-auto枚举参数介绍:

    • create:每次运行程序时,都会重新创建表,故而数据会丢失
    • create-drop:每次运行程序时会先创建表结构,然后程序结束时清空表
    • update:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
    • validate:运行程序会校验数据于数据库的字段类型是否相同,字段不同会报错
    • none:禁用DDL处理, 此为默认模式
  4. 启动工程

    配置完后, 每次启动工程则会检查相关实体类, 如有新增实体类则自动创建表

    需要注意的是: 只能自动创建表和新增字段 删除字段和修改字段类型需要手动处理

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

SpringBoot实现自动生成接口文档

发表于 2023-04-06

前言

需要使用knife4j这个框架来实现我们的需求, 这里我使用的是Gradle构建环境, 具体步骤如下

实现步骤

  1. 添加依赖

    1
    implementation "com.github.xiaoymin:knife4j-spring-boot-starter:2.0.9"
  2. 定义配置类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    @Configuration
    @EnableSwagger2WebMvc
    open class SwaggerConfiguration : WebMvcConfigurer{
    override fun addResourceHandlers(registry: ResourceHandlerRegistry?) {}

    // 创建Docket存入容器,Docket代表一个接口文档
    @Bean
    open fun webApiConfig(): Docket? {
    return Docket(DocumentationType.SWAGGER_2) // 创建接口文档的具体信息
    .apiInfo(webApiInfo()) // 创建选择器,控制哪些接口被加入文档
    .select() // 指定@ApiOperation标注的接口被加入文档
    .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation::class.java))
    .build()
    }

    // 创建接口文档的具体信息,会显示在接口文档页面中
    private fun webApiInfo(): ApiInfo? {
    return ApiInfoBuilder() //
    .title("文档标题") //
    .description("文档描述")
    .version("1.0")// 版本
    .contact(Contact("联系人信息", "http://baidu.com", "baidu@qq.com")) // 版权
    .license("版权地址")
    .licenseUrl("http://www.baidu.com")
    .build()
    }
    }
  3. 给Controller添加文档注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @Api(tags = ["文件管理"])
    @ApiSupport(author = "开发者名称", order = 1)
    @CrossOrigin
    @RestController
    @RequestMapping("/file")
    class FileController {


    @Autowired
    lateinit var service: FileService
    @ApiOperation(value = "文件上传", notes = "这是注释")
    @PostMapping(value = ["/upload"])
    fun uploadFile(
    @RequestParam(value = "file", required = true) file: MultipartFile,
    ): BaseEntity<String> {
    return try {
    val url = service.uploadFile(file)
    BaseEntity(data = url)
    } catch (e: Exception) {
    BaseEntity(code = 505, msg = e.message.orEmpty(), data = "")
    }

    }

    }
  4. 在application.yml配置文件中对knife4j进行相关配置

    1
    2
    3
    4
    5
    6
    7
    knife4j:
    enable: true #开启文档自动生成功能
    production: false # 生产版本时 无权限访问
    basic: # 设置访问密码
    enable: false
    username: abc
    password: 123
  5. 运行工程, 查看文档

    浏览器输入http://ip:端口/doc.html查看自动生成的文档, 如下:

    image-20230410114636451

文档参考

官方文档: 点击进入

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

SSH链接失败提示REMOTE HOST IDENTIFICATION HAS CHANGED

发表于 2023-04-05

前言

昨天在使用Git推送代码的时候, 莫名其妙突然报错,提示:

1
2
3
4
5
6
7
8
9
10
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMc
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:3

解决方案

  1. 第一种 直接删除.ssh目录下的known_hosts文件

  2. 第二种 修改.ssh目录下的config配置文件, 添加如下配置:

    1
    2
    StrictHostKeyChecking no  # 不进行主机检查
    UserKnownHostsFile /dev/null #不保存在known_hosts中
  3. 第三种 只删除known_hosts文件中对应ip的相关rsa信息

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用Python语言进行硬件开发

发表于 2023-04-03

前言

cool-admin V6.0开始接入了物联网开发,默认集成了MQTT服务。在这个万物互联的时代,我们多掌握一种技能就多一分优势。

Show

选型

目前市面上大多数开发物联网的都是c系列的语言,但是随着硬件性能的提升其实我们对编程语言的选择已经慢慢趋向于考虑好用、方便、简单,而不是性能。

对于没接触过c语言的开发者,他们大部分习惯用java、php、go、python等比较上层的语言,学c的话花的时间可能比较久。因此综合cool的粉丝和其他考虑,我们选用 MicroPython来作为我们开发物联网的语言,使用起来和python几乎无差别。

python做为一门工具语言,是很多开发着需要去掌握的!!!

MicroPython

MicroPython是一种基于Python的精简版嵌入式操作系统,它能够在小型的嵌入式系统中运行Python解释器。MicroPython支持各种硬件平台,包括单片机,Wi-Fi模块,以及其他各种嵌入式设备。

MicroPython被设计成轻量级的、高效的,并且可以非常容易地与各种传感器、执行器和其他外部硬件设备进行通信。它支持许多标准Python库,同时还具有一些专门为嵌入式设备设计的库和工具。

MicroPython的目标是提供一个方便的Python环境,可以让开发人员在嵌入式设备上轻松地编写代码,并且可以直接在设备上运行代码,而不需要在外部计算机上编译或调试代码。

MicroPython可以通过串口或者Wi-Fi连接进行编程和调试,还可以使用MicroPython的交互式REPL环境(Read-Eval-Print-Loop)来进行快速原型开发。同时,MicroPython还支持Python 3语法,并且具有自动垃圾回收功能,这使得编写代码更加简单和高效。

硬件设备

对比了市面上很多种设备,最终选用Esp32,来作为我们的硬件设备,它有以下特点(看不懂的同学不要着急,大概了解就行):

  1. 高性能:ESP32拥有两个Tensilica LX6内核,主频高达240MHz,能够提供高性能的计算能力,可以处理复杂的算法和任务。
  2. 低功耗:ESP32的功耗非常低,它具有多种节能模式,可以延长电池寿命,从而使其成为无线传感器、物联网设备和移动设备的理想选择。
  3. 内置Wi-Fi和蓝牙:ESP32具有内置的Wi-Fi和蓝牙模块,支持多种无线协议和标准,可以实现快速、稳定的网络通信,从而扩展了应用场景。
  4. 丰富的外设:ESP32集成了多个外设,包括多个通用输入输出口、ADC、DAC、PWM、SPI、I2C、UART、定时器等,可以满足不同应用的需求。
  5. 安全性:ESP32支持多种安全特性,包括加密算法、安全引导和安全存储,可以保证系统的安全性。
  6. 易于开发:ESP32可以使用Arduino、MicroPython、JavaScript等多种编程语言进行开发,同时还有丰富的开发工具和社区支持,可以方便快速地进行原型设计和开发。

总的来说,ESP32硬件具有高性能、低功耗、内置无线通信、丰富的外设、安全性高和易于开发等优点,可以满足各种物联网和嵌入式应用的需求。

Eps32

资源

  • 一个模拟开发板的网站,支持Esp32和MicroPython:https://wokwi.com/open in new window
  • 一个入门学习错的教程:https://doc.itprojects.cn/0006.zhishi.esp32/02.doc/index.html#/open in new window
  • 制作定制电路板:https://www.jlc.com/open in new window

附加

除了MicroPython之外, 目前还有pikapython

具体文档: 点击进入

本文转载自: COOL-JS

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

AI和硬件开发

发表于 2023-04-02

前言

国内有不少已经接入ChatGPT相关API并做成了独立Web形式的网站, 比如

https://talkai.cc/

image-20230404145647933

想尝鲜的可以体验一下

AI和硬件

AI归根结底还是一个软件, 未来必须结合硬件才能大展拳脚, 更进一步

所以硬件开发在接下来的时间里会有一个迅速的进步

以前我们所谓的智能家居, 其实还是相对简陋了一些, 只不过是从原来的机械控制转变成了数字控制, 但实际操作还是离不开人

未来有AI的参与, 那智能家居才算是真正意义上的智能, AI就是生活管家

硬件开发

关于硬件开发 涉及的技术点不少 比如单片机知识 汇编语言 C语言等等

在20年的时候有幸录过一套汇编语言相关的视频, 该套视频全部上传至B站供大家免费观看

《程序员进阶之三大架构汇编语言入门视频教程-胖薯出品》

  • 录制时间 2020年12月14日
  • B站:点击跳转
  • 网易云课堂: 点击跳转

更多教程可前往 有瓣杂货铺

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…789…48

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

479 日志
139 标签
RSS
© 2024 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%