springboot开发基于阿里云的短信服务、邮件推送服务

【工具篇】Spring Boot 整合阿里云短信-SMS 通常用于向注册用户和潜在客户发送通知和推广信息,包括促销活动通知、业务推广、新产品宣讲、会员关怀等商品与活动的推广信息,可以增加企业产品曝光率、提高产品和企业的知名度。通常用于影视会员推广、旅游景点介绍、直播电商推广以及各类消费产品的介绍推广等,生动直观的展示,有效吸引目标用户,帮助企业在市场竞争中获取更大的优势。通常用于向注册用户下发系统相关信息,包括升级或维护、服务开通、价格调整、 订单确认、物流动态、消费确认、 支付通知等普通通知短信。向手机号码发送通知类短信,支持通过变量替换实现个性短信定制。 阅读详情

短信服务以及邮件推送服务使用的都是阿里云的产品,短信服务是收费的,所以需要选择短信服务的套餐并预充值才能使用。邮件推送服务是有200条的免费额度。

一:短信服务

1、申请短信签名、短信模板

到阿里云的短信服务 控制台,国内消息:签名管理中申请短信签名,模板管理中申请短信模板。

2、申请accessKeyId和accessKeySecret:

①:到RAM访问控制,人员管理,用户,新建用户

2、在新建用户里,填入登录名称以及显示名称,并勾选编程访问,至此短信服务的准备工作就完了。

附:还需要加入短信API使用的权限

3、在spring boot的pom.xml中加入阿里云短信服务的依赖,并加入JSON的依赖

<!-- 阿里云服务依赖  -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.1.0</version>
</dependency>

<!-- 阿里云短信服务依赖  -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>1.1.0</version>
</dependency>
<!-- 阿里云JSON  -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.31</version>
</dependency>

4、将申请好的短信服务的短信签名、短信模板、accessKeyId、accessKeySecret等放到配置文件中,最好使用.properties格式的,yml格式的我使用配置类没有读取成功:

#短信服务 accessKeyId
msn.accessKeyId=accessKeyId

#短信服务 accessKeySecret
msn.accessKeySecret=accessKeySecret

#短信服务 产品名称:云通信短信API产品,开发者无需替换
msn.product=Dysmsapi

#短信服务 发送短信的域名
msn.domain=dysmsapi.aliyuncs.com

#短信服务 区域Id
msn.regionId=cn-hangzhou

#短信服务 签名
msn.signName=阿里云短信签名(最好将短信签名写进代码里,否则会出现程序读取短信签名时乱码,导致读取失败,从而无法发送短信)

#短信服务 模板
msn.templateCode=阿里云短信模板

#短信服务 模板参数
msn.templateParam=code

#短信服务 发送日期 支持30天内记录查询,格式yyyyMMdd
msn.dateFormat=yyyyMMdd

#短信服务 服务节点
msn.endpointName=cn-hangzhou

5、使用配置类读取配置文件中的短信配置:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:msn.properties")
@ConfigurationProperties(prefix = "msn")
@Data
public class MsnConfig {

    /**
     * accessKeyId
     */
    private String accessKeyId;

    /**
     *   accessKeySecret
     */
    private String accessKeySecret;

    /**
     *产品名称:云通信短信API产品,开发者无需替换
     */
    private String product;

    /**
     *发送短信的域名
     */
    private String domain;

    /**
     *区域Id
     */
    private String regionId;

    /**
     *签名
     */
    private String signName;

    /**
     *模板
     */
    private String templateCode;

    /**
     *模板参数
     */
    private String templateParam;

    /**
     *发送日期  支持30天内记录查询,格式yyyyMMdd
     */
    private String dateFormat;

    /**
     *服务节点
     */
    private String endpointName;
}

6、短信服务核心代码:

@GetMapping("/msn")
public String sendMsn() {
    //短信发送结果
    String result = "";

    String regionId = msnConfig.getRegionId();
    String accessKeyId = msnConfig.getAccessKeyId();
    String accessSecret = msnConfig.getAccessKeySecret();
    String signName = msnConfig.getSignName();
    System.out.println("显示signName:"+signName);
    String templateCode = msnConfig.getTemplateCode();
    String templateParam = msnConfig.getTemplateParam();

    Map<String,String> map = new HashMap<>();
    //随机生成六位验证码
    String verifyCode = String.valueOf((Math.random()*9+1)*100000).substring(0,6);
    map.put(templateParam,verifyCode);
    String code = JSON.toJSONString(map);

    DefaultProfile profile = DefaultProfile.getProfile(regionId,accessKeyId,accessSecret);
    IAcsClient client = new DefaultAcsClient(profile);

    CommonRequest request = new CommonRequest();
    request.setMethod(MethodType.POST);
    request.setDomain("dysmsapi.aliyuncs.com");
    request.setVersion("2017-05-25");
    request.setAction("SendSms");
    request.putQueryParameter("RegionId", regionId);
    request.putQueryParameter("PhoneNumbers", "手机号码");
    request.putQueryParameter("SignName", "短信签名");
    request.putQueryParameter("TemplateCode", templateCode);
    request.putQueryParameter("TemplateParam",code);
    try {
        CommonResponse response = client.getCommonResponse(request);
        result = response.getData();
        System.out.println();
    } catch (ServerException e) {
        e.printStackTrace();
    } catch (ClientException e) {
        e.printStackTrace();
    }
    return result;
}

读取配置类中的短信签名时会出现乱码:

7、测试:

此结果表示短信发送成功,短信服务开发完成。

二、邮件推送服务:

开发邮件服务需要有持有域名才行,由于本文讲的是邮件推送服务,对于如何购买域名等问题请自行解决。

1、在邮件服务-邮件设置-发信域名:新建发信域名(此为示例):

2、发信配置:

3、到域名提供商处添加相应的配置。

4、发信地址设置:

5、设置邮件标签

6、到RAM访问控制台新建邮件发送的用户,步骤与开发短信服务时的操作一致,故不再赘述。,但也需要加邮件推送API使用的权限,至此邮件推送的准备工作已完毕。

7、在pom.xml中加入阿里云邮件推送使用的依赖

<!-- 阿里云服务依赖  -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.1.0</version>
</dependency>

<!-- 阿里云邮箱服务依赖  -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dm</artifactId>
    <version>3.1.0</version>
</dependency>

<!-- 阿里云JSON  -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.31</version>
</dependency>

8、将邮件推送服务使用的配置写入到配置文件中:

#邮件服务 accessKeyId
mail.accessKeyId=

#邮件服务 accessKeySecret
mail.accessKeySecret=

#邮件服务 发信地址
mail.accountName=

#邮件服务 区域Id
mail.regionId=cn-hangzhou

#邮件服务 发信人昵称
#mail.sendPersonName=(程序无法正常读取中文,若是中文应写到程序中)

#邮件服务  取值范围 0~1: 0 为随机账号;1 为发信地址
mail.addressType=1

#邮件服务 控制台创建的标签
mail.tagName=

#邮件服务 回信地址
mail.replyToAddress=true

#邮件服务  目标地址
mail.toAddress=邮件接收人的邮箱

9、配置类读取邮件推送配置

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:mail.properties")
@ConfigurationProperties(prefix = "mail")
@Data
public class MailConfig {
    /**
     * accessKeyId
     */
    private String accessKeyId;

    /**
     *   accessKeySecret
     */
    private String accessKeySecret;

    /**
     * 发信地址
     */
    private String accountName;

    /**
     *区域Id
     */
    private String regionId;

    /**
     *发信人昵称
     */
    private String sendPersonName;

    /**
     *发信地址代码 1
     */
    private Integer addressType;

    /**
     *控制台创建的标签
     */
    private String tagName;

    /**
     *回信地址
     */
    private boolean replyToAddress;

    /**
     *目标地址
     */
    private String toAddress;

}

10、邮件推送核心代码(此为示例):

@GetMapping("/mail")
public String sample() {
    //邮件发送结果
    String result = "";

    // 如果是除杭州region外的其它region(如新加坡、澳洲Region),需要将下面的"cn-hangzhou"替换为"ap-southeast-1"、或"ap-southeast-2"。
    IClientProfile profile = DefaultProfile.getProfile(mailConfig.getRegionId(), mailConfig.getAccessKeyId(), mailConfig.getAccessKeySecret());
    // 如果是除杭州region外的其它region(如新加坡region), 需要做如下处理
    //try {
    //DefaultProfile.addEndpoint("dm.ap-southeast-1.aliyuncs.com", "ap-southeast-1", "Dm",  "dm.ap-southeast-1.aliyuncs.com");
    //} catch (ClientException e) {
    //e.printStackTrace();
    //}
    IAcsClient client = new DefaultAcsClient(profile);
    SingleSendMailRequest request = new SingleSendMailRequest();
    try {
        //request.setVersion("2017-06-22");// 如果是除杭州region外的其它region(如新加坡region),必须指定为2017-06-22
        request.setAccountName(mailConfig.getAccountName());
        request.setFromAlias("发信人昵称");
        request.setAddressType(mailConfig.getAddressType());
        request.setTagName(mailConfig.getTagName());
        request.setReplyToAddress(true);
        request.setToAddress(mailConfig.getToAddress());
        //可以给多个收件人发送邮件,收件人之间用逗号分开,批量发信建议使用BatchSendMailRequest方式
        //request.setToAddress("邮箱1,邮箱2");
        request.setSubject("尊敬的用户您好:");
        //随机生成六位验证码
        String verifyCode = String.valueOf((Math.random()*9+1)*100000).substring(0,6);
        request.setHtmlBody("此邮件为开发邮件功能的测试邮件,验证码为:"+verifyCode);
        //开启需要备案,0关闭,1开启
        //request.setClickTrace("0");
        //如果调用成功,正常返回httpResponse;如果调用失败则抛出异常,需要在异常中捕获错误异常码;错误异常码请参考对应的API文档;
        SingleSendMailResponse httpResponse = client.getAcsResponse(request);
        result = httpResponse.getEnvId() + " "+httpResponse.getRequestId();
    } catch (ServerException e) {
        //捕获错误异常码
        System.out.println("ErrCode : " + e.getErrCode());
        e.printStackTrace();
    }
    catch (ClientException e) {
        //捕获错误异常码
        System.out.println("ErrCode : " + e.getErrCode());
        e.printStackTrace();
    }
    return result;
}

11、发送邮件:返回结果若出现此结果,则表示发送成功,可查看邮件。

三、总结:

使用阿里云的短信服务、邮件推送服务开发短信通知及邮件通知功能,过程并不复杂,可把发送的验证码存储到数据库或缓存中,用来进行注册或登陆验证。

发送验证码-整合阿里云短信服务功能与电子邮箱通知功能 开始实现功能,邮箱和发短信差不多,只不过是两者需要设置的参数不同,我们在发短信时需要设置签名和模板,我们在邮箱要设置发送者和接收者,邮件没有模板我们可以定义在配置文件里,说到底也还是一个调用邮件服务器的方法罢了。 阅读详情

相关推荐

Springboot整合阿里云短信服务

点击AccessKey管理,开通使用子用户AccessKey

qq_62325622的博客 1903

阿里云-----云通信短信服务---发送验证码到手机

阿里云 短信服务 demo,发送验证码,通知到手机上

u014520797的专栏 2万+

企业微信-审批控件中的外部选项的应用全流程完美解决方案

完美解决企业微信所有JS-SDK调用问题 完美解决苹果和PC端不适配的问题

qq_45195039的博客 5872

阿里云短信简介和接入流程

如果选择的是该选项,我们创建的是阿里云账号的AccessKey,是具有账户的完全权限,有了这个AccessKey以后,我们就可以通过API调用阿里云的服务,不仅是短信服务,其他服务(OSS,语音服务,内容安全服务,视频点播服务…经过上述的权限配置之后,那么新创建的这个 reggie 用户,仅有短信服务操作的权限,不具备别的权限,即使当前的AccessKey泄漏了,也只会影响短信服务,其他服务是不受影响的。根据官方文档的提示,引入对应的依赖,然后再引入对应的java代码,就可以发送消息了。

weixin_45734189的博客 3788

西门子1200之PID用法与控制

西门子PID加热试验

gyxgyx789的博客 6259

REST-meta-MDD Data总结

sMRI数据使用:nwc1、nwc2、nwc3(同样数据集相关论坛中有相关信息指向需要使用wc1、wc2、wc3)多方咨询与讨论后决定使用nwc数据,这里说明wc数据相对wc数据要大的多如wc1的大小为1.33GB,而nwc1的数据却有6.90GB。VBM文件:/REST-meta-MDD/Sharing/REST-meta-MDD-VBM- phase1 -Sharing.tar.gz。1、Excel中的表型信息:1-男,2-女;-9999或空白表示缺少数据。

2404_88295660的博客 1539

ApiBoot发布2.1.4-RC1版本,修复无法拉取jar到本地问题

注意:因 ApiBoot 2.1.3.RELEASE版本在上传到Maven中央仓库时,${revision}占位符未被替换导致版本无法拉取, 针对这个问题ApiBoot上传了2.1.4-RC1版本来临时解决这个问题,希望大家修改后使用。 简介 ApiBoot为接口服务而生,基于SpringBoot完成扩展、自动化配置,通过封装一系列Starter来让调...

恒宇少年De成长之路 248

YOLOv11 改进 - 注意力机制 | EMA (Efficient Multi-Scale Attention) 高效多尺度注意力:跨空间学习与多分支协同增强特征表征,优化多尺度目标检测

本文介绍了高效多尺度注意力(EMA)模块及其在YOLOv11中的结合应用。现有注意力机制在通道维度缩减时可能影响深度视觉表示,EMA模块通过结合通道和空间信息、采用多尺度并行子网络结构等创新点,实现了高效的多尺度注意力机制。其基本原理包括通道和空间注意力结合、多尺度并行子网络设计等。在多个流行基准数据集上的实验表明,该模块能有效提高特征表示能力。我们将EMA集成进YOLOv11,实验证明改进后的模型在目标检测任务中性能优越,具有广泛应用前景

魔改工程师的博客 1293

阿里云短信服务全流程:Spring Boot接入与验证码防刷实践

短信验证码是用户登录、注册与安全校验中最高频的触达方式之一,其底层依赖云通信服务商提供的签名、模板与API调用能力。调用阿里云短信服务时,开发者需理解AccessKey安全、模板报备、计费余额与通道流控等基础机制,否则容易在签名审核、接口限流和防轰炸环节踩坑。从技术价值看,稳定可靠的短信通道能提升身份验证效率,但必须配合Redis限流、异步发送与多通道降级来抵御恶意刷接口。常见于用户登录、订单通知和系统告警等场景。围绕dysmsapi20170525 SDK与Spring Boot工程化接入,从开通准备、代

weixin_31236101的博客 302

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1658

新政下的绿电直连项目经济性分析:模式创新与价值重构

随着全球气候治理与低碳转型进程不断加速,绿电直连作为新能源就近消纳的创新模式,正成为破解新能源消纳瓶颈、规避碳关税壁垒的核心路径。2025年9月,国家发展改革委、国家能源局发布《关于完善价格机制促进新能源发电就近消纳的通知》(1192号文),为绿电直连项目的经济性分析与效益测算提供了明确的政策依据。本文将基于新政框架,深入解析绿电直连项目的经济性影响因素、盈利模式与优化路径,并结合案例与量化模型,为项目投资决策提供系统参考。

getusushu的博客 141

SpringBoot项目里,如何用阿里云ONS(消息队列)优雅地解耦发邮件、发短信这种‘琐事’?

本文详细介绍了如何在SpringBoot项目中利用阿里云ONS消息队列实现邮件、短信等异步服务的优雅解耦。通过对比主流消息中间件,展示ONS在运维成本、消息可靠性和吞吐量等方面的优势,并提供从环境配置到消息生产消费的完整代码示例,帮助开发者提升系统响应速度与稳定性。

weixin_33701251的博客 203

【MATLAB代码】雷达观测目标跟踪模型|H-infinity Filter(H无穷大滤波)与EKF(扩展卡尔曼滤波)的对比。附完整代码,订阅专栏后可直接查看

对比了经典扩展卡尔曼滤波(EKF)与H∞优化的EKF(H∞-EKF)在目标跟踪中的性能。通过MATLAB仿真实验,结果显示:在存在模型误差和测量噪声的情况下,H∞-EKF相比经典EKF在位置误差上降低

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 245

springboot社区助老志愿管理服务平台的开发

Data// 0-未开始 1-进行中 2-已结束。

2501_93250029的博客 698

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Api组件化解决方案:ApiBoot 2.1.0.RELEASE发布

ApiBoot 简介 ApiBoot为接口服务而生,基于SpringBoot完成扩展、自动化配置,通过封装一系列Starter来让调用者快速集成组件,降低学习、使用门槛,提高开发效率。 本次更新 ApiBoot Mail 初版发布(集成阿里云邮件服务) ApiBoot Mybatis Pageable 版本升级 ApiBoot Oauth ...

恒宇少年De成长之路 247

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Springboot社区管理系统t0915(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

项目功能:社区居民,外卖员,来访人员,楼房信息,社区门禁,居民出入,外卖员出入,来访出入。

a55559595959的博客 1714

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Springboot就业管理系统bk5uv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

2]赵梓皓,崔应留,葛晨,沈盈之,雷妤婷.基于SpringBoot的社区防控管理系统的设计与实现[J].软件,2022,43(10):154-159.[4]詹志钦,温栋才,张东娜.基于LBS技术的社区服务系统的设计与实现[J].电脑知识与技术,2017,13(21):233-235.[11]凌美霞,陈嘉雯,张玲,宗慧琳,林小芳,沈丹.南通市智慧社区建设研究[J].中国标准化,2022,(S1):295-299.查阅相关文献资料,结合应用实际,明确设计(论文)内容,了解完成工作所需软硬件环境。

zy18476271135的博客 582

上门安装维修服务预约平台源码开发

通过上述功能模块和技术架构的设计,预约上门安装维修系统接单平台不仅能够为用户提供便捷的上门服务预约功能,还能帮助服务提供商高效管理订单和服务人员。这种系统通常用于家电维修、家具安装、家政服务等领域,通过线上预约、派单、跟踪等流程,提高服务效率和用户体验。:集成第三方短信服务(如阿里云短信、腾讯云短信),发送订单提醒、验证码等。:用户填写详细的服务需求,包括时间、地点、问题描述等,并提交订单。:用户可以查看订单状态,如待接单、已接单、服务中、已完成等。:集成高德地图或百度地图API,提供地图定位、导航服务。

qq_51711288的博客 2349

Springboot校园移动办公系统ub2p4本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

项目功能:学生,教师,课程分类,课程信息,选课信息,每周课表,班级,教学计划,个人办公。

zy18476271135的博客 919

Springboot3+vue3仓库库存预警管理系统

后端采用Spring Boot 3.x框架,集成Spring Security实现权限控制,使用MyBatis-Plus操作数据库。构建库存看板、预警规则配置、预警记录查询三大功能模块。规则配置页面提供阈值设置和通知方式选择,采用Vue的v-model实现双向数据绑定。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。注解定期扫描库存数据,与预警规则比对。预警规则表包含字段:规则ID、商品类别、最低库存阈值、最高库存阈值、通知方式。

懒人的博客 346

SpringBoot+Vue校园招聘系统开发实战

现代Web应用开发中,前后端分离架构已成为主流技术范式。SpringBoot作为Java生态的微服务框架,通过自动配置和起步依赖显著提升了开发效率;Vue.js则以其响应式数据绑定和组件化特性,成为构建动态用户界面的首选。这种技术组合特别适合开发校园招聘系统这类中等复杂度的企业级应用,能够有效处理用户认证、数据持久化、RESTful API设计等核心问题。在实际工程实践中,结合MySQL关系型数据库和Redis缓存,可以构建出高性能的招聘管理平台,满足职位发布、简历处理、面试安排等典型业务场景需求。通过RB

weixin_30319153的博客 339

SpringBoot家装企业网站开发实战与架构解析

企业级Web开发中,SpringBoot凭借其自动配置和快速启动特性成为主流选择。该框架通过内嵌容器和Starter依赖机制,显著降低了传统JavaEE应用的部署复杂度。结合MyBatis-Plus的智能化CRUD操作,开发者可以高效构建数据持久层。在家装行业数字化转型背景下,这类技术组合能快速实现案例展示、在线预约等核心功能,其中物理分页和Redis缓存等优化手段可有效应对高并发场景。项目采用Thymeleaf+Bootstrap的前端方案,既保证开发效率又满足响应式需求,为中小装饰企业提供了完整的数字化

weixin_33428613的博客 284

基于springboot家政服务管理系统_c260n866_010

本文介绍了一个基于Spring Boot的家政服务管理系统,采用B/S架构和前后端分离技术,使用MySQL数据库和Redis缓存等工具。系统核心功能包括用户管理、员工管理、订单管理、服务评价和消息通知等模块,支持高效开发、高并发处理和数据安全。文章还提供了部分核心代码示例和系统效果图,展示了系统的技术实现和功能特点。该系统旨在提升家政服务行业的管理效率和服务质量,适用于家政公司、服务人员和客户等多方用户。

qq_1406299528的博客 909
上一篇: 关于spring boot报javax/servlet/MultipartConfigElement错误以及的问题
下一篇: zookeeper及kafka在Linux下的安装与配置
西木Qi
博客等级 码龄8年 8315粉丝 186原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值