Android 个人开发者接入支付功能

如果是公司的产品,那么也就不存在问题了,Ping++对所有支付做了一个集成。如果开发者个人想接入支付系统,这个申请过程几乎是不大可能的。而Bmob为广大开发人员提供的统一、正规的收费手段,让没有企业认证的个人开发者,也能通过支付宝和微信向用户收费。但是有一个缺点,支持的渠道少,只支持支付宝和微信。此外,微信支付还要安装一个插件,用户体验及其不好。

官方的文档在这里Android支付SDK

接入Bomb也很简单,首先下载BmobPay_Sdk_V1.0.2a.zip

将Lib中的四个jar文件拷到项目中的libs目录下,将plugin目录中的assets拷到项目的main目录下。如图

声明权限

    <!-- alipay sdk permission begin -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- alipay sdk permission end -->

由于微信支付需要安装它的插件,所以如果在root的设备上我们希望能够静默安装,否则使用正常的安装方式,静默安装需要一个权限。

    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />

在AndroidManifest.xml的Application标签下添加以下内容,声明组件

 <!-- bmob pay sdk activity begin ,please put below code into application tag -->
        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" >
        </activity>

        <activity
            android:name="com.bmob.pay.tool.PayActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent" />
        <!-- bmob pay sdk activity end -->

在您的应用程序主Activity的onCreate中调用如下方法:(Application ID在后台应用管理的 数据浏览->应用信息->应用密钥->Application ID)

private BmobPay bmobPay = null;
BmobPay.init(context,"你的Application ID");
bmobPay = new BmobPay(MainActivity.this);

调用支付宝支付

bmobPay.pay(0.01, "某商品","这里是商品描述", new PayListener() {
    @Override
    public void orderId(String s) {
        orderId = s;
        Toast.makeText(MainActivity.this, "订单号:" + s, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void succeed() {
        Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void fail(int i, String s) {
        Toast.makeText(MainActivity.this, "支付失败:" + s, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void unknow() {
        Toast.makeText(MainActivity.this, "未知", Toast.LENGTH_SHORT).show();
    }
});

调用微信支付,微信支付需要安装插件,我们首先尝试进行静默安装,如果返回异常,则进行正常安装。我们需要编写一个工具类

public class PackageUtils {

    public static String moveFileFromAssetsToSdcard(Context context, String fileName) {
        return moveFileFromAssetsToSdcard(context,fileName,fileName);
    }
    public static String moveFileFromAssetsToSdcard(Context context, String fileName, String tempName) {
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            is = context.getAssets().open(fileName);
            File file = new File(Environment.getExternalStorageDirectory()
                    .getPath() + "/" + tempName);
            file.createNewFile();
            fos = new FileOutputStream(file);
            byte[] temp = new byte[1024];
            int i = 0;
            while ((i = is.read(temp)) > 0) {
                fos.write(temp, 0, i);
            }
            return file.getAbsolutePath();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
    /**
     * install slient
     *
     * @param context
     * @param filePath
     * @return 0 means normal, 1 means file not exist, 2 means other exception error
     */
    public static int installSlient(Context context, String filePath) {
        File file = new File(filePath);
        if (filePath == null || filePath.length() == 0 || (file = new File(filePath)) == null || file.length() <= 0
                || !file.exists() || !file.isFile()) {
            return 1;
        }

        String[] args = {"pm", "install", "-r", filePath};
        ProcessBuilder processBuilder = new ProcessBuilder(args);

        Process process = null;
        BufferedReader successResult = null;
        BufferedReader errorResult = null;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder errorMsg = new StringBuilder();
        int result;
        try {
            process = processBuilder.start();
            successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
            errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String s;
            while ((s = successResult.readLine()) != null) {
                successMsg.append(s);
            }
            while ((s = errorResult.readLine()) != null) {
                errorMsg.append(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
            result = 2;
        } catch (Exception e) {
            e.printStackTrace();
            result = 2;
        } finally {
            try {
                if (successResult != null) {
                    successResult.close();
                }
                if (errorResult != null) {
                    errorResult.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (process != null) {
                process.destroy();
            }
        }
        if (successMsg.toString().contains("Success") || successMsg.toString().contains("success")) {
            result = 0;
        } else {
            result = 2;
        }
        Log.e("installSlient", "successMsg:" + successMsg + ", ErrorMsg:" + errorMsg);
        return result;
    }

    public static void installNormal(Context context, String fileName) {
        File file = new File(fileName);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(Uri.parse("file://" + file),
                "application/vnd.android.package-archive");
        context.startActivity(intent);

    }

需要将assets目录下的插件拷到文件系统中,然后调用静默安装方法,如果返回0,则安装成功,否则调用正常安装方法。我们可以在微信支付的回调函数中判断是否安装过插件。

bmobPay.payByWX(0.01, "某商品","这里是商品描述", new PayListener() {
    @Override
    public void orderId(String s) {
        orderId = s;
        Toast.makeText(MainActivity.this, "订单号:" + s, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void succeed() {
        Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void fail(int i, String s) {
        if (i == -3) {
            Toast.makeText(MainActivity.this, "未安装支付插件,正在准备安装" + s, Toast.LENGTH_SHORT).show();
            String tempFile = PackageUtils.moveFileFromAssetsToSdcard(MainActivity.this, "BmobPayPlugin.apk");
            Log.e("TAG", "installFile:" + tempFile);
            int installResult = PackageUtils.installSlient(MainActivity.this,tempFile);
            Log.e("TAG", "installResult:" + installResult);
            if(installResult!=0){
                PackageUtils.installNormal(MainActivity.this,tempFile);
            }
            Toast.makeText(MainActivity.this, "插件安装成功!" + s, Toast.LENGTH_SHORT).show();
            return ;
        }
        Toast.makeText(MainActivity.this, "支付失败:" + s, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void unknow() {
        Toast.makeText(MainActivity.this, "未知", Toast.LENGTH_SHORT).show();
    }
});

支付过程中会生成一个订单,该订单开发者需要自己进行存储,可以用该订单号进行查询支付状态

bmobPay.query(orderId, new OrderQueryListener() {
    @Override
    public void succeed(String s) {
        Toast.makeText(MainActivity.this, "查询结果:" + s, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void fail(int i, String s) {
        Toast.makeText(MainActivity.this, "查询失败:" + s, Toast.LENGTH_SHORT).show();
    }
});

succeed回调说明查询成功(并不是说支付成功),返回的status有NOTPAY和SUCCESS两种可能,只有返回SUCCESS才说明支付成功。

支付过程中可能会返回错误码,常见的错误码如下

还有一点需要注意的就是

当上一次支付操作尚未完成时,如果BmobPay对象发起再次请求,PayListener会回调fail方法返回并10077错误码,以免生成多个订单

如果使用过程中出现了阻塞(比如异常强制关闭支付插件页面,会导致一直不能再发起请求,这是小概率事件),则调用此方法进行BmobPay的重置

仅对下一次请求生效,而不是永久消除限制。

如果你想查询订单的详细信息,可以使用GET请求,使用Bomb的Restful API发起查询,返回结果是一个json字符串,详细内容如下

效果图

后台订单查询

源码下载

http://download.csdn.net/download/sbsujjbcy/9143253

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 09:29:29

Android 个人开发者接入支付功能的相关文章

互联网产品接入支付功能如何测试?

互联网产品接入支付功能如何测试? 现在有不少测试朋友做的项目中,可能也会涉及到支付相关的功能.比如:做商城的,做游戏的以及其他在线交易的网站.APP等.如果支付出了问题,或者用户拿少的钱通过篡改请求数据购买大金额的商品,如果是实物的话,发货前还有可能被发现.如果是虚拟商品话费.游戏币等就有可能造成损失. 所以,不管是实物也好,虚拟商品也好,涉及到支付功能时,大家在测试的过程中一定要重视,否则,会造成很大损失.之前可能大家也都看到过或者听过一个bug损失4.6亿美金的惨痛教训或者身边也有发生过其他

互联网产品接入支付功能如何测试?__(支付功能网上搜集资料)

那么,问题来了,对于支付模块的相关测试,我们应该如何进行呢?比如,针对游戏来说,使用第三方支付往游戏充值游戏币功能,看起来是不是很简单,大家主要思考下以下内容: 1.支付都是与第三方支付(支付宝.微信.财付通.QQ钱包.短信支付等)进行对接,那么,是否了解了第三方接口有哪些?是否都能清楚我们的产品与第三方是如何交互的?是否能画出流程图? 2.异常场景有哪些? 3.有哪些风险,如何规避? 第三方支付的流程,与商户的对接方式基本相似,大同小异.(题外推荐:如下流程图使用的chrome插件:Gliff

Android开发:app工程集成银联支付功能(服务器端)

一功能描述 二实现过程 1下载银联支付SDK和Demo 1银联商家服务地址httpsopenunionpaycomajwebindex 2下载的文件如下 2集成过程 1先试官方Demo 2集成到自己的工程里 一.功能描述 因为是自己开发了一个app应用,没资格去申请微信支付和支付宝支付,于是就采用了银联支付功能,银联支付分为了两种环境:测试环境和生产环境,一般前期开发的时候都是使用测试环境,数据都是测试数据,不会发生真实交易.第一次做Android项目+IDE为Android Studio+第一

安卓快速集成支付功能

做过支付功能的安卓开发者都知道,在接入支付宝时,步骤相当繁琐,而且需有商家账号方可测试,对于个人开发者来说,很难做到,而本篇博客中介绍的一第三方支付SDK,其中集成了支付宝和微信支付功能,而且使用起来相当方便,是个人开发者的福音(有点打广告的嫌疑,不过本人是站在纯技术角度考虑问题的),官方开发文档: http://docs.bmob.cn/androidpay/index.html?menukey=fast_start&key=start_android_pay 集成过程: 1.登录本SDK官方

SDK接入(2)之Android Google Play内支付(in-app Billing)接入

SDK接入(2)之Android Google Play内支付(in-app Billing)接入 继上篇SDK接入(1)之Android Facebook SDK接入整理完Facebook接入流程之后,再来整理下Google Play in-app Billing支付的接入流程.众所周知,Google Play是Google Android官方的应用商店,也是将应用发布到世界各地一个重要的渠道.支付作为盈利的一个重要手段,可以借助Google in-app Billing api来达到目的.

Android 支付宝以及微信支付快速接入流程

简介 随着移动支付的普及,越来越多的App采用第三发支付,在这里我们以支付宝为例,做一个快速集成! 一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:https://open.alipay.com/platform/home.htm 支付宝首页 这里 有两个需要注意的地方 一个是管理中心,另外一个是我的支付宝 管理中心: 管理中心 管理中心 我们需要 创建一个应用 提交给支付宝进行审核. 我的支付宝: 在这里我的支付宝 是一个商户版,一会我们会需要在

Android开发:app工程集成银联支付功能(客户端)

Android开发:app工程集成银联支付功能(客户端) email:[email protected] 上一篇博文完成了服务器端的集成,可参考: Android开发:app工程集成银联支付功能(服务器端).这一篇博文完成客户端的集成. 一.功能描述 银联支付流程如下所示: 上一篇尝试了tn的获取,本篇将跑通整个流程. 二.实现部分 先说一下我的IDE是as(Android Studio)+win7 64位 2.1配置,依旧是配置 按照官方说明文档,就可以完成,我在这里贴上结构图,因为as的特殊

手机网站和App如何接入支付宝简易版支付功能PHP版

接入支付宝准备工作:(关于账号可以是个体商户也可以是企业账号但必须有营业执照) 1.登录蚂蚁金服开放平台  2.创建应用,应用分类网页应用和移动应用.应用提交审核审核通过后得到Appid才能调用相应的接口权限 3.添加功能:一般有扫码付,电脑网站支付,手机网站支付,APP支付.看你的需求什么.移动应用选择APP支付或者是扫码付,而网页应用分为移动端和PC端. 4.商户签约 需要提交相关的资料 一般是要求你提供你的网站地址和APP包等要求 按照支付宝要求来签约相关的支付功能 5.配置你的应用开发配

iOS接入支付宝(支付功能)

前几天做好的支付宝,进行一下总结  只是实现了支付功能. 1. 先说需要导入的东西 上面的那俩是因为我想偷懒  就直接倒的他的了,注意的是路径问题 自己集成支付宝SDK时的错误 这个是路径错误, 解决办法:在自己工程文件夹里建一个文件夹,随便起什么名字.把支付宝所需要的东西都拷贝进去,然后add files,然后找到TARGETS-Build Settings,在里面找到如下位置 把自己新建的文件夹拖动到这个框里面,再次运行就OK了.(当初困扰了我好久...) 2. 需要哪些自己的东西 因为我是