sms_recharge_page.dart 10.1 KB
import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fluwx/fluwx.dart';
import 'package:one_key/models/sms_info.dart';
import 'package:one_key/pages/my/sms_recharge_item_page.dart';
import 'package:one_key/provider/sms_recharge_provider.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
import 'package:fluwx/fluwx.dart' as fluwx;
import 'package:crypto/crypto.dart';

class SmsRechargePage extends StatefulWidget {
  final SmsInfoData infoData;
  SmsRechargePage({Key key, this.infoData}) : super(key: key);

  @override
  _SmsRechargePageState createState() => _SmsRechargePageState();
}

class _SmsRechargePageState extends State<SmsRechargePage> {
  ScrollController controller = ScrollController();
  Meals mealsSelected;
  SmsRechargeModel rechargeModel;

  StreamSubscription _wxPay;

  @override
  void initState() {
    super.initState();
    _wxPay = fluwx.weChatResponseEventHandler.listen((res) {
      _wxPay?.cancel();
      if (res is fluwx.WeChatPaymentResponse) {
        print("pay :${res.isSuccessful}");
        if (res.errCode == 0) {
          // Utils.showToast('购买成功');
          bus.emit('refreshSmsNum');

          Navigator.pop(context);
        } else if (res.errCode == -1) {
          Utils.showToast('支付错误');
        } else if (res.errCode == -2) {
          Utils.showToast('您已取消支付');
        }
      }
    });
  }

  void wxSubscriptionClose() => _wxPay?.cancel();

  @override
  void dispose() {
    super.dispose();
    EventBus().emit('changeStatusColor');

    wxSubscriptionClose();
  }

  @override
  Widget build(BuildContext context) {
    rechargeModel = Provider.of<SmsRechargeModel>(context, listen: true);
    return Scaffold(
      backgroundColor: MyColours.color_ffffff,
      appBar: SystemAppBar(
        '短信充值',
        onTap: () {
          Navigator.pop(context);
        },
      ),
      body: Column(
        children: [
          Expanded(
              child: SingleChildScrollView(
                  controller: controller,
                  child: Padding(
                    padding: EdgeInsets.symmetric(
                        horizontal: ScreenUtil().setWidth(40)),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        VEmptyView(40),
                        Text(
                          '短信套餐',
                          style: TextStyle(
                              fontSize: ScreenUtil().setSp(38),
                              fontWeight: FontWeight.bold),
                        ),
                        VEmptyView(30),
                        Text('购买套餐,使用更划算',
                            style: TextStyle(
                                fontSize: ScreenUtil().setSp(28),
                                color: MyColours.color_333333)),
                        ListView.builder(
                          shrinkWrap: true,
                          controller: controller,
                          physics: NeverScrollableScrollPhysics(),
                          padding: EdgeInsets.symmetric(
                              vertical: ScreenUtil().setWidth(40)),
                          itemBuilder: (BuildContext contxt, int index) {
                            return SmsRechargeItemPage(
                                meals: widget.infoData.meals[index],
                                callback: () {
                                  for (Meals item in widget.infoData.meals) {
                                    item.selected = false;
                                  }
                                  setState(() {
                                    widget.infoData.meals[index].selected =
                                        true;
                                    mealsSelected =
                                        widget.infoData.meals[index];
                                  });
                                });
                          },
                          itemCount: widget.infoData.meals.length,
                          scrollDirection: Axis.vertical,
                        )
                      ],
                    ),
                  ))),
          Container(
            height: ScreenUtil().setWidth(160),
            width: double.infinity,
            padding:
                EdgeInsets.symmetric(horizontal: ScreenUtil().setWidth(40)),
            decoration: BoxDecoration(
                border: Border(
                    top: BorderSide(
              width: ScreenUtil().setWidth(2),
              color: MyColours.color_E0E0E0,
            ))),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Expanded(
                    child: Text(
                        mealsSelected == null
                            ? '剩余${widget.infoData.lastNum}条短信,请及时充值以保证正常使用'
                            : '${mealsSelected.price}元',
                        // maxLines: 2,
                        style: mealsSelected == null
                            ? TextStyle(
                                fontSize: ScreenUtil().setSp(28),
                                color: MyColours.color_333333)
                            : TextStyle(
                                fontSize: ScreenUtil().setSp(36),
                                fontWeight: FontWeight.bold))),
                HEmptyView(80),
                RoundButton(
                  radius: ScreenUtil().setWidth(10),
                  text: '购买',
                  fontSize: 34,
                  width: ScreenUtil().setWidth(160),
                  height: ScreenUtil().setWidth(70),
                  textColor: MyColours.color_F0F0F0,
                  onPressed: () async {
                    //是否安装微信
                    bool isInstalled = await fluwx.isWeChatInstalled;
                    if (!isInstalled) {
                      Utils.showToast("请先安装微信");
                      return;
                    }
                    if (mealsSelected == null) {
                      Utils.showToast('请选择您要购买的短信套餐');
                      return;
                    }
                    //1.接口请求微信支付所需参数
                    //2.成功后掉起微信支付
                    Map<String, String> params = {
                      'sellerid': Provider.of<UserModel>(context, listen: false)
                          .user
                          .sellerid,
                      'meal_id': mealsSelected.id,
                      // 'price': '0.01'
                      'price': mealsSelected.price
                    };
                    bool success =
                        await rechargeModel.getWechatPayInfo(context, params);
                    if (success) {
                      print(rechargeModel.sunModel.package.substring(10));
                      Map<String, String> str = {
                        'appid': rechargeModel.sunModel.appId,
                        // 'appid': 'wx85aa3cdd0f791e65',
                        'partnerid': '1489405762',
                        'prepayid':
                            rechargeModel.sunModel.package.substring(10),
                        'timestamp': rechargeModel.sunModel.timeStamp,
                        'noncestr': rechargeModel.sunModel.nonceStr,
                        'package': 'Sign=WXPay',
                        // 'signtype': rechargeModel.sunModel.signType
                      };

                      // String str =
                      // '${rechargeModel.sunModel.appId}\n${rechargeModel.sunModel.timeStamp}\n${rechargeModel.sunModel.nonceStr}\n${rechargeModel.sunModel.package.substring(10)}\n';
                      String sign = Utils.keySort(str);

                      // var content = utf8.encode(signtemp);
                      // String sign = base64Encode(content);
                      print(sign);
                      print(rechargeModel.sunModel.paySign);

                      print('appId${rechargeModel.sunModel.appId}');
                      print(
                          'prepayId${rechargeModel.sunModel.package.substring(10)}');
                      print('nonceStr${rechargeModel.sunModel.nonceStr}');
                      print('timeStamp${rechargeModel.sunModel.timeStamp}');
                      print('sign${sign}');

                      //掉起微信支付
                      fluwx
                          .payWithWeChat(
                        // appId: 'wx85aa3cdd0f791e65',
                        // appId: 'wx71921f840e8f1c34',
                        appId: rechargeModel.sunModel.appId,
                        partnerId: '1489405762',
                        prepayId: rechargeModel.sunModel.package.substring(10),
                        packageValue: 'Sign=WXPay',
                        nonceStr: rechargeModel.sunModel.nonceStr,
                        timeStamp: int.parse(rechargeModel.sunModel.timeStamp),
                        // sign: sign
                        sign: sign,
                        // signType: rechargeModel.sunModel.signType
                        // signType: rechargeModel.sunModel.signType)
                      )
                          .then((data) {
                        print("---》$data");
                      }).catchError((error) {
                        print(error.toString());
                      });
                    } else {
                      print('fffff');
                      //给用户提示错误
                    }
                  },
                  isBold: true,
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}