Flutter对接支付宝接口

“ Flutter支付宝接口的对接教程”

对于一个App来说,支付功能是不可获取的一部分,今天,我就来分享一下在Flutter框架中支付宝的APP支付功能的接入过程。本文结构如下:

  1. 支付宝开发平台应用申请

  2. Flutter调用tobias

1.支付宝开发平台应用申请

首先登录支付宝的开放平台,申请一个新的应用,获取应用的APPID。然后进入应用详情,为其添加App支付功能并签约。完成后,对应用进行密钥的配置。具体步骤详见支付宝开放平台的官方文档。

地址:
https://docs.open.alipay.com/204/105297/

2.Flutter调用tobias

对于Flutter来说,进行对接支付宝的过程还是比较简单的,因为在github上有很多大神做的插件,我们今天所用的就是JarvanMo开发的tobias,之所以选用这个插件,是因为这个插件也还是一直在维护的,最近更新时间为8月16号。
地址:
https://pub.flutter-io.cn/packages/tobias

tobias的使用过程还是比较简单的,只需要我们提供个一个支付信息的字符串,其他的操作都由tobias完成。

userId = await Tinker.getuserID();
FormData param = FormData.from({"userId": await Tinker.getuserID()});
final res = await http.post("http://pay.fuful.com/alipay/payInfo");
var data = json.decode(res.body);
var payResult = await tobias.pay(data["rows"]["data"]);

一般来说支付信息都是由服务器端提供的,如上述代码所示就是从服务器端取得的支付信息。
现在网上的一些教程一般到这里也就结束了,但我今天还是在说一些服务器端的信息封装,虽然支付宝的官方文档有写,但我还是总结一些。
首先我们先来写一个支付信息的返回接口,如下:

@RequestMapping(value = "/alipay/payInfo",method = RequestMethod.POST)
    @ResponseBody
    public String payInfo(){
        //系统内部订单号
        String out_trade_no = "1";
        //订单金额
        String total_fee = "1";
        //调用支付宝接口拿到payInfo
        String payInfo = AlipayUtil.createPayInfo("11", total_fee, out_trade_no);
        String returnCode;
        //需要封装成json格式
        if ("error".equals(payInfo)) {
            returnCode = "{\"statusCode\":\"500\",\"size\":\"0\",\"msg\":\"服务端签名失败\"}";
        } else {
            returnCode = "{\"statusCode\":\"200\",\"size\":\"1\",\"rows\":{\"data\":\"" + payInfo + "\"}}";
        }
        return returnCode;
        }

然后我们具体来写AlipayUtil里面的createPayInfo的操作,对于payInfo的生成,我所采用的是支付宝官方sdk的生成方法。具体如下:

 public static String createPayInfo(String userID, String money, String orderNumber) {
        //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", "utf-8", ALIPAY_PUBLIC_KEY, "RSA2");
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody("我是测试数据");
        model.setSubject("App支付测试Java");
        model.setOutTradeNo(getOutTradeNo());
        model.setTimeoutExpress("30m");
        model.setTotalAmount("800.01");
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl(CALLBACK_URL);
        try {
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
            return response.getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return null;
    }

APP_ID是开发平台的你所创建的应用的APPID,APP_PRIVATE_KEY是商户的应用私钥,可以通过支付宝开放平台开发助手创建,ALIPAY_PUBLIC_KEY,是支付宝开发平台所提供的支付宝应用公钥,加密方式采用的RSA-2。
alipayClient.sdkExecute(request);其返回值就是你所需要的payInfo。
前端调用拿到payInfo之后,就可以直接调用tobias的插件了,把payInfo直接传过去。

var payResult = await tobias.pay(data["rows"]["data"]);
    print(payResult);
    FormData open_Vip = FormData.from(
        {"userId": userId, "month": month, "money": money, "type": type});
    if (payResult["resultStatus"] == "9000") {
      Tinker.post("/api/user/openVip", (data) {
        eventBus.fire(new UserLoggedInEvent("10"));
        Navigator.pushAndRemoveUntil(
            context,
            MaterialPageRoute(builder: (context) => TinkerScaffold()),
            (route) => route == null);
      }, params: open_Vip);
    } else {
      Tinker.toast(payResult["memo"]);
    }

通过判断返回的状态码,执行相应的操作,支付宝的支付功能也就对接完成了。

扫描二维码关注公众号,回复: 9237224 查看本文章
发布了3 篇原创文章 · 获赞 3 · 访问量 112

猜你喜欢

转载自blog.csdn.net/qq_37601881/article/details/104363008