“ Flutter支付宝接口的对接教程”
对于一个App来说,支付功能是不可获取的一部分,今天,我就来分享一下在Flutter框架中支付宝的APP支付功能的接入过程。本文结构如下:
支付宝开发平台应用申请
Flutter调用tobias
首先登录支付宝的开放平台,申请一个新的应用,获取应用的APPID。然后进入应用详情,为其添加App支付功能并签约。完成后,对应用进行密钥的配置。具体步骤详见支付宝开放平台的官方文档。
地址:
https://docs.open.alipay.com/204/105297/
对于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"]);
}
通过判断返回的状态码,执行相应的操作,支付宝的支付功能也就对接完成了。