文档地址:https://doc.yuntongxun.com/p/5a533de33b8496dd00dce07c
第一部分文档内容:
1 概述
1.1 业务流程说明
1.2 Base URL
模板短信API引用的地址有Base URL。
生产环境的Base URL:https://app.cloopen.com:8883
注意:为了确保数据隐私,云通讯平台的REST API是通过HTTPS方式请求。
1.3 业务URL
业务URL格式:/2013-12-26/Accounts/{accountSid}/SMS/{funcdes}?sig={SigParameter}
在URL格式中 {}内的内容表示为参数,非{}的内容固定不变。
Base URL与业务URL相拼接为完整请求URL,完整URL示例:
属性说明:
属性 | 类型 | 约束 | 说明 |
accountSid | String | 必选 | 开发者主账户ACCOUNT SID(登陆官网在管理控制台获取) |
SigParameter | String | 必选 |
REST API 验证参数,生成规则如下 1.使用MD5加密(账户Id + 账户授权令牌 + 时间戳)。其中账户Id和账户授权令牌根据url的验证级别对应主账户。 时间戳是当前系统时间,格式"yyyyMMddHHmmss"。时间戳有效时间为24小时,如:20140416142030 2.SigParameter参数需要大写,如不能写成sig=abcdefg而应该写成sig=ABCDEFG |
1.4 HTTP标准包头字段
Accept:application/xml;
Content-Type:application/xml;charset=utf-8;
Content-Length:256;
Authorization:
属性说明:
属性 | 类型 | 约束 | 说明 |
Accept | String | 必选 | 客户端响应接收数据格式:application/xml、application/json |
Content-Type | String | 必选 | 类型:application/xml;charset=utf-8、application/json;charset=utf-8 |
Content-Length | String | 必选 | Content-Length |
Authorization |
String |
必选 |
验证信息,生成规则详见下方说明 1.使用Base64编码(账户Id + 冒号 + 时间戳)其中账户Id根据url的验证级别对应主账户 2.冒号为英文冒号 3.时间戳是当前系统时间,格式"yyyyMMddHHmmss",需与SigParameter中时间戳相同。 |
第二部分开始解读文档:
1登录云通讯管理后台绑定测试号码(由于接收短信)
2解读上面文档中的1.2和1.3
1)生产环境的Base URL可登录云通讯管理后台查看
2)业务url需要我们自己拼接,由于文档中并未说明地址中的{funcdes}要如何创建,所以按照文档中的示例,我们直接把这个变量写死,即TemplateSMS
业务URL格式:/2013-12-26/Accounts/{accountSid}/SMS/{funcdes}?sig={SigParameter}
accountSid:开发者主账户ACCOUNT SID,在控制台首页: funcdes:根据文档里的示例,这个变量我们就按照示例提供的单词写死就行,即TemplateSMS SigParameter: 1使用md5对(账号id+账户授权令牌+时间戳)进行加密,其中账户id和授权令牌在控制台首页里找,而时间戳需要我们自己来生成,时间戳的格式是"年月日时分秒",例如:20211213144530 2生成的md5值必须是大写,例如sig=ABCDE是正确的,而sig=abcde是错误的
3)对http请求头的要求:
#根据文档选择你是使用xml还是json,下面的文档给的xml Accept:application/xml; Content-Type:application/xml;charset=utf-8; Content-Length:256; 因为xml个人感觉很不方便,我选择用json,根据文档说明,应该写成这样: Accept:application/json; Content-Type:application/json;charset=utf-8; Content-Length:256; #这一项需要我们改造(验证信息) Authorization: 对(账户id+冒号+时间戳)进行base64编码,其中账户id在管理后台查看,冒号为英文冒号,时间戳格式为"年月日时分秒",例如202112121502
总结:
1.3的业务员url拼接需要用md5加密,而md5加密参数包括时间戳,因此我们需要按照文档的要求写一个生成时间戳的方法,
然后再写生成签名的方法
最后把业务URL拼接出来
#定义生成时间戳方法 def get_timestamp(self): return datetime.datetime.now().strftime('%Y%m%d%H%M%S')
#生成签名即业务url中的sig={SigParameter} def get_sig(self,timestamp): # 使用md5对(账号id+账户授权令牌+时间戳)进行加密 s = self.accountSid+self.accountToken+timestamp m = hashlib.md5() m.update(s.encode()) #md5值必须是大写 return m.hexdigest().upper()
#生成通信要用的路由: #业务URL格式:/2013-12-26/Accounts/{accountSid}/SMS/{funcdes}?sig={SigParameter} def get_request_url(self,sig): self.url=self.base_url + '/2013-12-26/Accounts/%s/SMS/TemplateSMS?sig=%s'%(self.accountSid,sig) return self.url
1.4是组织请求头,我们用json组织请求头,按照文档的要求进行组合:
#生成请求头 def get_request_head(self,timestamp): #Authorization:对(账户id+冒号+时间戳)进行base64编码的字符串 s = self.accountSid + ':' + timestamp auth = base64.b64encode(s.encode()).decode() #组织数据 dataJson = { 'Accept':'application/json', 'Content-Type':'application/json;charset=utf-8', 'Content-Length':256, 'Authorization':auth } return dataJson
第三部分开始写代码:
通常我们在做平台对接的时候,我们都会做一个类,然后在初始化文件_ _init _ _ .py里面构建一些参数,用类做平台对接,未来可扩展性比较好,例如这家平台费用贵,我想换一个其它的平台,那么在这个类里可能稍加改动或者添加新的方法就可以实现。
import datetime, hashlib, base64 class Yuntongxin(): #固定不变的东西用类属性表达 base_url = 'https://app.cloopen.com:8883' #比较有差异化的东西在init里定义 def __init__(self,accountSid,accountToken): self.accountSid = accountSid #账户id self.accountToken = accountToken #授权令牌 #定义生成时间戳方法 def get_timestamp(self): return datetime.datetime.now().strftime('%Y%m%d%H%M%S') #生成签名即业务url中的sig={SigParameter} def get_sig(self,timestamp): # 使用md5对(账号id+账户授权令牌+时间戳)进行加密 s = self.accountSid+self.accountToken+timestamp m = hashlib.md5() m.update(s.encode()) #md5值必须是大写 return m.hexdigest().upper() #生成通信要用的路由: #业务URL格式:/2013-12-26/Accounts/{accountSid}/SMS/{funcdes}?sig={SigParameter} def get_request_url(self,sig): self.url=self.base_url + '/2013-12-26/Accounts/%s/SMS/TemplateSMS?sig=%s'%(self.accountSid,sig) return self.url #生成请求头 def get_request_head(self,timestamp): #Authorization:对(账户id+冒号+时间戳)进行base64编码的字符串 s = self.accountSid + ':' + timestamp auth = base64.b64encode(s.encode()).decode() #组织数据 dataJson = { 'Accept':'application/json', 'Content-Type':'application/json;charset=utf-8', 'Content-Length':256, 'Authorization':auth } return dataJson #定义一个run方法进行测试 def run(self): timestamp = self.get_timestamp() #生成时间戳 sig = self.get_sig(timestamp) #生成签名 url = self.get_request_url(sig) #生成业务url #print(url) header = self.get_request_head(timestamp) print(header) if __name__ == '__main__': yun = Yuntongxin('***************8','c6********************8') yun.run()