【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)

简介: 【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)

前言

  1. 在网站和移动应用中利用短信验证码进行信息确认是最常用的验证手段。随着短信验证码的技术更新,短信验证码的应用程序也非常多样,如交易确认、授权绑定、登录保护等。 本文用在微信小程序手机号登录
  2. 短信验证码对注册用户的管理更加方便,用户通过手机注册网站平台,手机号码+短信验证码的登录方式,操作非常简单,比起输入密码,用户可能更喜欢短信验证登录。短信验证码保证了用户注册时的质量与数量,它可以更好的校验用户真实身份,可以避免恶意注册,令企业更好的进行用户管理,减少运营维护的工作量。

一. 准备工作

  1. 没有阿里云账号先注册阿里云账户
  2. 短信功能是要收费的,所以乖乖充值吧!
  3. 完成短信签名和短信模板的申请(需要一点时间)
  4. 创建access key(后面需要使用)

二. 配置

  1. 依赖
<dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.4.6</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-ecs</artifactId>
            <version>4.17.6</version>
        </dependency>
  1. 配置阿里云短信(这里***是自己要配的,来源于阿里云短信服务)
aliyun:
    accessKey: ***
    accessSecret: ***
    sms:
      domain: ***
      SignName: ***
      TemplateCode: ***
  1. java中引入
@Value("${aliyun.accessKey}")
    private String accessKey;
    @Value("${aliyun.accessSecret}")
    private String accessSecret;
    @Value("${aliyun.sms.domain}")
    private String domain;
    @Value("${aliyun.sms.SignName}")
    private String signName;
    @Value("${aliyun.sms.TemplateCode}")
    private String templateCode;
    @Value("${water.charge.maintenanceCode}")
    private String maintenanceCode;

三. 实战代码(仅仅是后台代码,前端传入手机号)

  1. Controller
@Autowired
    private CustomerAppLoginService customerAppLoginService;
    @ApiOperation("发送手机短信")
    @GetMapping("phone/send_code")
    public JsonData phoneSendCode(@RequestParam("phone") String phone) {
        return customerAppLoginService.phoneSendCode(phone);
    }
  1. service
@Override
    public JsonData phoneSendCode(String phone) {
        // 手机号三重校验
        JsonData jsonData = tripleCheck(phone);
        if (jsonData.getCode() != 0) {
            return jsonData;
        }
        // 自定义验证码
        String vCode = RevenueUtil.getVCode();
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKey, accessSecret);
        IAcsClient client = new DefaultAcsClient(profile);
        // 组装请求
        CommonRequest request = buildRequest(phone, vCode);
        try {
            CommonResponse response = client.getCommonResponse(request);
            JSONObject smsRes = JSONObject.parseObject(response.getData());
            String ok = "OK";
            String code = "Code";
            if (smsRes.get(code).equals(CODE_ERROR)) {
                return JsonData.buildResult(BizCodeEnum.REVENUE_MSG_SEND_NUM_OUT);
            }
            if (ok.equals(smsRes.get(code))) {
                log.info("send sms success: " + vCode);
                // 放入缓存,登录时校验,过期时间2分钟
                redisTemplate.opsForValue().set(phone, vCode, 120, TimeUnit.SECONDS);
            } else {
                log.error("send sms failed: " + smsRes.get("Message"));
                return JsonData.buildResult(BizCodeEnum.REVENUE_MSG_SEND_FAIL);
            }
        } catch (Exception e) {
            return JsonData.buildResult(BizCodeEnum.REVENUE_MSG_SEND_FAIL);
        }
        return JsonData.buildSuccess();
    }
  1. 用到的方法
    a. 校验手机号
/**
     * 手机号正则
     */
    private static final Pattern PHONE_PATTERN = Pattern.compile("^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$");
  /**
     * 手机号格式校验
     *
     * @return
     */
    public static Boolean validatePhone(String phone) {
        if (null == phone || "".equals(phone)) {
            return false;
        }
        Matcher m = PHONE_PATTERN.matcher(phone);
        return m.matches();
    }
b. 组装请求
/**
     * 构建 CommonRequest
     *
     * @param phone
     * @param vCode
     * @return
     */
    private CommonRequest buildRequest(String phone, String vCode) {
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain(domain);
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", signName);
        request.putQueryParameter("TemplateCode", templateCode);
        request.putQueryParameter("TemplateParam", "{\"code\":" + vCode + "}");
        return request;
    }
  1. 附加
    代码中使用到Redis存储,用于控制验证码两分钟失效
// 放入缓存,登录时校验,过期时间2分钟
redisTemplate.opsForValue().set(phone, vCode, 120, TimeUnit.SECONDS);

总结

接口逻辑并不复杂,主要能看得懂接口文档和相关配置就行

有哪里有问题欢迎指正

下一篇:【微信小程序 - 工作实战分享】2.微信小程序相关信息获取并且登录

相关文章
|
5月前
|
安全 API Python
详解手机状态查询API实战指南
手机状态查询API是一款高效接口,可实时识别手机号状态(实号、空号、风险号等),帮助企业筛选有效号码,提升业务触达率与客户体验。
637 0
|
3月前
|
缓存 小程序 前端开发
商城/点餐/家政类小程序源码合集_微信抖音小程序源码开发从入门到精通实战
本文系统讲解如何利用现有源码快速开发商城、点餐、家政类微信/抖音小程序,涵盖环境搭建、核心功能实现、多平台部署与优化,提供完整技术方案。实战导向,助力开发者高效入门与落地。
|
3月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
7月前
|
JSON 监控 小程序
微信百度字节小程序包过大解决方案(实战经验总结)-优雅草卓伊凡|果果|小无
微信百度字节小程序包过大解决方案(实战经验总结)-优雅草卓伊凡|果果|小无
807 14
微信百度字节小程序包过大解决方案(实战经验总结)-优雅草卓伊凡|果果|小无
|
10月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
703 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
10月前
|
小程序 测试技术 数据安全/隐私保护
微信公众号接口测试实战指南
微信公众号接口测试是确保系统稳定性和功能完整性的重要环节。本文详细介绍了测试全流程,包括准备、工具选择(如Postman、JMeter)、用例设计与执行,以及常见问题的解决方法。通过全面测试,可以提前发现潜在问题,优化用户体验,确保公众号上线后稳定运行。内容涵盖基础接口、高级接口、微信支付和数据统计接口的测试,强调了功能验证、性能优化、安全保护及用户体验的重要性。未来,随着微信生态的发展,接口测试将面临更多挑战和机遇,如小程序融合、AI应用和国际化拓展。
|
12月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
Discuz! X3.5插件云诺-阿里云短信手机登录 会员登录后也无法查看附件图片的问题解决方法
Discuz! X3.5插件云诺-阿里云短信手机登录 会员登录后也无法查看附件图片的问题解决方法
253 2
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
3439 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
JavaScript 小程序 开发者
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
2213 0