uniapp手机号授权
时间: 2025-01-16 19:25:52 浏览: 42
### UniApp 实现手机号授权方法
#### 获取必要权限和配置
为了实现在 UniApp 中的手机号授权,需先完成准备工作。这涉及注册微信开放平台并获得开发者认证[^2]。一旦审批通过,则可以创建移动应用,并在此过程中获取 `AppId` 和 `Secret` 参数。
#### 前端部分:请求用户同意发送电话号码
在前端代码中,使用 UniApp 提供的方法来发起对用户的手机号码请求:
```javascript
// 调用微信接口获取本机号码
const getPhoneNumber = async () => {
try {
const res = await uni.login({
provider: 'weixin',
onlyAuthorize: true,
});
let encryptedData;
let iv;
// 用户点击按钮触发此事件处理函数
function onGetPhoneNumber(e) {
if (e.detail.errMsg === "getPhoneNumber:ok") {
encryptedData = e.detail.encryptedData;
iv = e.detail.iv;
console.log('Encrypted Data:', encryptedData);
console.log('IV:', iv);
sendToServer(encryptedData, iv); // 将加密数据传送到服务器解密
} else {
console.error('User denied phone number permission');
}
}
return {res, onGetPhoneNumber};
} catch (error) {
console.error(error);
}
}
```
上述代码片段展示了如何调用 `uni.login()` 来启动登录流程,并定义了一个回调函数用于捕获当用户授予访问其手机信息许可后的响应。
#### 后端部分:解密收到的数据
后端接收到从前端发来的加密资料后,利用从微信公众平台上得到的应用凭证 (`AppId`, `Secret`) 对这些资料进行解密操作。以下是基于 Java 的 Spring Boot 解决方案的一部分伪代码表示形式:
```java
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@PostMapping("/decryptPhone")
public String decryptPhone(@RequestBody Map<String, Object> body){
String appId = System.getenv("WX_APP_ID");
String appSecret = System.getenv("WX_APP_SECRET");
String sessionKey = getSessionKey(appId, appSecret, (String)body.get("code"));
WXBizDataCrypt wc = new WXBizDataCrypt(appId, sessionKey);
JSONObject resultJson = null;
try{
String rawData = (String)body.get("rawData");
String signature = (String)body.get("signature");
String encryptData = (String)body.get("encryptData");
String ivStr = (String)body.get("iv");
String decryptedData = wc.decrypt(encryptData , ivStr);
resultJson = JSON.parseObject(decryptedData);
}catch(Exception e){
log.error("Error while decrypting data", e);
}
return resultJson.toJSONString();
}
private static String getSessionKey(String appId, String secret, String jsCode){
RestTemplate restTemplate = new RestTemplate();
final String url = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code";
ResponseEntity<Map> responseEntity =
restTemplate.postForEntity(url.replace("{0}",appId).replace("{1}",secret).replace("{2}",jsCode),null,Map.class);
Map<String,Object> resultMap = responseEntity.getBody();
return (String)resultMap.getOrDefault("session_key","");
}
}
```
这段代码实现了接收来自客户端的 POST 请求,其中包含了由小程序 SDK 加密过的用户个人信息(包括手机号),并通过官方 API 接口交换出有效的 Session Key 进行后续的信息解析过程[^1]。
阅读全文
相关推荐

















