网站建设项目招标书,seo工具查询,wordpress 钩子开发,做网站和论坛区别使用融云做登录注册思路
注册界面需要name, email, password考虑到融云注册用户的post格式
POST http://api.rong-api.com/user/getToken.json?userId1690544550qqcomnameIronman这里的userId可以使用用户的email#xff0c;但是要截断和 . 符号#xff0c;即1690544…使用融云做登录注册思路
注册界面需要name, email, password考虑到融云注册用户的post格式
POST http://api.rong-api.com/user/getToken.json?userId1690544550qqcomnameIronman这里的userId可以使用用户的email但是要截断和 . 符号即1690544550qq.com - 1690544550qqcom, 融云不让我传完整的邮箱地址这里可能要考虑到奇怪的邮箱地址,如fuckerfuckerfucker.edu.cn,我不确定截断后的是fuckerfuckerfuckereducn能不能还原成邮箱地址注册的name传入post 参数的name融云注册返回格式
{code: 200,userId: 1690544550qqcom,token: 测试
}那android注册界面需要检查返回的response的code200和token!null 如果ok注册用户成功登录界面需要email和password, 这里可能还要考虑到自己搭建服务后端来存取用户基本信息(email, password)但是查到融云一条api是关于查询用户信息的
POST http://api.rong-api.com/user/info.json?userId1690544550qqcom接口返回
{code: 200,userName: Ironman,userPortrait: http://abc.com/myportrait.jpg,createTime: 2025-03-05 11:46:49
}现在考虑怎么校验密码那一块, 校验密码能不能本地校验就是注册的时候拿到email和password存到手机本地数据库到登录时需要用userId请求融云用户信息检查code200, 密码就比对本地数据库的email, password一对,好像相对繁琐了登录成功后跳转界面完啦注册的页面还要考虑到验证邮箱地址正确就是发邮箱验证码这不知道怎么入手
todo实现以上思路
1. 使用go语言简单搭建一个邮箱验证码服务邮箱服务来自qq邮箱
后端地址: https://gitee.com/EEPPEE_admin/dont-want-to-write-code-anymore/tree/master/send_code_to_mail配置自己的qqmail 授权码还有自己的发送邮箱地址提供接口
### 发送验证码这里的email是从adnroid客户端注册用户获取
POST http://localhost:8080/send-code?email1876056356qq.com
### 验证验证码, 738702 是验证码有发送验证码获取随机的这里的email是从adnroid客户端注册用户获取
POST http://localhost:8080/verify-code?email1876056356qq.comcode62712. 搭建data层调式邮箱验证码
先启动后端go run main.go创建data/network/EmailVerifyCodeApiService.kt // Base url:https://7f498cbc.r7.cpolar.top
interface EmailVerifyCodeApiService {POST(send-code)fun sendVerificationCode(Query(email) email: String): CallVerifyCodeResponsePOST(verify-code)fun verifyEmailCode(Query(email) email: String,Query(code) code: String): CallVerifyCodeResponse}// 邮箱验证码的返回
data class VerifyCodeResponse(val message: String
)object EmailVerifyCodeApiClient {// todo: 这个base url随时变动根据你的cpolar地址来private const val BASE_URL https://7f498cbc.r7.cpolar.topprivate var apiService: EmailVerifyCodeApiService? nullval emailVerifyCodeApiService: EmailVerifyCodeApiService?get() {if (apiService null) {val client: OkHttpClient OkHttpClient.Builder().build()val retrofit Retrofit.Builder().baseUrl(BASE_URL).client(client).addConverterFactory(GsonConverterFactory.create()).build()apiService retrofit.create(EmailVerifyCodeApiService::class.java)}return apiService}
}测试点击发送邮件事件(这个简单界面代码就不给出了就一个按钮一个EditText使用viewbinding) binding.sendBtn.setOnClickListener {val email binding.emailEt.text.toString().trim()// todo: 处理发送邮箱验证码val apiService EmailVerifyCodeApiClient.emailVerifyCodeApiServiceval call apiService?.sendVerificationCode(email)call!!.enqueue(object : retrofit2.CallbackVerifyCodeResponse {override fun onResponse(call: CallVerifyCodeResponse,response: ResponseVerifyCodeResponse) {Log.d(注册, response.body().toString())Log.d(注册, 发送邮箱验证码成功)}override fun onFailure(call: CallVerifyCodeResponse, t: Throwable) {Log.d(注册, 发送验证码失败)}})}测试邮箱验证码发送通过
3. 调试融云api
创建data/network/RongCloudApiService.kt
// todo: 构建融云api服务, 接口里面的方法可以是suspend和普通函数
/*
普通函数 vs. suspend 函数
普通函数
使用回调Callback或 Call 对象来处理异步请求。
适用于传统的异步编程模型。
代码相对复杂需要处理回调和线程切换。
suspend 函数
使用 Kotlin 协程来处理异步请求。
代码更简洁更接近同步编程风格。
需要结合 CoroutineScope 或其他协程工具来调用。
示例代码*/
interface RongCloudApiService {FormUrlEncodedPOST(user/getToken.json)fun getToken(// 这是x-form形式Field(userId) userId: String, // todo: requiredField(name) name: String ,Field(portraitUri) portraitUri: String ): CallGetTokenResponse// POST(user/info.json)
// fun getRongCloudUserInfo(
// Query(userId) userId: String
// ): ResponseRongCloudUserInfoFormUrlEncodedPOST(user/info.json)fun getUserInfo(Field(userId) userId: String,): CallUserInfoResponse}// user/getToken.json接口的返回
data class GetTokenResponse(val code: Int,val userId: String,val token: String?
)// user/info.json接口的返回
data class UserInfoResponse(val code: Int,val userName: String,val userPortrait: String?,val createTime: String
)object RongCloudApiClient {// 要求不能明文传输改成httpsprivate const val BASE_URL https://api.rong-api.com/private const val APP_KEY 你自己的private const val NONCE 1442907399private const val TIMESTAMP 1741092643private const val SIGNATURE 你自己的private var apiService: RongCloudApiService? null// todo: 获取实例方法val rongIMApiService: RongCloudApiService?get() {if (apiService null) {val client: OkHttpClient OkHttpClient.Builder().addInterceptor(Interceptor { chain -val originalRequest: Request chain.request()val newRequest: Request originalRequest.newBuilder().header(App-Key, APP_KEY).header(Nonce, NONCE).header(Timestamp, TIMESTAMP).header(Signature, SIGNATURE).header(Content-Type, application/x-www-form-urlencoded).build()chain.proceed(newRequest)}).build()val retrofit Retrofit.Builder().baseUrl(BASE_URL).client(client).addConverterFactory(GsonConverterFactory.create()).build()apiService retrofit.create(RongCloudApiService::class.java)}return apiService}
}调试代码,点击一个注册按钮观察Logcat binding.registerBtn.setOnClickListener {val email binding.emailEt.text.toString().trim()Log.d(注册, email)val name binding.nameEt.text.toString().trim()Log.d(注册, name)val password binding.passwordEt.text.toString().trim()Log.d(注册, password)val mailVerifyCode binding.mailVerifycodeEt.text.toString().trim()Log.d(注册, mailVerifyCode)if (name.isEmpty() || email.isEmpty() || password.isEmpty() || mailVerifyCode.isEmpty()) {Toast.makeText(this, 请填充完整信息, Toast.LENGTH_SHORT).show()returnsetOnClickListener}// email 处理成 userIdval processedEmailAsUserId EmailUtil.convertEmailToRongCloudId(email)Log.d(注册, processedEmailAsUserId)// todo 取到接口实例val apiService RongCloudApiClient.rongIMApiService// todo 调用api serviceval call apiService?.getToken(processedEmailAsUserId,name)// todo call 进入队列call!!.enqueue(object : retrofit2.CallbackGetTokenResponse {override fun onResponse(call: CallGetTokenResponse,response: retrofit2.ResponseGetTokenResponse) {Log.d(注册, response.body().toString())//RongCloudTokenResponse(code200, userId13266263124qqcom, tokenSeq1kNg6Uft4UOBPzi2gGqh30okEsnM0kPAf6ohCvgf1vll6L9v54Aptfq.cn.rongnav.com;ptfq.cn.rongcfg.com)}override fun onFailure(call: CallGetTokenResponse, t: Throwable) {Log.d(注册, 获取token失败)}})// todo new call 进入队列val newcall apiService?.getUserInfo(processedEmailAsUserId)newcall!!.enqueue(object : retrofit2.CallbackUserInfoResponse {override fun onResponse(call: CallUserInfoResponse,response: ResponseUserInfoResponse) {Log.d(注册, response.body().toString())// UserInfoResponse(code200, userName好, userPortraithttp://abc.com/myportrait.jpg, createTime2025-03-05 16:51:19)}override fun onFailure(call: CallUserInfoResponse, t: Throwable) {Log.d(注册, 获取用户信息失败)}})}todo还要考虑谷歌和facebook登录情况