微信小程序之短信验证码

目录

1、前提

2、开通静态

2.1、点击云开发中更多->静态网站

2.2、点击开通,使用管理员验证即可

3、短信发送规则

3.1、短信内容

3.2、短信规则

3.3、短信内容长度计算规则

3.4、短信内容规范

3.5、短信发送记录查询

3.6、调用方式

4、云调用

 4.1、接口方法

4.2、请求参数

4.3、返回值

4.4、异常

4.5、代码示例

4.6、 回复结果

5、添加小程序的链接

5.1、添加链接

5.1.1、上传文件

5.1.2、把网站配置的索引文件名称改为上传文件名

5.1.3、打开【未登录用户权限开关】

 5.1.4、短信发送的代码

 5.1.5、设置成功

5.2、URL Scheme

5.2.1、新建云服务函数

6、注意事项 

7、官方文件路径整理


1、前提

  • 1,注册企业小程序,目前个人小程序无法使用短信发送
  • 2,开通静态网站功能
  • 3,开通云开发

2、开通静态

2.1、点击云开发中更多->静态网站

2.2、点击开通,使用管理员验证即可

开通完成界面

3、短信发送规则

详情请见:微信官方文档-sendSms

3.1、短信内容

        短信由签名和正文内容组成:短信签名是位于短信正文前【】中的署名,小程序发送短信时,签名为小程序名称。

  • 正文内容是由短信模板和变量构成,例:{1},跳转小程序 {2} 回 T 退订,模板参数中 {1},{2} 是变量:
  • {1} :用户可自定义传入的内容,当前最长为30个字。
  • {2} :用户传入的静态托管的地址,例如 /action/index.html?action=double12。 示例:【云开发】能力上新,跳转小程序 https://tcbe.cn/VcdrUJK0 回 T 退订

3.2、短信规则

  1. 短信发送能力的体验是每个有免费配额的环境首月100条,如有超过额度的需求可购买短信资源包。
  2. 营销类短信发送时间:8:00 - 22:00,通知类短信发送时间:全天;通知类短信不可包含营销内容
  3. 发送国内短信的号码是1069开头,尾数是运营商随机号的号码。

3.3、短信内容长度计算规则

  • 短信长度(字数)=短信签名字数+短信内容字数;
  • 汉字、字母、数字、标点符号(不区分全角/半角)以及空格等,都按1个字计算;
  • 国内短信长度(签名+正文)不超过70字时,按照1条短信计费;超过70字即为长短信时,按67字/条分隔成多条计费。

例如,短信长度为150字,则按照67字/67字/16字分隔成3条计费

3.4、短信内容规范

短信内容规范限制

  1. 不支持【】,以免与签名混淆。
  2. 不支持¥、★以及通过按键录入的组合型特殊符号,例如 ^_^&、☞、✓、※ 等,以免引起短信出现乱码。
  3. 禁止发送违法违规相关内容。
  4. 禁止发送未经许可的邀请,主要指邀请注册、邀请成为会员等。
  5. 禁止发送股票、移民、面试招聘、彩票、返利、抽奖、贷款、催款、投资理财、赌博、中奖、毒品、党政、法律维权、众筹、慈善捐款、宗教、迷信、殡葬、刷单、空包网、一元夺宝、一元秒杀、A 货、医疗、整形、美容、会所、酒吧、足浴、暴力、恐吓、色情、皮草、助考、装修(含建材和家私)、商标注册、加群、加 QQ 或者加微信、贩卖个人信息、宣传短信通道、游戏推广、会展推广、网站推广、优惠券类推广、卡类推广、保险推广、信用卡提额、返现返利、代开发票、邀请好评、酒类、用户拉新以及用户召回等类型的短信。

3.5、短信发送记录查询

        前往「微信开发者工具 - 云开发控制台 - 运营分析 - 监控图表 - 短信监控」中查看短信发送记录,当前小程序所有的短信发送记录均可在该记录中查询;

3.6、调用方式

我使用云调用

4、云调用

 4.1、接口方法

openapi.cloudbase.sendSms

4.2、请求参数

属性类型默认值必填说明
envstring环境 ID
phoneNumberListArray.<string>手机号列表,单次请求最多支持 1000 个境内手机号,手机号必须以+86开头
smsTypestringMarketing短信类型,营销类短信:Marketing;通知类短信:Notification
contentstringsms_type="Marketing" 时必填,自定义短信内容,一条短信最多为70个字。可自定义内容最多为 30 个字符,详情参考短信规则
pathstringsms_type="Marketing" 时必填,云开发静态网站 path,不需要指定域名,例如/index.html
templateIdstringsms_type="Notification" 时必填,模版 ID
templateParamListArray.<string>sms_type="Notification" 时必填,短信模版变量数组
useShortNameboolfalse是否使用小程序简称
resourceAppidstring资源方appid,第三方代开发时可填第三方 appid 或小程序appid,应为所填环境所属的账号APPID

4.3、返回值

返回的 JSON 数据包

属性类型说明
errCodenumber错误码
errMsgstring错误信息
sendStatusListArray.<Object>开放数据列表

errCode 的合法值

说明
0成功

sendStatusList 的结构

属性类型说明
serialNostring发送流水号
phoneNumberstring手机号码
codestring短信请求错误码
messagestring短信请求错误码描述
isoCodestring国家码或地区码

4.4、异常

抛出的异常

属性类型说明
errCodenumber错误码
errMsgstring错误信息

errCode 的合法值

说明
-1系统繁忙,此时请开发者稍候再试
-501007参数有误,具体原因参考 errmsg
-601027无效的环境
-601032小程序昵称不能为空
-601033仅支持非个人主体小程序
-607004无效的 URL Link

4.5、代码示例

try {
  SmsStr = '注册码为:123456'
  const SmsResult = await cloud.openapi.cloudbase.sendSms({
    env: 'xxxxxxxx',
    content: SmsStr,
    phoneNumberList: [
      "+86123456789"
    ]
  })
  console.log("SmsResult: ",SmsResult)
} catch (SmsErr) {
  console.log("SmsErr: ",SmsErr)
}

4.6、 回复结果

5、添加小程序的链接

 正常刚才发送的信息,格式是

【小程序名称】自定义文本,跳转小程序(链接,未配置为空),回T退订

我们能够自定义的只有自定义文本,和可以给小程序添加跳转链接,详情见:微信官方文档-云开发短信跳小程序

短信跳转小程序的步骤就是:

  1. 短信跳转到网页,
  2. 网页跳转到小程序

        所有你需要准备一个网页代码,用于短信跳转,官方文档给了一个 jump-mp.html文件模板:官方文档 

        你需要准备一个云函数,用于网页访问之后并跳转

5.1、添加链接

界面路径:云开发->更多->静态网址

 正常如下,为空的

5.1.1、上传文件

        使用的官方的jump-mp.html,注意里面的replace记得替换,openWeapp中的name和data记得跟云函数对应

官方文档内容:

<html>
  <head>
    <title>打开小程序</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
    <script>
      window.onerror = e => {
        console.error(e)
        alert('发生错误' + e)
      }
    </script>
    <!-- weui 样式 -->
    <link rel="stylesheet" href="https://res.wx.qq.com/open/libs/weui/2.4.1/weui.min.css"></link>
    <!-- 调试用的移动端 console -->
    <!-- <script src="https://cdn.jsdelivr.net/npm/eruda"></script> -->
    <!-- <script>eruda.init();</script> -->
    <!-- 公众号 JSSDK -->
    <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
    <!-- 云开发 Web SDK -->
    <script src="https://res.wx.qq.com/open/js/cloudbase/1.1.0/cloud.js"></script>
    <script>
      function docReady(fn) {
        if (document.readyState === 'complete' || document.readyState === 'interactive') {
          fn()
        } else {
          document.addEventListener('DOMContentLoaded', fn);
        }
      }

      docReady(async function() {
        var ua = navigator.userAgent.toLowerCase()
        var isWXWork = ua.match(/wxwork/i) == 'wxwork'
        var isWeixin = !isWXWork && ua.match(/micromessenger/i) == 'micromessenger'
        var isMobile = false
        var isDesktop = false
        if (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|IEMobile)/i)) {
          isMobile = true
        } else {
          isDesktop = true
        }

        if (isWeixin) {
          var containerEl = document.getElementById('wechat-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'wechat-web-container')

          var launchBtn = document.getElementById('launch-btn')
          launchBtn.addEventListener('ready', function (e) {
            console.log('开放标签 ready')
          })
          launchBtn.addEventListener('launch', function (e) {
            console.log('开放标签 success')
          })
          launchBtn.addEventListener('error', function (e) {
            console.log('开放标签 fail', e.detail)
          })

          wx.config({
            // debug: true, // 调试时可开启
            appId: '小程序 AppID', // <!-- replace -->
            timestamp: 0, // 必填,填任意数字即可
            nonceStr: 'nonceStr', // 必填,填任意非空字符串即可
            signature: 'signature', // 必填,填任意非空字符串即可
            jsApiList: ['chooseImage'], // 必填,随意一个接口即可 
            openTagList:['wx-open-launch-weapp'], // 填入打开小程序的开放标签名
          })
        } else if (isDesktop) {
          // 在 pc 上则给提示引导到手机端打开
          var containerEl = document.getElementById('desktop-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'desktop-web-container')
        }  else {
          var containerEl = document.getElementById('public-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'public-web-container')
          var c = new cloud.Cloud({
            // 必填,表示是未登录模式
            identityless: true,
            // 资源方 AppID
            resourceAppid: '小程序 AppID', // <!-- replace -->
            // 资源方环境 ID
            resourceEnv: '云开发环境 ID', // <!-- replace -->
          })
          await c.init()
          window.c = c

          var buttonEl = document.getElementById('public-web-jump-button')
          var buttonLoadingEl = document.getElementById('public-web-jump-button-loading')
          try {
            await openWeapp(() => {
              buttonEl.classList.remove('weui-btn_loading')
              buttonLoadingEl.classList.add('hidden')
            })
          } catch (e) {
            buttonEl.classList.remove('weui-btn_loading')
            buttonLoadingEl.classList.add('hidden')
            throw e
          }
        }
      })

      async function openWeapp(onBeforeJump) {
        var c = window.c
        const res = await c.callFunction({
          name: 'public',
          data: {
            action: 'getUrlScheme',
          },
        })
        console.warn(res)
        if (onBeforeJump) {
          onBeforeJump()
        }
        location.href = res.result.openlink
      }
    </script>
    <style>
      .hidden {
        display: none;
      }

      .full {
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
      }

      .public-web-container {
        display: flex;
        flex-direction: column;
        align-items: center;
      }

      .public-web-container p {
        position: absolute;
        top: 40%;
      }

      .public-web-container a {
        position: absolute;
        bottom: 40%;
      }

      .wechat-web-container {
        display: flex;
        flex-direction: column;
        align-items: center;
      }

      .wechat-web-container p {
        position: absolute;
        top: 40%;
      }

      .wechat-web-container wx-open-launch-weapp {
        position: absolute;
        bottom: 40%;
        left: 0;
        right: 0;
        display: flex;
        flex-direction: column;
        align-items: center;
      }

      .desktop-web-container {
        display: flex;
        flex-direction: column;
        align-items: center;
      }

      .desktop-web-container p {
        position: absolute;
        top: 40%;
      }
    </style>
  </head>
  <body>
    <div class="page full">
      <div id="public-web-container" class="hidden">
        <p class="">正在打开 “填入你的小程序名称”...</p> <!-- replace -->
        <a id="public-web-jump-button" href="javascript:" class="weui-btn weui-btn_primary weui-btn_loading" onclick="openWeapp()">
          <span id="public-web-jump-button-loading" class="weui-primary-loading weui-primary-loading_transparent"><i class="weui-primary-loading__dot"></i></span>
          打开小程序
        </a>
      </div>
      <div id="wechat-web-container" class="hidden">
        <p class="">点击以下按钮打开 “填入你的小程序名称”</p> <!-- replace -->
        <!-- 跳转小程序的开放标签。文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html -->
        <wx-open-launch-weapp id="launch-btn" username="小程序原始账号 ID(gh_ 开头的)" path="要跳转到的页面路径"> <!-- replace -->
          <template>
            <button style="width: 200px; height: 45px; text-align: center; font-size: 17px; display: block; margin: 0 auto; padding: 8px 24px; border: none; border-radius: 4px; background-color: #07c160; color:#fff;">打开小程序</button>
          </template>
        </wx-open-launch-weapp>
      </div>
      <div id="desktop-web-container" class="hidden">
        <p class="">请在手机打开网页链接</p>
      </div>
    </div>
  </body>
</html>

另外如果只是做跳转试验,但是不能跳转到小程序,使用下面官方给的模板文件即可,跳转到小程序其实是需要重新编辑这个文档的(我的理解是这样的,不知道是不是自己哪里没有弄对)

  window.onload = function(){
    window.web2weapp.init({
      appId: 'wx999999', //替换为自己小程序的AppID
      gh_ID: 'gh_999999',//替换为自己小程序的原始ID
      env_ID: 'tcb-env',//替换小程序底下云开发环境ID
      function: {
        name:'openMini',//提供UrlScheme服务的云函数名称
        data:{} //向这个云函数中传入的自定义参数
      },
      path: 'pages/index/index.html' //打开小程序时的路径
    })
  }

 

5.1.2、把网站配置的索引文件名称改为上传文件名

我的是jump-mp.html

 此时已经发送的短消息已经存在的链接,但是跳转内容是显示的你jump-mp的内容,不能跳转到小程序,只能跳转到网页

5.1.3、打开【未登录用户权限开关】

路径:云开发->设置->找到未登录用户访问权限->打开

 5.1.4、短信发送的代码

    const SmsResult = await cloud.openapi.cloudbase.sendSms({
      env: 'agsroot-0g83w0dce43785c2',
      content: "发布了短信跳转小程序的新能力",
      path: "/jump-mp.html",
      phoneNumberList: PhoneList
    })

其中的path是静态网站中上传的文件存储路径

 5.1.5、设置成功

此时的短信已经添加了链接

5.2、URL Scheme

        链接的网页在外部浏览器是通过 URL Scheme 的方式来拉起微信打开主体小程序的。

5.2.1、新建云服务函数

        填写一个UrlScheme服务云函数。这个云函数主要用来调用微信服务端能力,获取对应的Scheme信息返回给调用前端。

下载的h5跳转的官方文件如下:

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()

  switch (event.action) {
    case 'getUrlScheme': {
      return getUrlScheme()
    }
  }

  return 'action not found'
}

async function getUrlScheme() {
  return cloud.openapi.urlscheme.generate({
    jumpWxa: {
      path: '/page/component/index', // <!-- replace -->
      query: '',
    },
    // 如果想不过期则置为 false,并可以存到数据库
    isExpire: false,
    // 一分钟有效期
    expireTime: parseInt(Date.now() / 1000 + 60),
    //无需求可以去掉这两个参数(isExpire,expire_time)
  })
}

这里的path就是你需要跳转的小程序界面,比如我的是pages/Main/Main,

注意:

  • name: 'public' 表示云函数名
  • action: getUrlScheme,可有可无,如果你的云函数不判断此处可缺省

这个是jump-mp.html文件中的是对应起来的。如果改动必须两个都改动

    async function openWeapp(onBeforeJump) {
        var c = window.c
        const res = await c.callFunction({
          name: 'public',
          data: {
            action: 'getUrlScheme',
          },
        })
        console.warn(res)
        if (onBeforeJump) {
          onBeforeJump()
        }
        location.href = res.result.openlink
      }

如果都没有配置错的话,现在已经可以跳转并成功了 

6、注意事项 

1、html文件中的openWeapp下的name; ‘public’将public替换的云函数名称

2、html文件中的openWeapp下的action是可以自定义,也可以缺省云函数直接调用

3、每次修改html文件后记得在静态函数中上传文件

4、html点击跳转需要的路径和云函数中jumpWxa调用的路径都为你的界面路径,比如说我的是pages/Main/Main

5、发送短信时的path为静态网址的文件路径,可看上面的短信发送的代码下有说明

6、一定要打开未登录权限开关

7、如果出现跳转失败分析问题

        7.1、查看云函数是否调用,进云函数日志查看,云函数是否调用成功

        7.2、如果云函数调用失败那网页端是正确的,只是云函数中出现了问题,一般都是你的路径设置错误,或者文件的参数未对应

        7.3、如果云函数调用成功还跳转失败,那可能是你的权限问题,记得检查一下自己的权限

        7.4、如果云函数未调用,检查网页端配置,检查一下官方文档需要replace是否都替换

        7.5、如果网页端未正常显示,你的静态网站配置错误,你的网页代码出现了问题

        7.6、如果接收的验证码没有链接,检查静态网站配置和发送的path是否于静态网站不一致

7、官方文件路径整理

        总之,先配置静态网站的网页,设置云函数,将网页和云函数绑定,发送短信时携带网页链接

官方h5跳转:点击下载资源包

短信跳小程序介绍:微信官方文档-短信跳小程序

短信跳小程序教程:微信官方文档-短信跳小程序教程

获取URL Scheme:微信官方文档-获取URL Scheme

URL Scheme调用: 微信官方文档-URL Scheme调用

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值