wd-smebiz/utils/phone_msg_utils.py

56 lines
2.7 KiB
Python
Raw Permalink Normal View History

2023-08-02 10:18:36 +08:00
# -*- coding: utf-8 -*-
import time
import uuid
import hashlib
import base64
import requests
# # 必填,请参考"开发准备"获取如下数据,替换为实际值
# url = 'https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1' # APP接入地址(在控制台"应用管理"页面获取)+接口访问URI
# app_key = "3h499M186sTF8046f9J9I28J1L9m" # APP_Key
# app_secret = "TMCaZWxoMbuW55l27zdxoDfsiKAH" # APP_Secret
# sender = "1069368924410005073" # 国内短信签名通道号或国际/港澳台短信通道号
# template_id = "527eb7a7b95f4466834347adbde6d53e" # 模板ID
# # 条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
# # 国际/港澳台短信不用关注该参数
# signature = "华为云短信测试" # 签名名称
# # 选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
# statusCallBack = ""
class PhoneMsgSend:
def __init__(self, url, app_key, app_secret, sender, template_id, signature, status_call_back=""):
self.url = url
self.app_key = app_key
self.app_secret = app_secret
self.sender = sender
self.template_id = template_id
self.signature = signature
self.status_call_back = status_call_back
def build_WSSE_header(self):
now = time.strftime('%Y-%m-%dT%H:%M:%SZ')
nonce = str(uuid.uuid4()).replace('-', '')
digest = hashlib.sha256((nonce + now + self.app_secret).encode()).hexdigest()
digest_base64 = base64.b64encode(digest.encode()).decode()
return 'UsernameToken Username="{}",PasswordDigest="{}",Nonce="{}",Created="{}"'.format(self.app_key,
digest_base64, nonce,
now)
def send_phone_code(self, phone, code):
# 请求Headers
header = {'Authorization': 'WSSE realm="SDP",profile="UsernameToken",type="Appkey"',
'X-WSSE': self.build_WSSE_header()}
# 请求Body
form_data = {'from': self.sender,
'to': "+86" + phone,
'templateId': self.template_id,
'templateParas': f'["{code}"]',
'statusCallback': self.status_call_back,
'signature': self.signature # 使用国内短信通用模板时,必须填写签名名称
}
# 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
r = requests.post(self.url, data=form_data, headers=header, verify=False)
return r