有没有见过在 terminal 里用微信支付?

sealos 是一款云操作系统发行版,可以非常简单的管理 kubernetes 的生命周期,以及像使用 win11 一样使用云,最近写 sealos cloud 的支付模块,发现可以通过命令行做微信支付,非常有意思,现在和大家分享一下如何做到的。

file

输入一条命令,终端会输出二维码,直接微信扫一扫就可以付钱,这对于极客来说真是福音,对于一个藐视使用 GUI 的人来说岂不是很香?为了站在鄙视链顶端(API 鄙视 as code 鄙视 CLI 鄙视 GUI)岂能不支持这么酷的特性~

使用场景:

  • 想想你充爱奇艺会员的时候咔敲个命令,扫一扫搞定,女朋友在旁边不得亚麻呆住?

  • 想想现在很多屎山一样的前端页面,半天都找不到按钮在哪,一条命令充值岂不是很酸爽?

  • 想想你执行一个命令突然提示欠费蹦出个二维码让你充值执行

  • 想想数据库备份日志显示一个二维码,扫码继续备份

下面开始教程:

使用微信 native 支付方式

native 支付会向微信支付服务发送一条请求,微信支付会返回一个 codeurl, 直接把这个 codeurl 转化成二维码,即可用微信扫描支付。

我们自己服务端写一个获取 code-url 的接口:

ws.Route(ws.GET("/wechat/code-url").To(u.getCodeURL)
func (u Payment) getCodeURL(request *restful.Request, response *restful.Response) {
amount := request.QueryParameter("amount")
   user := request.QueryParameter("user")
   a, err := strconv.Atoi(amount)
   codeURL, err := WechatPay(int64(a), user, "", "", os.Getenv(CallbackURL))
   _, err = response.Write([]byte(codeURL))
}

这里获取谁(user)充值多少 (amout) 钱, (省去了非核心逻辑)

支付请求实现:

func WechatPay(amount int64, user, tradeNO, describe, callback string) (string, error) {
   mchID := os.Getenv(MchID)                                           // 商户号
   mchCertificateSerialNumber := os.Getenv(MchCertificateSerialNumber) // 商户证书序列号
   mchAPIv3Key := os.Getenv(MchAPIv3Key)                               // 商户APIv3密钥
   mchPrivateKey, err := utils.LoadPrivateKey(os.Getenv(WechatPrivateKey))

   ctx := context.Background()
   opts := []core.ClientOption{
      option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
   }
   client, err := core.NewClient(ctx, opts...)

   svc := native.NativeApiService{Client: client}
   resp, _, err := svc.Prepay(ctx,
      native.PrepayRequest{
         Appid:         core.String(os.Getenv(AppID)),
         Mchid:         core.String(os.Getenv(MchID)),
         Description:   core.String(describe),
         OutTradeNo:    core.String(tradeNO),
         TimeExpire:    core.Time(time.Now()),
         Attach:        core.String(user),
         NotifyUrl:     core.String(callback),
         GoodsTag:      core.String("sealos recharge"),
         SupportFapiao: core.Bool(false),
         Amount: &native.Amount{
            Currency: core.String("CNY"),
            Total:    core.Int64(amount),
         },
         Detail: &native.Detail{
            CostPrice: core.Int64(608800),
            GoodsDetail: []native.GoodsDetail{
               {
                  GoodsName:        core.String("sealos cloud recharge"),
                  MerchantGoodsId:  core.String("ABC"),
                  Quantity:         core.Int64(1),
                  UnitPrice:        core.Int64(828800),
                  WechatpayGoodsId: core.String("1001"),
               }},
         },
         SettleInfo: &native.SettleInfo{
            ProfitSharing: core.Bool(false),
         },
      },
   )

   return *resp.CodeUrl, nil
}

此接口会返回这样的一个字符串,也就是我们需要转化成二维码的:

weixin://wxpay/bizpayurl?pr=aIQrOYOzz

命令行客户端实现

以上实现了服务端代码,现在在命令行实现一下客户端代码即可,客户端无非是个 http 请求然后把返回结果用命令行二维码库转化一下即可。

RunE: func(cmd *cobra.Command, args []string) error {
   fmt.Printf("Use WeChat to scan the QR code below to recharge, please make sure the username and amount are correct\n")
   fmt.Printf("User: %s\n", config.User)
   fmt.Printf("Amount: %d\n", config.Amount)

return api.QRTerminalPay(config.User, config.Amount*100, "")
}

实现:

func QRTerminalPay(user string, amount int64, domain string) error {
if domain == "" {
      domain = "http://localhost:8071"
   }

   url := fmt.Sprintf("%s/payment/wechat/code-url?amount=%d&user=%s", domain, amount, user)
   resp, err := http.Get(url)
defer resp.Body.Close()
   b, err := io.ReadAll(resp.Body)

   qrterminal.Generate(string(b), qrterminal.L, os.Stdout)
return nil
}

效果:

直接执行命令:

sealos recharge --user fanux --amount 1

终端就会输出二维码

file

手机微信扫一扫:

file

大功告成~

完整代码在 sealos 中,有需要的可以去 copy~

sealos 以kubernetes为内核的云操作系统发行版,让云原生简单普及

laf 写代码像写博客一样简单,什么docker kubernetes统统不关心,我只关心写业务!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这取决于个人喜好。有些人喜欢使用 VSCode 的终端,并在其中使用 Vim 来编辑文本,因为它们可能觉得 Vim 更加高效。其他人可能更喜欢使用 VSCode 的内置编辑器,因为它可能更加直观。无论哪种方式都是可以的,关键是要找到一种方式能够让你的工作效率最大化。 ### 回答2: 在VSCode的Terminal中使用Vim的人其实是很值得称赞的。首先,使用Vim进行代码编辑需要掌握一定的技巧和快捷键,这表明该用户对Vim具有一定的熟练程度和经验。Vim是一个非常强大的文本编辑器,它不仅仅只能编辑代码,还可以用于编辑各种文本文件,包括配置文件和日志文件等。这意味着该用户对于终端环境和命令行操作也有一定的了解。而在VSCode的Terminal面使用Vim,可以让用户在一个集成开发环境中,既能够享受到VSCode丰富的插件和功能,又能够利用Vim的快捷键和操作方式进行高效的编辑工作,既提高了效率,又减少了学习成本。此外,Vim的配置文件.vimrc非常灵活,用户可以根据自己的需求进行定制,比如设置主题、字体、代码补全等等,这使得Vim在个性化方面具有很大的优势。总而言之,在VSCode的Terminal使用Vim的人体现了对编辑工具的选择和个人技能的充分发挥,值得我们学习和尊重。 ### 回答3: 在VSCode的终端中使用Vim的个人看法会因人而异。然而,可以从以下几个方面来看待这个问题。 首先,对于经常使用Vim的人来说,他们习惯于使用Vim作为他们的编辑器,无论是在终端中还是在其他环境中。他们喜欢Vim的简洁、高效和强大,因为Vim提供了丰富的编辑功能和快捷键操作,这使得他们能够更快速地编辑和处理代码。对于这些人来说,在VSCode的终端中使用Vim可能是一种习惯或喜好,他们能够更好地发挥他们的编辑技能。 其次,对于不熟悉Vim的人来说,他们可能会对在VSCode的终端中使用Vim感到困惑或陌生。因为Vim有一定的学习曲线,需要花费时间来熟悉它的编辑模式和命令。对于这些人来说,使用VSCode的默认编辑器可能更容易上手,因为它提供了更直观的用户界面和常的编辑功能。 最后,无论是喜欢还是不喜欢在VSCode的终端中使用Vim,我们都应该尊重其他人的选择和偏好。每个人都有不同的编辑风格和工作习惯,我们应该鼓励和支持他们使用他们最喜欢的工具。我们可以从其他人身上学习到更多关于不同编辑器和工作流程的知识,这将有助于我们提高自己的技能和效率。 总之,对于在VSCode的终端中使用Vim的人,我们应该尊重他们的选择,并理解他们对于Vim编辑器的喜好和使用需求。无论使用何种编辑器,最重要的是通过合适的工具来提高我们的工作效率和代码质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值