微信支付宝支付

This commit is contained in:
YangYuhao 2023-07-17 16:47:44 +08:00
parent 6c5f3bfd47
commit 88bf23398b
7 changed files with 341 additions and 292 deletions

View File

@ -1,6 +1,5 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:circle_app/app/call_out/logic.dart';
import 'package:circle_app/app/circle/logic.dart';
import 'package:circle_app/app/circle/state.dart';
import 'package:circle_app/app/circle/widgets/list_logic.dart';
@ -159,10 +158,12 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
void pushMsgPage(Lists bean, String cicleId) async {
// if (widget.bean.is_limit) {
// showJoinCiclePiker(cicleId,widget.bean.amount.toString(),widget.bean.oldAmount.toString(),2);
// return;
// }
if (widget.bean.is_limit&&widget.bean.amount>0) {
showJoinCiclePiker(cicleId,widget.bean.amount.toString(),widget.bean.oldAmount.toString(),2,(payResult){
widget.bean.is_limit = false;
});
return;
}
var sp = await SharedPreferencesHelper.getInstance();
String myUserId = sp.getMyUserId();
@ -181,29 +182,8 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
@override
Widget build(BuildContext context) {
TextSpan descSpan;
// widget.bean.intro = widget.bean.intro+widget.bean.intro+widget.bean.intro+widget.bean.intro+widget.bean.intro;
TextSpan span;
if (widget.bean.intro.length > 20) {
String truncatedText = widget.bean.intro.substring(0, 60)+"...";
descSpan = TextSpan(
text: truncatedText,
style: TextStyle(color: Colors.white, fontSize: 10.sp),
);
span = TextSpan(
text: '查看更多',
style: TextStyle(color: Color(0xFFFF4DF6), fontSize: 10.sp),
);
} else {
descSpan = TextSpan(
text: widget.bean.intro,
style: TextStyle(color: Colors.white, fontSize: 10.sp),
);
span = TextSpan(
text: '',
style: TextStyle(color: Color(0xFFFF4DF6), fontSize: 10.sp),
);
}
List<JoinUser> urlList = widget.bean.lastJoinUsers;
List<Widget> widgets = [];
@ -272,7 +252,7 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
margin: EdgeInsets.only(bottom: 7.sp),
width: Get.width,
height: 30.sp,
child: HideText(text: widget.bean.intro,additionText: '查看更多',maxLines: 2,style: TextStyle(color: Colors.white, fontSize: 10.sp),additionStyle: TextStyle(color: Color(0xFFFF4DF6), fontSize: 10.sp),onTap: () {
child: HideText(text: widget.bean.intro,additionText: '查看更多',maxLines: 2,style: TextStyle(color: Colors.white, fontSize: 10.sp),additionStyle: TextStyle(color: const Color(0xFFFF4DF6), fontSize: 10.sp),onTap: () {
_showTextContentDialog(
context, widget.bean.intro);
},),
@ -538,11 +518,10 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
double picHeight = 0.0;
int type = 0;
if (lists.album != null) {
if (lists.album!.isNotEmpty) {
Album info = lists.album!.first!;
type = info.type!;
Album info = lists.album!.first;
if (info.type == 1) {
if (lists.album!.length > 3) {
@ -615,7 +594,7 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
}
if (widget.bean.is_limit) {
showJoinCiclePiker(widget.bean.id.toString(),widget.bean.amount.toString(),widget.bean.oldAmount.toString(),1,(payResult){
widget.bean.is_limit = false;
});
return;
}
@ -713,7 +692,7 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
child: picHeight == 140.sp
? ClipRRect(
borderRadius: BorderRadius.circular(6.sp),
child: VideoItemWidget(lists.album![0]!.url!))
child: VideoItemWidget(lists.album![0].url!))
: GridView.builder(
itemCount: lists.album!.length,
physics: const NeverScrollableScrollPhysics(),
@ -822,12 +801,9 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
);
double picHeight = 0.0;
int type = 0;
if (lists.album != null) {
if (lists.album!.isNotEmpty) {
Album info = lists.album!.first!;
type = info.type!;
Album info = lists.album!.first;
if (info.type == 1) {
if (lists.album!.length > 3) {
@ -843,7 +819,7 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
List<Widget> widgets = [];
int index = 0;
lists!.chat!.users!.forEach((element) {
lists.chat!.users!.forEach((element) {
widgets.add(Positioned(
left: 12.sp * index,
child: GestureDetector(
@ -911,9 +887,9 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
Get.toNamed(AppRoutes.UserInfoActivity, arguments: "");
return;
}
if (widget.bean.is_limit) {
if (widget.bean.is_limit&&widget.bean.amount > 0) {
showJoinCiclePiker(widget.bean.id.toString(),widget.bean.amount.toString(),widget.bean.oldAmount.toString(),1,(payResult){
widget.bean.is_limit = false;
});
return;
}
@ -931,7 +907,7 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
lists.user!.avatar!,
width: 40.sp,
height: 40.sp,
fit: BoxFit.fill,
fit: BoxFit.cover,
),
)
],
@ -946,7 +922,7 @@ class _InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClie
Row(
children: [
Text(
lists.user!.nickname! ?? '',
lists.user!.nickname!,
style: TextStyle(
color: Colors.white,
fontSize: 18.sp,

View File

@ -117,7 +117,7 @@ class ReportPage extends StatelessWidget {
),
Positioned(
// right: 1.sp,
top: 160.sp,
top: 150.sp,
child: Text(
'${controller.textEditingController.text.length}/200',
style: TextStyle(

View File

@ -1,6 +1,6 @@
import 'dart:io';
import 'dart:math';
import 'package:alipay_kit/alipay_kit.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -10,18 +10,19 @@ import '../../network/api.dart';
import '../../network/dio_manager.dart';
import '../../util/PaymentUtils.dart';
import 'open_vip_tip/logic.dart';
bool isZfbPrice = true;
joiinCircileTipWdiget(String cicleId,String pirce,String oldPrice,String title,MyCallback myCallback) {
return StatefulBuilder(
builder:(BuildContext context, StateSetter setState) {
joiinCircileTipWdiget(String cicleId, String pirce, String oldPrice,
String title, MyCallback myCallback) {
return StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
return Scaffold(
backgroundColor: Colors.transparent,
body: Container(
width: Get.width,
height: Get.height,
alignment: Alignment.center,
child:
Stack(
child: Stack(
alignment: Alignment.center,
children: [
Container(
@ -67,7 +68,9 @@ joiinCircileTipWdiget(String cicleId,String pirce,String oldPrice,String title,M
color: Color.fromRGBO(247, 250, 250, 0.8),
fontSize: 12.sp)),
)),
Positioned(
Platform.isIOS
? Container()
: Positioned(
bottom: 108.sp,
child: Container(
margin: EdgeInsets.only(top: 24.0.sp),
@ -149,13 +152,15 @@ joiinCircileTipWdiget(String cicleId,String pirce,String oldPrice,String title,M
),
),
),
Positioned(
bottom: 18.sp,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
unlockingPayment(myCallback);
onTap: () {
if (Platform.isIOS) {
} else {
unlockingPayment(cicleId, myCallback);
}
},
child: Container(
width: 168.sp,
@ -204,48 +209,52 @@ joiinCircileTipWdiget(String cicleId,String pirce,String oldPrice,String title,M
],
),
),
);
});
}
unlockingPayment(MyCallback myCallback)async{
unlockingPayment(String cicleId, MyCallback myCallback) async {
if (isZfbPrice) {
var data = await DioManager.instance.post(url: Api.postAliPayOrder, params: {
//"product_id": priceBean[index].id,
"type": 1});
var bean = BaseResponse<PayUrlBean>.fromJson(data, (data) => PayUrlBean.fromJson(data));
if(bean.isSuccess()){
var data = await AlipayKitPlatform.instance.pay(
orderInfo: bean.data.payUrl,
isShowLoading :true
);
}else {
var data = await DioManager.instance.post(
url: Api.postAliPayOrder, params: {"product_id": cicleId, "type": 1});
var bean = BaseResponse<PayUrlBean>.fromJson(
data, (data) => PayUrlBean.fromJson(data));
if (bean.isSuccess()) {
openAliPay(bean.data.payUrl, (isSuccess, errorMsg) {
if (isSuccess) {
myCallback(true);
}
});
// showToast(data.toString());
} else {
showToast(bean.msg);
}
} else{
initWxApi();
var data = await DioManager.instance.post(url: Api.postWxOrder, params: {
// "product_id": priceBean[index].id,
"type": 1});
var bean = BaseResponse<PaymentData>.fromJson(data, (data) => PaymentData.fromJson(data));
if(bean.isSuccess()){
openWxPay(bean.data);
}else {
} else {
var data = await DioManager.instance
.post(url: Api.postWxOrder, params: {"product_id": cicleId, "type": 1});
var bean = BaseResponse<PaymentData>.fromJson(
data, (data) => PaymentData.fromJson(data));
if (bean.isSuccess()) {
openWxPay(bean.data, (bool isSuccess, String? errorMessage) {
if (isSuccess) {
myCallback(true);
} else {
// errorMessage null
}
});
} else {
showToast(bean.msg);
}
}
}
}
typedef void MyCallback(bool payResult);
showJoinCiclePiker(String cicleId,String pirce,String oldPrice,int type,MyCallback payResult) {
String title = ['解锁圈子才能发布喊话','解锁圈子才能查看主页','解锁圈子才能主动私聊'][type];
showJoinCiclePiker(String cicleId, String pirce, String oldPrice, int type,
MyCallback payResult) {
String title = ['解锁圈子才能发布喊话', '解锁圈子才能查看主页', '解锁圈子才能主动私聊'][type];
return Get.bottomSheet(
joiinCircileTipWdiget(cicleId,pirce,oldPrice,title,payResult),
joiinCircileTipWdiget(cicleId, pirce, oldPrice, title, payResult),
isScrollControlled: true,
enableDrag: false
);
enableDrag: false);
}

View File

@ -1,6 +1,4 @@
import 'dart:convert';
import 'package:alipay_kit/alipay_kit.dart';
import 'package:circle_app/util/util.dart';
import 'package:get/get.dart';
@ -8,7 +6,6 @@ import '../../../network/api.dart';
import '../../../network/dio_manager.dart';
import '../../../util/PaymentUtils.dart';
import 'state.dart';
import 'package:fluwx/fluwx.dart' as fluwx;
class Open_vip_tipLogic extends GetxController {
List<PriceBean> priceBean = [];
@ -33,20 +30,28 @@ class Open_vip_tipLogic extends GetxController {
var data = await DioManager.instance.post(url: Api.postAliPayOrder, params: {"product_id": priceBean[index].id, "type": 2});
var bean = BaseResponse<PayUrlBean>.fromJson(data, (data) => PayUrlBean.fromJson(data));
if(bean.isSuccess()){
AlipayKitPlatform.instance.pay(
orderInfo: bean.data.payUrl,
isShowLoading :true
);
openAliPay(bean.data.payUrl,(isSuccess,errorMsg){
if (isSuccess) {
//
} else {
// errorMessage null
}
});
}else {
showToast(bean.msg);
}
} else{
initWxApi();
var data = await DioManager.instance.post(url: Api.postWxOrder, params: {"product_id": priceBean[index].id, "type": 2});
var bean = BaseResponse<PaymentData>.fromJson(data, (data) => PaymentData.fromJson(data));
if(bean.isSuccess()){
openWxPay(bean.data);
openWxPay(bean.data,(bool isSuccess, String? errorMessage) {
if (isSuccess) {
//
} else {
// errorMessage null
}
});
}else {
showToast(bean.msg);
}
@ -55,13 +60,6 @@ class Open_vip_tipLogic extends GetxController {
}
//
void initWxApi() {
fluwx.registerWxApi(
appId: "wx6c6f4c89465dac4b",
universalLink: "dcc5bd5012a417eb585684700fbd1307",
);
}

View File

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -117,7 +119,7 @@ class Open_vip_tipPage extends StatelessWidget {
controller, controller.index == 2, 2),
],
))),
Positioned(
Platform.isIOS ? Container(): Positioned(
bottom: 108.sp,
child: Container(
margin: EdgeInsets.only(top: 24.0.sp),
@ -200,7 +202,12 @@ class Open_vip_tipPage extends StatelessWidget {
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
if( Platform.isIOS){
}else{
controller.startPayment();
}
},
child: Container(
width: 168.sp,

View File

@ -2,6 +2,7 @@
import 'package:circle_app/app/splash/binding.dart';
import 'package:circle_app/router/app_pages.dart';
import 'package:circle_app/router/app_routers.dart';
import 'package:circle_app/util/PaymentUtils.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -60,6 +61,7 @@ class _MyAppState extends State<MyApp> {
@override
void initState() {
initIM();
initWxApi();
loadBgImage();
super.initState();
}

View File

@ -1,17 +1,35 @@
import 'dart:async';
import 'package:alipay_kit/alipay_kit.dart';
import 'package:circle_app/util/util.dart';
import '../common/Widgets/open_vip_tip/logic.dart';
import 'package:fluwx/fluwx.dart' as fluwx;
//
void initWxApi() {
fluwx.registerWxApi(
appId: "wx6c6f4c89465dac4b",
universalLink: "dcc5bd5012a417eb585684700fbd1307",
);
}
//
Future<void> openWxPay(PaymentData data) async {
//
typedef WxPayCallback = void Function(bool isSuccess, String? errorMessage);
Future<void> openWxPay(PaymentData data, WxPayCallback callback) async {
//
bool isInstalled = await fluwx.isWeChatInstalled;
if (!isInstalled) {
showToast("请先安装微信");
callback(false, "请先安装微信");
return;
}
//
//
fluwx.payWithWeChat(
appId: data.appId,
partnerId: data.mchId,
@ -21,12 +39,51 @@ Future<void> openWxPay(PaymentData data) async {
timeStamp: int.parse(data.timestamp),
sign: data.sign,
);
//
//
fluwx.weChatResponseEventHandler.listen((event) {
if(event.isSuccessful) {
if (event.isSuccessful) {
showToast("微信支付成功");
callback(true, null);
} else {
showToast(event.errStr??"微信支付成功");
showToast(event.errStr ?? "微信支付失败");
callback(false, event.errStr);
}
});
}
late final StreamSubscription<AlipayResp> _paySubs;
///
/// 9000 result有值
/// 8000
/// 4000
/// 5000
/// 6001
/// 6002
void _listenPay(AlipayResp resp) {
final String content = 'pay: ${resp.resultStatus} - ${resp.result}';
if(resp.resultStatus == 9000){
callback(true,resp.result);
}else{
callback(false,resp.result);
}
print(content );
}
late WxPayCallback callback ;
openAliPay(String payUrl,WxPayCallback myCallback)async{
callback = myCallback;
bool isInstalled =await AlipayKitPlatform.instance.isInstalled();
if (!isInstalled) {
showToast("请先安装支付宝");
return;
}
if(null==_paySubs){
_paySubs = AlipayKitPlatform.instance.payResp().listen(_listenPay);
}
var data = await AlipayKitPlatform.instance.pay(
orderInfo: payUrl,
isShowLoading :true
);
}