栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

二. IHOME (GoWeb项目 短信验证)

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二. IHOME (GoWeb项目 短信验证)

目录

0. 前提

1. 获取验证码

1.1 申请用户验证码服务

1.2 短信验证码服务

1.2.1 微服务之短信验证码

1.2.1 将短信验证码集成到项目


0. 前提

 完成图片验证码部分后,继续进行短信注册工作

1. 获取验证码

1.1 申请用户验证码服务

在这里我们选择阿里云验证码服务(因为阿里云验证码可以一条一条购买)

 注册账号并实名认证,并选择免费开通

 进入短信服务并绑定测试手机号,这里我们用测试模板与测试签名(因为申请挺麻烦的,个人项目测试无需申请),在此之前可以充值1元用作之后测试费用。

 点击右上角个人头像,进行AccessKey配置

创建AccessKey,保存好AccessKey ID 和 AccessKey Secret 之后供项目使用。

回到短信服务页面 ,点击右侧OpenAPI开发者门户

选择发送短信,GO语言,可以看到完整SDK  

1.2 短信验证码服务

1.2.1 微服务之短信验证码

我们同样可以将短信验证码服务如同图片验证码一样,创建一个微服务

cd service
micro new user // 用于创建user微服务,为之后用户注册登录等服务
cd user
make init

修改密码本 —— proto文件

// 修改 Call --- SendSms。  删除 Stream、PingPong 函数。
// 删除 除 Request、Response 之外的其他 message 消息体。
// 根据传入、传出修改 Request、Response 
syntax = "proto3";

package user;

option go_package = "./proto;user";

service User {
	rpc SendSms(Request) returns (Response) {}
}
message Request {
	string phone = 1;
	string imgCode = 2;
	string uuid = 3;
}
message Response {
	string errno = 1;
	string errmsg = 2;
}

 终端运行make proto

PS. 每次微服务make proto之后都要将相应修改的文件ihome/proto(如果没有的话创建此文件夹,用于存放微服务proto文件,用于微服务和后端分离的情况)

创建proto文件夹,之后再proto文件夹下创建user, 并将user微服务的proto文件夹下所有文件复制过来,如图所示

修改 service/user/main.go

package main

import (
	"ihome/service/user/handler"
	"ihome/service/user/model"
	pb "ihome/service/user/proto"

	"github.com/asim/go-micro/plugins/registry/consul/v3"
	service "github.com/asim/go-micro/v3" // "github.com/micro/micro/v3/service"
	"github.com/asim/go-micro/v3/logger"  // "github.com/micro/micro/v3/service/logger"
	"github.com/asim/go-micro/v3/registry"
)

func main() {

	consulReg := consul.NewRegistry(
		registry.Addrs(":8500"),
	)

	srv := service.NewService(
		service.Name("user"),
		service.Registry(consulReg),
		service.Version("latest"),
		service.Address("127.0.0.1:12342"),
	)
	// Register handler
	_ = pb.RegisterUserHandler(srv.Server(), new(handler.User))

	// Run service
	if err := srv.Run(); err != nil {
		logger.Fatal(err)
	}
}

在发送短信验证码之前,我们通常会进行图片验证码的检测服务,因此我们在发送短信之前,要先校验图片验证码

在service/user下创建model文件夹,并将主目录下model文件夹内所有文件拷贝过来

为了方便我们访问redis,我们初始化 Redis连接池,在modelFunc.go 添加

var RedisPool redis.Pool

func InitRedis() {
	RedisPool = redis.Pool{
		MaxIdle:         20,
		MaxActive:       50,
		MaxConnLifetime: 60 * 5,
		IdleTimeout:     60,
		Dial: func() (redis.Conn, error) {
			return redis.Dial("tcp", "192.168.233.131:6379")
		},
	}
}

之后可以通过RedisPool.Get () 创建Redis连接

service/user/main.go 中 调用 InitRedis() 

在main函数下第一行添加 model.InitRedis()

在modelFunc.go 下添加函数用于图片验证码的校验

func CheckImgCode(uuid, imgCode string) bool {
	conn := RedisPool.Get()
	defer conn.Close()

	code, err := redis.String(conn.Do("get", uuid))
	if err != nil {
		fmt.Println("redis.String err: ", err)
		return false
	}
	return code == imgCode
}

修改 service/user/handler/user.go

func (e *User) SendSms(ctx context.Context, req *user.Request, rsp *user.Response) error {

	if model.CheckImgCode(req.Uuid, req.ImgCode) {
		client, err := utils.CreateClient(tea.String("Your AccessKey"), tea.String("Your AccessKey Secert"))
		if err != nil {
			fmt.Println("CreateClient err: ", err)
		}
		rand.Seed(time.Now().Unix())
		smsCode := fmt.Sprintf("%06d", rand.Int31n(1000000))

		sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
			SignName:      tea.String("阿里云短信测试"),
			TemplateCode:  tea.String("SMS_154950909"),
			PhoneNumbers:  tea.String(req.Phone),
			TemplateParam: tea.String(`{"code":"` + smsCode + `"}`),
		}
		
		_, err = client.SendSms(sendSmsRequest)
		if err != nil {
			rsp.Errno = utils.RECODE_SMSERR
			rsp.Errmsg = utils.RecodeText(utils.RECODE_SMSERR)
		} else {
			rsp.Errno = utils.RECODE_OK
			rsp.Errmsg = utils.RecodeText(utils.RECODE_OK)
			err = model.SaveSmsCode(req.Phone, smsCode)
			if err != nil {
				rsp.Errno = utils.RECODE_DBERR
				rsp.Errmsg = utils.RecodeText(utils.RECODE_DBERR)
			}
		}
		// fmt.Printf("respnose id %#v", response)
		fmt.Println("Smscode = ", smsCode)
	} else {
		rsp.Errno = utils.RECODE_DATAERR
		rsp.Errmsg = utils.RecodeText(utils.RECODE_DATAERR)
	}
	return nil
}

 短信验证码微服务及全部完成,之后要将短信验证码服务整合到项目中

1.2.1 将短信验证码集成到项目

在main.go添加

r1.GET("api/v1.0/smscode/:phone", controller.GetSmscd)

//GetSmscd是我们之后将要使用的控制发送短信的函数

我们发现session、imagecode/:uuid、smscode/:phone有共同的前缀/api/v1.0/

因此优化main函数如下:

r1 := router.Group("/api/v1.0/")
	{
		r1.GET("session", controller.GetSession)
		r1.GET("imagecode/:uuid", controller.GetImageCd)
		r1.GET("smscode/:phone", controller.GetSmsCd)
    }

之后,编辑controller/user.go, 建立GetSmscd函数

func GetSmsCd(ctx *gin.Context) {
	phone := ctx.Param("phone") // 获取web端填入的手机号
    
    // 获取图片验证码信息,只有图片验证码正确才进行发送信息服务
	imgCode := ctx.Query("text") // 获取图片验证码
	uuid := ctx.Query("id") // 获取图片uuid
    
    // 调用consul微服务
	consulReg := consul.NewRegistry()

	consulService := service.NewService(
		service.Registry(consulReg),
	)
    
    // 创建新的微服务客户端,用于发送短信
	newClient := userMicro.NewUserService("user", consulService.Client())
	resp, err := newClient.SendSms(context.TODO(), &userMicro.Request{Phone: phone, ImgCode: imgCode, Uuid: uuid})
	if err != nil {
		fmt.Println("newClient.SendSms err: ", err)
		return
	}
    
	ctx.JSON(http.StatusOK, resp)
}

我们发现每次调用consul都会有以下部分

consulReg := consul.NewRegistry()

    consulService := service.NewService(
        service.Registry(consulReg),
    )

因此,我们将其写入工具文件

在utils文件下创建,utils.go文件用于写工具类

编辑utils.go

package utils

import (
	"github.com/asim/go-micro/plugins/registry/consul/v3"
	service "github.com/asim/go-micro/v3"
)

func InitMicro() service.Service {
	consulReg := consul.NewRegistry()

	return service.NewService(
		service.Registry(consulReg),
	)
}

 优化GetSmscd函数,之前函数也可以进行同样优化,这里不再展示

func GetSmsCd(ctx *gin.Context) {
	phone := ctx.Param("phone")

	imgCode := ctx.Query("text")
	uuid := ctx.Query("id")

	consulService := utils.InitMicro()

	newClient := userMicro.NewUserService("user", consulService.Client())
	resp, err := newClient.SendSms(context.TODO(), &userMicro.Request{Phone: phone, ImgCode: imgCode, Uuid: uuid})
	if err != nil {
		fmt.Println("newClient.SendSms err: ", err)
		return
	}

	ctx.JSON(http.StatusOK, resp)
}
  • 测试:

    • 保证 consul、service的 main.go web的main.go 、redis服务 启动。

    • 浏览器 —— 注册 —— 获取短信验证码

    • 成功:

      • 手机收到 验证码

      • 打开浏览器检查模式(Google右键选择Inspect)选择Network —— Respose —— 可以看到“成功”信息

      • 打开 redis 数据库。 多 “手机号_code” 为 key 值的 一条数据。

        • get “手机号_code” 取值 == 手机收到 验证码

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990881.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号