
# Python
![](https://support.huaweicloud.com/devg-iotcom/public_sys-resources/note_3.0-zh-cn.png)
- 本文档所述Demo在提供服务的过程中，可能会涉及个人数据的使用，建议您遵从国家的相关法律采取足够的措施，以确保用户的个人数据受到充分的保护。
- 本文档所述Demo仅用于功能演示，不允许客户直接进行商业使用。
- 本文档信息仅供参考，不构成任何要约或承诺。
 
#### 发送短信
```
# -*- coding: utf-8 -*-
import json
import requests  # 需要先使用pip install requests命令安装依赖
# 必填,请参考"开发准备"获取如下数据,替换为实际值
url = 'https://ip:port/common/sms/sendTemplateMessage'  # APP接入地址+接口访问URI
msisdn = ['8612345678911']  #手机号码，多个手机号以,号分隔，例如：['8612345678911','8612345678912']
smsTemplateId = "SMS_21060200001"  # 模板ID
templateParas = {"VarName": "VarValue"} # 1、当发送短信使用的是无变量的模板时，请删除本行代码。2、当发送短信使用的是带变量的模板时，需要配置本行代码。VarName表示模板中变量的参数名称，VarValue表示该变量实际要配置的参数值，请按照实际情况配置VarName和VarValue。若需要配置多个变量，请参考本行代码格式进行添加。
account = 'account'  # 实际账号
password = 'password'  # 实际密码
signature = '【huawei】'  # 签名名称
def main():
    # 请求Headers
    header = {'Content-Type': 'application/json;charset=UTF-8'}
    # 当发送短信使用的是无变量模板时，不需要添加templateParas参数。
    mtSmsMessage = {
        'mobiles': msisdn,
        'templateId': smsTemplateId,
        'templateParas': templateParas,
        'signature': signature,
    }
    requestLists = [mtSmsMessage]
    # 请求Body
    formData = {'account': account,
                'password': password,
                'requestLists': requestLists,
                'statusCallback': 'https://ip:port/common/sms/notifyReportMessage'
                }
    # 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
    r = requests.post(url, data=json.dumps(formData, ensure_ascii=False).encode("utf-8"), headers=header, verify=False)
    print(r.text)  # 打印响应信息
if __name__ == '__main__':
    main()
```
#### 上行短信接收
```
# -*- coding: utf-8 -*-
import urllib.parse
# 上行短信通知样例(urlencode)
updata = "mobile=%2B12345678911&content=***&sendTime=20220127020758&extCode=";
'''
解析上行短信通知数据
@param data: 短信平台推送的上行短信通知数据
@return: 
'''
def onSmsUpData(data):
    keyValues = urllib.parse.parse_qs(data); #解析上行短信通知数据
    '''
    Example: 此处以解析content为例,请按需解析所需参数并自行实现相关处理
    'mobile': 上行短信手机号
    'content': 短信内容
    'sendTime': 上行短信时间
    'extCode': 扩展码
    '''
    content = keyValues.get('content'); #上行短信发送的内容
    print('Sms up data. Content: ', content[0]);
if __name__ == '__main__':
    onSmsUpData(updata)
```
#### 状态报告接收
```
# -*- coding: utf-8 -*-
import urllib.parse
# 短信平台上报状态报告数据样例(urlencode)
#success_body = "requestId=20220126&mobile=12345678911&messageId=2022012619403400&status=DELIVRD&resultCode=000000&resultDesc=success&smsCount=null&receiveTime=null";
failed_body = "requestId=20220126&mobile=12345678911&messageId=2022012619403400&status=E200027&resultCode=1020001&resultDesc=Parameter error&smsCount=null&receiveTime=null";
'''
解析状态报告数据
@param data: 短信平台上报的状态报告数据
@return: 
'''
def onSmsStatusReport(data):
    keyValues = urllib.parse.parse_qs(data); #解析状态报告数据
    '''
    Example: 此处以解析status为例,请按需解析所需参数并自行实现相关处理
    'messageId': 短信唯一标识
    'smsCount': 长短信拆分条数
    'receiveTime': 资源更新时间
    'status': 状态码
    '''
    status = keyValues.get('status'); #状态报告枚举值
    # 通过status判断短信是否发送成功
    if 'DELIVRD' == str.upper(status[0]):
        print('Send sms success. messageId: ', keyValues.get('messageId')[0]);
    else:
        # 发送失败,打印status
        print('Send sms failed. messageId: ', keyValues.get('messageId')[0]);
        print('Failed status: ', status[0]);
if __name__ == '__main__':
#     onSmsStatusReport(success_body)
    onSmsStatusReport(failed_body)
```
