Forráskód Böngészése

[new]增加微信二维码扫码支付功能

zk 8 hónapja
szülő
commit
c5a7fbbefc

+ 1 - 0
assets/string/base/string.xml

@@ -284,6 +284,7 @@
     <string name="pay_success_title">支付成功</string>
     <string name="pay_success_desc">您的订单已成功支付</string>
     <string name="alipay_qr_code_tips">请使用支付宝扫码支付</string>
+    <string name="wechat_qr_code_tips">请使用微信扫码支付</string>
     <string name="wechat_pay_qr_code_tips">请使用微信扫码支付</string>
     <string name="member_payment_failed">开通失败,请稍后重试</string>
     <string name="exit_app_tip">再按一次退出应用</string>

+ 1 - 1
lib/base/base_request.dart

@@ -109,7 +109,7 @@ class BaseRequest {
   }
 
   void initPackageInfo() {
-    packageName = appInfoUtil.packageName;
+    packageName = 'com.manbu.shouji';
     appVersionName = appInfoUtil.appVersionName;
     appVersionCode = appInfoUtil.appVersionCode;
   }

+ 0 - 4
lib/dialog/alipay_qr_code_dialog.dart

@@ -12,7 +12,6 @@ class AlipayQrCodeDialog {
 
   static void show(
       {required String qrCodeHtml,
-      required String orderId,
       VoidCallback? onDismiss,
       VoidCallback? onCloseCallback,
       VoidCallback? loadSuccessCallback}) {
@@ -23,7 +22,6 @@ class AlipayQrCodeDialog {
         builder: (_) {
           return AlipayQrCodeView(
               qrCodeHtml: qrCodeHtml,
-              orderId: orderId,
               onCloseCallback: onCloseCallback,
               loadSuccessCallback: loadSuccessCallback);
         },
@@ -37,7 +35,6 @@ class AlipayQrCodeDialog {
 
 class AlipayQrCodeView extends Dialog {
   final String qrCodeHtml;
-  final String orderId;
   VoidCallback? loadSuccessCallback;
   VoidCallback? onCloseCallback;
 
@@ -46,7 +43,6 @@ class AlipayQrCodeView extends Dialog {
   AlipayQrCodeView(
       {super.key,
       required this.qrCodeHtml,
-      required this.orderId,
       this.onCloseCallback,
       this.loadSuccessCallback});
 

+ 83 - 0
lib/dialog/wechat_qr_code_dialog.dart

@@ -0,0 +1,83 @@
+import 'dart:ui';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:qr_flutter/qr_flutter.dart';
+
+import '../resource/assets.gen.dart';
+import '../resource/colors.gen.dart';
+import '../resource/string.gen.dart';
+
+class WechatQrCodeDialog {
+  static const String _tag = 'WechatQrCodeDialog';
+
+  static void show(
+      {required String qrCodeUrl,
+      VoidCallback? onDismiss,
+      VoidCallback? onCloseCallback,
+      VoidCallback? loadSuccessCallback}) {
+    SmartDialog.show(
+        tag: _tag,
+        onDismiss: onDismiss,
+        backDismiss: false,
+        builder: (_) {
+          return WechatQrCodeView(
+              qrCodeUrl: qrCodeUrl, onCloseCallback: onCloseCallback);
+        },
+        clickMaskDismiss: false);
+    loadSuccessCallback?.call();
+  }
+
+  static void dismiss() {
+    SmartDialog.dismiss(tag: _tag);
+  }
+}
+
+class WechatQrCodeView extends Dialog {
+  final String qrCodeUrl;
+  VoidCallback? onCloseCallback;
+
+  WechatQrCodeView({super.key, required this.qrCodeUrl, this.onCloseCallback});
+
+  @override
+  Widget build(BuildContext context) {
+    return IntrinsicHeight(
+      child: Column(
+        children: [
+          Container(
+            padding: EdgeInsets.all(26.w),
+            decoration: BoxDecoration(
+              color: Colors.white,
+              borderRadius: BorderRadius.circular(10.w),
+            ),
+            child: Column(
+              children: [
+                SizedBox(
+                    width: 220.w,
+                    height: 220.w,
+                    child: QrImageView(
+                      data: qrCodeUrl,
+                      version: QrVersions.auto,
+                      size: 220.w,
+                      backgroundColor: Colors.white,
+                    )),
+                SizedBox(height: 16.w),
+                Text(StringName.wechatPayQrCodeTips,
+                    style: TextStyle(fontSize: 14.sp, color: ColorName.black90))
+              ],
+            ),
+          ),
+          SizedBox(height: 20.w),
+          GestureDetector(
+              onTap: () {
+                onCloseCallback?.call();
+                WechatQrCodeDialog.dismiss();
+              },
+              child: Assets.images.iconMemberRetainClose
+                  .image(width: 32.w, height: 32.w))
+        ],
+      ),
+    );
+  }
+}

+ 18 - 3
lib/module/member/member_controller.dart

@@ -28,6 +28,7 @@ import '../../data/consts/web_url.dart';
 import '../../dialog/common_confirm_dialog_impl.dart';
 import '../../dialog/loading_dialog.dart';
 import '../../dialog/member_retain_dialog.dart';
+import '../../dialog/wechat_qr_code_dialog.dart';
 import '../../handler/event_handler.dart';
 import '../../resource/string.gen.dart';
 import '../../utils/http_handler.dart';
@@ -267,7 +268,8 @@ class MemberController extends BaseController implements PaymentStatusCallback {
         _onWeChatPay(response.outTradeNo, response.wechatPayPrepayJson!,
             payMethod, buyGoods, buyPayWay);
       } else if (payWayType == PayWayType.paymentWayWechatScan) {
-        _onWechatScanPay();
+        _onWechatScanPay(response.outTradeNo, response.wechatPayQrcodeUrl!,
+            buyPayWay, buyGoods);
       } else if (payWayType == PayWayType.paymentWayAlipay) {
         _onAliPay(response.outTradeNo, response.alipayOrderString!, payMethod,
             buyGoods, buyPayWay);
@@ -300,7 +302,6 @@ class MemberController extends BaseController implements PaymentStatusCallback {
       GoodsBean goodsBean) {
     AlipayQrCodeDialog.show(
         qrCodeHtml: qrHtml,
-        orderId: outTradeNo,
         loadSuccessCallback: () {
           checkPaymentStatus(outTradeNo, paymentWay, goodsBean);
         },
@@ -341,7 +342,21 @@ class MemberController extends BaseController implements PaymentStatusCallback {
     requestSdkPay(payInfo, outTradeNo, payMethod, buyGoods, buyPayWay);
   }
 
-  void _onWechatScanPay() {}
+  void _onWechatScanPay(String outTradeNo, String qrCodeUrl,
+      PayItemBean paymentWay, GoodsBean goodsBean) {
+    WechatQrCodeDialog.show(
+        qrCodeUrl: qrCodeUrl,
+        loadSuccessCallback: () {
+          checkPaymentStatus(outTradeNo, paymentWay, goodsBean);
+        },
+        onCloseCallback: () async {
+          //关闭后再持续查询几秒
+          CustomLoadingDialog.show();
+          await Future.delayed(Duration(seconds: 4));
+          paymentStatusManager.removePollingSubscription(outTradeNo);
+          CustomLoadingDialog.hide();
+        });
+  }
 
   void requestSdkPay(dynamic payInfo, String outTradeNo, int payMethod,
       GoodsBean buyGoods, PayItemBean buyPayWay) {

+ 2 - 0
lib/resource/string.gen.dart

@@ -237,6 +237,7 @@ class StringName {
   static final String paySuccessTitle = 'pay_success_title'.tr; // 支付成功
   static final String paySuccessDesc = 'pay_success_desc'.tr; // 您的订单已成功支付
   static final String alipayQrCodeTips = 'alipay_qr_code_tips'.tr; // 请使用支付宝扫码支付
+  static final String wechatQrCodeTips = 'wechat_qr_code_tips'.tr; // 请使用微信扫码支付
   static final String wechatPayQrCodeTips =
       'wechat_pay_qr_code_tips'.tr; // 请使用微信扫码支付
   static final String memberPaymentFailed =
@@ -482,6 +483,7 @@ class StringMultiSource {
       'pay_success_title': '支付成功',
       'pay_success_desc': '您的订单已成功支付',
       'alipay_qr_code_tips': '请使用支付宝扫码支付',
+      'wechat_qr_code_tips': '请使用微信扫码支付',
       'wechat_pay_qr_code_tips': '请使用微信扫码支付',
       'member_payment_failed': '开通失败,请稍后重试',
       'exit_app_tip': '再按一次退出应用',

+ 16 - 0
pubspec.lock

@@ -984,6 +984,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.0"
+  qr:
+    dependency: transitive
+    description:
+      name: qr
+      sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.2"
+  qr_flutter:
+    dependency: "direct main"
+    description:
+      name: qr_flutter
+      sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097"
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.1.0"
   recase:
     dependency: transitive
     description:

+ 3 - 0
pubspec.yaml

@@ -121,6 +121,9 @@ dependencies:
   #bugly
   flutter_bugly: 1.1.0
 
+  #QR
+  qr_flutter: ^4.1.0
+
   ######################地图########################
   flutter_map:
     path: plugins/map