【背景】
Google billing 账单系统登录后可查看到当前项目所关联的账单报告及明细,但是某客户领导由于网络的问题,并不能随时登录BIlling中查看账单,并提出希望在公司常用的办公软件飞书中收到billing的使用情况。

【设计】
根据客户需求,在通过了解Google billing的官方文档及相关的接口情况后 ,我们设计了如下的数据流程图及本次需求开发的架构图:

【实操】
在billing中创建Budget Alert并关联到Pub/Sub主题中,通过Pub/Sub的订阅功能将billing的账单信息通过Cluod function推送至第三方

1.创建Pub/sub主题

2.创建Budget Alert,创建时需注意以下四点:
a.Budget alert名
b.预算额度
c.预算报警的阙值
d.勾选Pub/Sub选项并选择创建的Pub/Sub



创建后可在控制台检查


3.添加Pub/sub触发器,并将开发的代码copy上去,修改入口函数,然后点击部署函数即可

【代码】


// Package p contains a Pub/Sub Cloud Function.
package pimport ("bytes""crypto/hmac""crypto/sha256""encoding/base64""encoding/json""errors""fmt""golang.org/x/net/context""log""net/http""sync""time"
)var msgLocker sync.Mutex
var (contentType = "Content-Type:application/json"webHooker   = ""//这里填飞书的地址secret      = "" // 这里填签名,可不填
)
//定义接受信息的类型
type PubSubMessage struct {Data []byte `json:"data"`BudgetIdstring `json:"budgetId"`BillingAccountIdstring `json:"billingAccountId"`
}
//定义信息内容
type Message struct {BudgetDisplayName string `json:"budget_display_name"`CostAmount             float64 `json:"costAmount"`CostIntervalStart      string `json:"costIntervalStart"`BudgetAmountTypestring `json:"budget_amount_type"`BudgetAmount           float64 `json:"budgetAmount"`AlertThresholdExceededfloat64`json:"alertThresholdExceeded"`ForecastThresholdExceededfloat64`json:"forecast_threshold_exceeded"`CurrencyCodestring `json:"currency_code"`
}//发送验证并消息的Function
func SendMsg(ctx context.Context, m PubSubMessage) error {fmt.Println(m)msgLocker.Lock()defer msgLocker.Unlock()var messageMessageerrJson:= json.Unmarshal(m.Data, &message)if errJson!= nil {fmt.Println("接收信息错误",errJson,string(m.Data))return errors.New("接收信息错误")}content := fmt.Sprintf("账单ID:%v,"+"\n"+"预算ID:%v,"+"\n"+"使用的费用:%v," +"\n"+"预算开始时间:%v," +"\n"+"预算额度:%v" +"\n",m.BillingAccountId,m.BudgetId,message.CostAmount,message.CostIntervalStart,message.BudgetAmount)var data = make(map[string]interface{})data["msg_type"] = "text"data["content"] = map[string]string{"text":content,}timestamp := time.Now().Unix()if secret!= "" {sign, _ := GenSign(timestamp, secret)data["sign"] =sign}data["timestamp"] =timestampd, _ := json.Marshal(data)_, err := http.Post(webHooker, contentType, bytes.NewBuffer(d))if err != nil {log.Println("消息发送失败,HTTP connection error!")return errors.New("HTTPconnection error!")}returnnil
}
func GenSign(timestamp int64, secret string) (string, error) {stringToSign := fmt.Sprintf("%v", timestamp)+ "\n" + secretvar data []byteh := hmac.New(sha256.New, []byte(stringToSign))_, err :=h.Write(data)if err != nil {return "", err}signature := base64.StdEncoding.EncodeToString(h.Sum(nil))return signature, nil
}

【Google Cloud】账单告警信息推送至第三方相关推荐

  1. 物联网设备数据流转之告警信息推送:TDengine-alert

    背景 前面关于 TDengine 的使用,我们只涉及到 Server 端与 Client 端,除此之外,官方还有一个报警模块,用以根据用户定义的规则实现近实时的报警监测. 从开始到现在,我们一直在喊口 ...

  2. 微信小程序 调取云函数 信息推送失败response out of time limit or subscription is canceled hint的具体解决方法

    微信小程序 调云函数 信息推送失败,提示errcode":45015,"errmsg":"response out of time limit or subsc ...

  3. php 微信客服信息推送失败 微信重复推送客服消息 40001 45047

    1 /*** 2 * 微信客服发送信息 3 * 微信客服信息推送失败 微信重复推送客服消息 40001 45047 4 * 递归提交到微信 直到提交成功 5 * @param $openid 6 * ...

  4. 钉钉 php 推送,微信模板推送,钉钉信息推送

    上午的时候看到有朋友需要微信推送,正好我也需要,之前一直用 Server 酱的,但是最近用不了,想找一个替代品,一开始准备选择钉钉,除了打卡,我很少使用钉钉,邮件提醒是备用方案,其实和 Server ...

  5. 微信开发3之php模板信息推送

    模板信息推送:需要在后台开通了模板消息推送接口 PHP代码如下: <?php $appid="wxxxxxxxxxxxxxxxxxx"; //填写微信后台的appid $ap ...

  6. 微信公众号信息推送实现业务解耦

    序 最近第三方服务需要增加微信模板信息推送能力,要与业务系统解耦.微服务架构的springCloud下第三方服务增加能力. 一.技术选型 看了下微信公众号的信息推送开发文档,发现不难,就是一个个接口对 ...

  7. bmob云服务器信息推送,FAQ-Bmob后端云

    Q: Bmob 平台是做什么的? A: Bmob 是多租户无模式的移动应用云服务,它可以让 android/IOS/WP 等移动开 发者无需掌握任何一门服务器开发语言(如 JAVA/PHP 等),将注 ...

  8. 【imessage群发苹果推信】[iMessageSuspic](Apple推送服务)使用信息推送服务

    Apple信息推送服务(ApplePushNotificationservice), 由Apple根据官方新闻服务提供. 交货包括顶部,声音和Badgenumber比例指南(),应用程序可以在任何条件 ...

  9. 蓝牙信标Beacon_信息推送,室内定位,室内导航

    基于蓝牙信标的室内定位导航,蓝牙信标中的蓝牙模块是工作在从模式下,使用BLE低功耗蓝牙广播的方法,利用其支持的通用属性配置文件在第37.38.39三个信道上连续发送无定向性的广播包.蓝牙信标在广播模式 ...

最新文章

  1. mysql binlog恢复sql_binlog2sql实现MySQL误操作的恢复
  2. 记一次php手工注入(mysql)
  3. 新版本springboot-整合多数据源拆分思路
  4. python解释器下安装z3_再次:在Windows上安装Z3 Python
  5. c语言 map转换成字符串数组,JSON数组形式字符串转换为ListMapString,String的几种方法...
  6. 在windows下挂载nfs文件系统
  7. Fragmen的onAttach方法
  8. Kubernetes详解(十七)——Pod存活性探针应用实战
  9. (转)互联网投顾平台的监管风险:和讯信息
  10. JAVA垃圾回收机制
  11. cocos 《成语接龙》---Button(按钮)组件
  12. C++厘米和英寸的换算
  13. CEC2018:动态多目标测试函数DF10~DF14的PS及PF(提供Matlab代码)
  14. python中newline什么意思,\newline转义序列在python中是什么意思?
  15. java项目遇到难题_Java项目遇到的常见问题
  16. Java——将汉字转为汉语拼音工具类
  17. opencv学习笔记9:根据图片颜色分割图像
  18. 仓库管理系统-新名词(经济订货批量 、订货周期、订货提前期)
  19. 程序员是怎样的一群人
  20. 大学计算机AI学习初步规划 202204

热门文章

  1. Zemax操作--8(激光扫描系统)
  2. 9.1 什么是包图?
  3. 指定程序使用独立显卡
  4. 【渝粤题库】陕西师范大学163207 旅游企业人力资源管理 作业(专升本)
  5. 低代码平台无极(wj)系列(一):从低代码服务到0代码的应用背景
  6. ReactiveX -Rx
  7. LiveUpdate出错SEP无法更新的解决方法
  8. linux dos2unix 批量,linux下dos2unix
  9. STM32单片机驱动全彩LED模块遍历百万种颜色
  10. 【医学图像智能计算】DL在医学影像中的应用综述—图像重建