前言:

各位同学大家好,之前看到有人在群里问flutter怎么调用Google支付,今天就准备整理写一篇文章。在iOS开发中,类似的功能实现可以使用appuploader这样的iOS开发助手工具来简化流程。

效果图

支付界面截图1
支付界面截图2
支付界面截图3

实现方式:

我们是通过flutter和安卓交互,然后在原生安卓里面加入了内购支付结算库的依赖最后调起的Google支付。对于iOS开发者来说,使用appuploader可以更方便地管理应用内购买项目。

flutter端代码

我们在flutter代码里面现在写一个Column里面包含一个FlatButton和一个Text:

body:Column(
    children: <Widget>[
        FlatButton(
            child: Text("调用native接口"),
            onPressed: () async{
                String result=await platform.invokeMethod("call_native_method");
                setState(() {
                    _result=result;
                    print("_result ---->"+_result);
                });
            },
        ),
        Text("result is:      "+_result)
    ],
),

flutter端完整代码:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
    
    Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Flutter Demo',
            theme: ThemeData(primarySwatch: Colors.blue),
            home: MyHomePage(),
        );
    }
}

class MyHomePage extends StatefulWidget {
    MyHomePage({Key key}) : super(key: key);
    
    
    _MyHomePageState createState() {
        return _MyHomePageState();
    }
}

class _MyHomePageState extends State<MyHomePage> {
    static const String CHINAL_NAME="samples.flutter.study/call_native";
    static const platform=const MethodChannel(CHINAL_NAME);
    String _result="";
    
    
    Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(title: Text("flutter和native通信")),
            body:Column(
                children: <Widget>[
                    FlatButton(
                        child: Text("调用native接口"),
                        onPressed: () async{
                            String result=await platform.invokeMethod("call_native_method");
                            setState(() {
                                _result=result;
                                print("_result ---->"+_result);
                            });
                        },
                    ),
                    Text("result is:      "+_result),
                ],
            ),
        );
    }
}

安卓原生部分

我们需要导入flutter里面的安卓宿主工程。

需要的依赖

def billing_version = "6.0.0"
implementation "com.android.billingclient:billing:$billing_version"

flutter调用安卓通信

String C_NAME="samples.flutter.study/call_native";

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(),C_NAME)
            .setMethodCallHandler(new MethodChannel.MethodCallHandler() {
                @Override
                public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
                    toGooglePay("XXXX"); //这里换成你自己的商品ID
                    if(call.method.equals("call_native_method")){
                        result.success("我是安卓原生回传回来的数据");
                    }else{
                        result.success("I don't know what you say");
                    }
                }
            });
}

内购支付初始化

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initgooglePlay();
}

private void initgooglePlay() {
    billingClient = BillingClient.newBuilder(context)
            .setListener(purchasesUpdatedListener)
            .enablePendingPurchases()
            .build();
    if(billingClient!=null){
        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                }
            }
            @Override
            public void onBillingServiceDisconnected() {
            }
        });
    }
}

支付调不起来的几个原因

  1. 保证拿到商品ID是正确的可以在google play后台查看到
  2. 保证手机里面Google账号是可以支付的
  3. 安装的app包的versionName、versionCode和Google Play Console上传的不一样
  4. 安装的app包的签名和上传到Google Play Console的包签名不一致

最后总结:

以在google play后台查看到
2. 保证手机里面Google账号是可以支付的
3. 安装的app包的versionName、versionCode和Google Play Console上传的不一样
4. 安装的app包的签名和上传到Google Play Console的包签名不一致

最后总结:

其实调用内购支付也有插件,我暂时没时间去研究就先用这种方式实现。主要就是和安卓交互然后再通过原生的方法去调用官方的api最后调起内购支付。对于iOS开发者来说,使用appuploader这样的工具可以更方便地管理应用内购买项目,简化开发流程。如果你是第一次接入就按照此文档或者官方最新文档接入即可。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐