flutter web微信h5支付接入

1.在web目录下微信支付js文件,如图:

2.编写支付js文件,如下:
//微信支付
function onBridgeReady(appId,timeStamp,nonceStr,packageValue,signType,paySign){
   window.WeixinJSBridge.invoke(
   'getBrandWCPayRequest', {
       "appId":appId,     //公众号ID,由商户传入
       "timeStamp":timeStamp,         //时间戳,自1970年以来的秒数
       "nonceStr":nonceStr, //随机串
       "package":packageValue,
       "signType":signType,         //微信签名方式:
       "paySign":paySign //微信签名
   },
   function(res){
       ///dart提供的方法,通过js调用wxPayOperate来实现js与dart的通信
       wxPayOperate(res.err_msg);

});
}
function toPay(appId,timeStamp,nonceStr,packageValue,signType,paySign){
           //下面是解决WeixinJSBridge is not defined 报错的方法
           if (typeof WeixinJSBridge == "undefined") {//微信浏览器内置对象。参考微信官方文档
               if (document.addEventListener) {
                   document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
               } else if (document.attachEvent) {
                   document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
                   document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
               }
           } else {
               onBridgeReady(appId,timeStamp,nonceStr,packageValue,signType,paySign);

           }
}

//切记回调的地址不能携带# 微信不支持!!!!

3.创建并编写wxPay.dart
import 'dart:js' as js;

import 'package:get/get.dart';
import '../http/HttpConfig.dart';
import 'package:url_launcher/url_launcher.dart';

class WxPay {
  factory WxPay() => _instance;

  static late final WxPay _instance = WxPay._internal();

  WxPay._internal() {}

  void wxCourseAuthorize(String orderId) {
//url:HttpConfig.wxUrl为微信授权登录地址 HttpConfig.baseUrl为项目部署的访问域名
//path=后拼接的为授权登录成功后回调访问的页面,以及携带的参数,此处只携带了订单号,一般为支付结果页
//切记回调的地址不能携带# 微信不支持!!!!
    final url =
        '${HttpConfig.wxUrl}?path=${HttpConfig.baseUrl}/web?orderId=$orderId';
//此处利用的get框架,关闭之前弹出的支付弹窗
    Get.back();
//利用url_launcher跳转微信支付
    launchUrl(Uri.parse(url), webOnlyWindowName: '_self');
      }

  toPay(String appId, String timeStamp, String nonceStr, String packageValue,
      String signType, String paySign) {
    //调用js的函数来执行想要的操作
    js.context.callMethod(
        "toPay", [appId, timeStamp, nonceStr, packageValue, signType, paySign]);
  }
}

3.支付弹窗点击支付时调用

  Future goPay() async {
    //传入之前生成的订单号,或者自己定义的其他参数
    WxPay().wxCourseAuthorize(orderNum);
  }
4.支付结果页回调地址处理

由于微信支付回调地址不支持#,而flutter生成的地址带有#,如何去除请参考我的另一篇博客

回调的地址要访问的支付结果页有两种方式,任意一种都可以

4.1 在项目初始页 比如welcome页面中 根据路由参数,中转访问,比如:

import 'package:flutter/material.dart';
import 'package:get/get.dart';

/// 第一次欢迎页面
class RouteWelcomeMiddleware extends GetMiddleware {
  // priority 数字小优先级高
  @override
  int? priority = 0;

  RouteWelcomeMiddleware({required this.priority});

  @override
  RouteSettings? redirect(String? route) {
    String temp = '';
    if (route != null && route.contains('?')) {
      temp = route!.split('?')[1];
    }
    if (Get.parameters["orderId"] != null &&
        Get.parameters["orderId"]!.isNotEmpty) {
        //带有订单参数中转到支付结果页
      return RouteSettings(name: '${AppRoutes.payResult}?$temp');
    } else {
        //正常跳转
    }
  }
}

4.2 另一种在web目录下创建指定访问的目录,创建index.html,拼接#号重定向至指定页面

5.支付结果页监听授权结果,并支付

import 'package:get/get.dart';
import '../../../global.dart';
import 'dart:js' as js;

class PayResultLogic extends StateLogic<Repo> {
  final state = PayResultState();

  @override
  void onReady() {
    super.onReady();
    if (state.result != 0) {
      return;
    }
    _getPay();
  }

  Future _getPay() async {
    js.context["wxPayOperate"] = wxPayOperate;
//调用服务器接口根据订单号与openid获取支付信息
   final payInfo = await repo.getPrepayOrder(
        Get.parameters['orderId']!, Get.parameters['openid']!);
//支付信息获取支付
    WxPay().toPay(
        payInfo.wxParam!.appid!,
        payInfo.wxParam!.timestamp!,
        payInfo.wxParam!.noncestr!,
        payInfo.wxParam!.packageValue!,
        payInfo.wxParam!.signType!,
        payInfo.wxParam!.sign!);
  }

  ///给js 提供回调的方法
  wxPayOperate(String callbackStr) {
    if (callbackStr == "get_brand_wcpay_request:ok") {
    //刷新页面,显示支付结果
      state.result = 1;
    } else {
      toastInfo(msg: '支付失败!');
      state.result = -1;
    }
  }

}

state.result是个 rxint值,用来刷新支付结果页的显示

class PayResultState {
  final _result = 0.obs; //0支付中 1支付成功 -1 支付失败

  int get result => _result.value;

  set result(v) => _result.value = v;
}

创作不易,望多多支持

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过flutterwebview_flutter插件,我们可以在应用中嵌入支付宝和微信支付,并实现支付功能。使用webview_flutter的步骤如下: 1. 首先,在`pubspec.yaml`文件中引入webview_flutter插件。可以在dependencies部分添加`webview_flutter: ^2.0.0`,然后运行`flutter pub get`命令进行依赖安装。 2. 在需要嵌入支付功能的页面中,导入webview_flutter插件。在页面的顶部引入`import 'package:webview_flutter/webview_flutter.dart';`。 3. 在页面的主体中,创建一个WebView组件,并指定需要加载的URL。例如,在Container中使用WebView组件,可以使用如下代码: ```dart Container( child: WebView( initialUrl: 'https://www.alipay.com/', javascriptMode: JavascriptMode.unrestricted, ), ) ``` 4. 在支付宝和微信支付的URL中,传递相关的支付参数,例如订单号、支付金额等。 5. 在WebView组件中,可以通过注册一个JavaScript channel来监听网页中的支付回调信息。例如,在页面初始加载完成后,可以通过使用`onPageFinished`回调方法来执行一段JavaScript代码,监听支付结果。在该代码中,可以通过调用与原生平台交互的方法,将支付结果返回到Flutter中进行处理。 6. 在Flutter中,可以根据支付结果展示相关的提示信息,例如支付成功、支付失败等。 需要注意的是,支付宝和微信支付的具体接口和参数可能会根据版本的更新而有所变化,所以在代码实现中需要根据最新的文档进行调整。同时,为了确保支付过程的安全性,建议在应用中对支付接口进行适当的安全设置,例如使用HTTPS协议,并对支付参数进行加密处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值