前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有没有见过在 terminal 里用微信支付?

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

作者头像
sealyun
发布2022-12-07 14:01:24
9911
发布2022-12-07 14:01:24
举报
文章被收录于专栏:sealyunsealyun

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

使用场景:

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

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

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

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

下面开始教程:

| 使用微信 native 支付方式

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

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

代码语言:javascript
复制
ws.Route(ws.GET("/wechat/code-url").To(u.getCodeURL)
代码语言:javascript
复制
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) 钱, (省去了非核心逻辑)

支付请求实现:

代码语言:javascript
复制
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
}

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

代码语言:javascript
复制
weixin://wxpay/bizpayurl?pr=aIQrOYOzz

| 命令行客户端实现

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

代码语言:javascript
复制
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, "")
}

实现:

代码语言:javascript
复制
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
}

效果:

直接执行命令:

代码语言:javascript
复制
sealos recharge --user fanux --amount 1

终端就会输出二维码

手机微信扫一扫:

大功告成~

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 sealyun 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库备份服务
数据库备份服务(Database Backup Service,简称 DBS)是为用户提供连续数据保护、低成本的备份服务。数据库备份拥有一套完整的数据备份和数据恢复解决方案,具备实时增量备份以及快速的数据恢复能力,它可以为多种部署形态的数据库提供强有力的保护,包括企业 IDC 数据中心、其他云厂商数据库及腾讯公有云数据库。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档