分离 API/SDK

This commit is contained in:
v7lin
2021-07-21 11:09:19 +08:00
parent 68febfb33e
commit 5958f60e69
17 changed files with 156 additions and 142 deletions

View File

@ -0,0 +1,119 @@
import 'dart:convert';
import 'dart:io';
import 'package:wechat_kit_example/api/model/wechat_access_token_resp.dart';
import 'package:wechat_kit_example/api/model/wechat_ticket_resp.dart';
import 'package:wechat_kit_example/api/model/wechat_user_info_resp.dart';
class WechatApi {
const WechatApi._();
// --- 微信APP授权登录
/// 获取 access_tokenUnionID
static Future<WechatAccessTokenResp> getAccessTokenUnionID({
required String appId,
required String appSecret,
required String code,
}) {
return HttpClient()
.getUrl(Uri.parse(
'https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=$code&grant_type=authorization_code'))
.then((HttpClientRequest request) {
return request.close();
}).then((HttpClientResponse response) async {
if (response.statusCode == HttpStatus.ok) {
final String content = await utf8.decodeStream(response);
return WechatAccessTokenResp.fromJson(
json.decode(content) as Map<String, dynamic>);
}
throw HttpException(
'HttpResponse statusCode: ${response.statusCode}, reasonPhrase: ${response.reasonPhrase}.');
});
}
/// 刷新或续期 access_token 使用UnionID
static Future<WechatAccessTokenResp> refreshAccessTokenUnionID({
required String appId,
required String refreshToken,
}) {
return HttpClient()
.getUrl(Uri.parse(
'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=$appId&grant_type=refresh_token&refresh_token=$refreshToken'))
.then((HttpClientRequest request) {
return request.close();
}).then((HttpClientResponse response) async {
if (response.statusCode == HttpStatus.ok) {
final String content = await utf8.decodeStream(response);
return WechatAccessTokenResp.fromJson(
json.decode(content) as Map<String, dynamic>);
}
throw HttpException(
'HttpResponse statusCode: ${response.statusCode}, reasonPhrase: ${response.reasonPhrase}.');
});
}
/// 获取用户个人信息UnionID
static Future<WechatUserInfoResp> getUserInfoUnionID({
required String openId,
required String accessToken,
}) {
return HttpClient()
.getUrl(Uri.parse(
'https://api.weixin.qq.com/sns/userinfo?access_token=$accessToken&openid=$openId'))
.then((HttpClientRequest request) {
return request.close();
}).then((HttpClientResponse response) async {
if (response.statusCode == HttpStatus.ok) {
final String content = await utf8.decodeStream(response);
return WechatUserInfoResp.fromJson(
json.decode(content) as Map<String, dynamic>);
}
throw HttpException(
'HttpResponse statusCode: ${response.statusCode}, reasonPhrase: ${response.reasonPhrase}.');
});
}
// --- 微信APP扫码登录
/// 获取 access_token
static Future<WechatAccessTokenResp> getAccessToken({
required String appId,
required String appSecret,
}) {
return HttpClient()
.getUrl(Uri.parse(
'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$appSecret'))
.then((HttpClientRequest request) {
return request.close();
}).then((HttpClientResponse response) async {
if (response.statusCode == HttpStatus.ok) {
final String content = await utf8.decodeStream(response);
return WechatAccessTokenResp.fromJson(
json.decode(content) as Map<String, dynamic>);
}
throw HttpException(
'HttpResponse statusCode: ${response.statusCode}, reasonPhrase: ${response.reasonPhrase}.');
});
}
/// 用上面的函数拿到的 access_token获取 sdk_ticket
static Future<WechatTicketResp> getTicket({
required String accessToken,
}) {
return HttpClient()
.getUrl(Uri.parse(
'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$accessToken&type=2'))
.then((HttpClientRequest request) {
return request.close();
}).then((HttpClientResponse response) async {
if (response.statusCode == HttpStatus.ok) {
final String content = await utf8.decodeStream(response);
return WechatTicketResp.fromJson(
json.decode(content) as Map<String, dynamic>);
}
throw HttpException(
'HttpResponse statusCode: ${response.statusCode}, reasonPhrase: ${response.reasonPhrase}.');
});
}
}